Pular para o conteúdo
Ramos da Informática - Comunidade de Desenvolvedores

Torne-se um desenvolvedor FullStack: Pacote completo de formação desenvolvedor Frontend e Backend utilizando as linguagens de programação e frameworks mais procurados no mercado de trabalho. Mais informações, aqui. Faça o download do E-BookGuia Completo Para Se Tornar um(a) Desenvolvedor(a) Full-Stack, Começando do ZERO”.

Engenheiro de Software, autor de livros sobe tecnologia e negócios. É mantenedor do site Ramos da Informática. Hobbies: investir em ações, natação e finanças.

Engenheiro de Software, autor de livros sobe tecnologia e negócios. É mantenedor do site Ramos da Informática. Hobbies: investir em ações, natação e finanças.

admin

Todos os artigos deste autor

Deploy App Django no Openshift

Chatbots com Whatsapp e Cielo integrados Nesse curso, eu vou te mostrar como o consumidor poder realizar um pagamento por dentro do aplicativo do WhatsApp, aonde o seu cliente vai entrar numa conversa como entraria numa conversa com qualquer pessoa ou com a sua empresa, navegar entre os produtos/serviços em menus simples enviados pelo chatbot, adicionar esses produtos/serviços no carrinho de compras, e num determinado ponto do chat, um link exclusivo é enviado para o cliente preencher os dados do cartão de crédito. No final, a análise é devolvida para o Whatsapp no qual a conversa foi iniciada. Inscreva-se.

Recentemente quis testar o Django no Openshift mas não encontrei nenhum tutorial atualizado sobre o assunto, por isso resolvi escrever um.

Nosso objetivo é ter um app bem básico em Django rodando no Openshift Online.
Eu utilizei o Ubuntu 14.04 nesse tutorial mas excluindo a parte de instalação do programa rhc, ele serve para qualquer sistema unix-like.

O que é?

Openshift Origin é um PaaS opensource mantido pela RedHat.
A empresa também tem um serviço de hospedagem, o Openshift Online, com planos pagos e gratuitos.
No plano gratuito você pode utilizar até três small gears, containers onde a sua aplicação irá rodar.
Cada small gear possui:

512MB de RAM
100MB de swap
1GB de espaço em disco

Em cada gear você pode ter um ou mais cartridges, funcionalidades que sua app poderá utilizar.
Existem cartridges que habilitam uma linguagem (Python, Ruby, Java), um banco de dados (PostgreSQL, MongoDB), um serviço (Cron, MMS), etc.

Criação de conta e login

Você precisa ter uma conta no Openshift Online e o programa rhc instalado em sua máquina.

Crie uma conta gratuita clicando aqui.

Depois instale o programa ruby e o rhc:

sudo apt-get update && apt-get install -y ruby
sudo gem install rhc

Clique aqui para ver como instalar o rhc em outras plataformas.

Faça o login:

rhc setup

Por fim confirme que você consegue conectar em sua conta executando:

rhc apps
No applications. Use ‘rhc create-app’.

Criando um app no Openshift

Crie um app com nome de django usando o cartridge Python 2.7:

rhc create-app -a django -t python-2.7
Application Options
——————-
Domain: stvs
Cartridges: python-2.7
Gear Size: default
Scaling: noCreating application ‘django’done

Waiting for your DNS name to be available … done

Cloning into ‘django’

Your application ‘django’ is now available.

URL: http://django-stvs.rhcloud.com/
SSH to: 5409ae505973ca58d200015e@django-stvs.rhcloud.com
Git remote: ssh://5409ae505973ca58d200015e@django-stvs.rhcloud.com/~/git/django.git/
Cloned to: /home/usuario/django

No retorno do comando podemos ver algumas informações básicas do app, inclusive a URL, que já está funcionando.
Acesse o endereço e veja a página padrão que foi criada.

Definindo dependências

Acesse o repositório que foi criado ao executar rhc app-create, ele terá o nome do seu app:

cd django/

Existem duas formas de definir as dependências do seu app Python no Openshift, pelo arquivo setup.py ou pelo requirements.txt.
Durante o processo de deploy o Openshift automaticamente executa python setup.py install e pip -r requirements.txt na raiz do repositório.

Usaremos somente o requirements.txt, então exclua o setup.py.

rm setup.py

Faça commit mas não execute git push ainda.

git commit -am ‘removido setup.py’

Adicione o Django no requirements.txt:

echo ‘Django==1.7’ > requirements.txt

Crie um virtualenv para testar se o requirements.txt está correto:

pyenv virtualenv 2.7.8 openshift
pyenv activate openshift
pip install -r requirements.txt

Por fim, faça um novo commit.

Criando o projeto Django

De agora em diante não direi mais para você fazer o commit o tempo todo mas é uma boa prática que você o faça a cada etapa.

Execute o comando abaixo para criar o arquivo .gitignore e adicionar algumas entradas nele.
Esse arquivo irá impedir que alguns arquivos desnecessários sejam adicionados ao git.

cat > .gitignore <<EOF
*.pyc
*.sqlite3
EOF

Crie um projeto Django com o nome openshift:

django-admin.py startproject openshift

Acesse o projeto e crie um app com nome exemplo:

cd openshift
django-admin.py startapp exemplo

Execute o migrate inicial e depois inicie o servidor de teste:

python manage.py migrate
python manage.py runserver

Acesse o endereço 127.0.0.1:8000 e verifique se você consegue ver a mensagem It worked!

Configurando o projeto

Ao executar o deploy da sua aplicação, o Openshift irá procurar pelo WSGI entry-point em alguns arquivos.
Um desses arquivos é o wsgi.py na raiz do repositório.
O WSGI entry-point nada mais é do que o callable do servidor WSGI.
No nosso caso usamos uma variável mas poderia ser um método ou uma função, o importante é que ele tenha o nome de application.

Execute o comando abaixo para criar o WSGI entry-point:

cat > wsgi.py <<EOF
#!/usr/bin/pythonimport os
import sys
from django.core.wsgi import get_wsgi_application

sys.path.append(os.path.join(os.environ[‘OPENSHIFT_REPO_DIR’], ‘openshift’))
os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘openshift.production’

application = get_wsgi_application()
EOF

Abra o arquivo de configuração padrão do seu projeto Django:

vi openshift/openshift/settings.py

Adicione o app exemplo em INSTALLED_APPS:

INSTALLED_APPS = (
‘django.contrib.admin’,

‘exemplo’,
)

Salve e depois abra o arquivo de configuração que usaremos em produção.

vi openshift/openshift/production.py

Comece importando todas as configuração do arquivo de configuração padrão:

from settings import *

Desabilite o modo debug:

DEBUG = False

Existem várias variáveis de ambiente dentro de um gear, utilizaremos as seguintes delas em nossa configuração:

OPENSHIFT_APP_DNS: nome completo do domínio da sua aplicação, no meu caso é http://django-stvs.rhcloud.com/.
OPENSHIFT_DATA_DIR: diretório para dados persistentes.
OPENSHIFT_REPO_DIR: diretório onde estão os arquivos do deploy atual.
OPENSHIFT_SECRET_TOKEN: hash gerado automaticamente quando o gear é criado.

Você pode ver outras variáveis disponíveis aqui.

Copie as configurações:

SECRET_KEY = os.environ[‘OPENSHIFT_SECRET_TOKEN’]

ALLOWED_HOSTS = [os.environ[‘OPENSHIFT_APP_DNS’]]

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.sqlite3’,
‘NAME’: os.path.join(os.environ[‘OPENSHIFT_DATA_DIR’], ‘db.sqlite3’),
}
}

Os cartridges padrões de Python, utilizam o diretório wsgi/static para servir arquivos estáticos pelo Apache.
Ele ainda não existe, para criá-lo execute:

mkdir -p wsgi/static
touch wsgi/static/.gitkeep

Por fim adicione a linha abaixo em sua configuração:

STATIC_ROOT = os.path.join(os.environ[‘OPENSHIFT_REPO_DIR’], ‘wsgi’, ‘static’)

Criando uma view simples

Vamos criar uma view básica somente para testar nosso projeto.

Adicione a url abaixo no arquivo openshift/openshift/urls.py:

urlpatterns = patterns(,
url(r‘^$’, ‘exemplo.views.home’, name=‘home’),

Depois crie a view em openshift/exemplo/views.py:

from django.http import HttpResponse

def home(request):
return HttpResponse(‘Hello World!’)

Execute novamente o servidor de teste, acesse o endereço ‘127.0.0.1:8000/’ e confirme que a mensagem Hello World! aparece.

Fazendo deploy

Na raiz do repositório, existe um diretório oculto chamado .openshift.
Vamos listar seu conteúdo:

cd .openshift
tree
.
├── action_hooks
│   └── README.md
├── cron
│   ├── daily
│   ├── hourly
│   ├── minutely
│   ├── monthly
│   ├── README.cron
│   └── weekly
│   ├── chrono.dat
│   ├── chronograph
│   ├── jobs.allow
│   ├── jobs.deny
│   └── README
├── markers
│   └── README.md
└── README.md

Cada diretório dentro dele tem uma função especial.

Cron

Essa pasta serve para agendar a execução de scripts.
Ela funciona igual aos diretórios cron em qualquer distribuição Linux.
Você precisa adicionar o cartridge cron ao seu app para que os agendamentos funcionem.

rhc cartridge add -a django -c cron-1.4

Markers

Nesta pasta você pode criar arquivos que alteram o comportamento do Openshift durante algumas ações.
Por exemplo, se você criar o arquivo hot_deploy o servidor Apache não será reiniciado durante o processo de build.
Outras markers disponíveis estão detalhadas aqui.

Action Hooks

O funcionamento dessa pasta é bem parecido com o da pasta markers.
Em algumas ações o Openshift vai procurar determinados arquivos dentro dela e executá-los em uma determinada ordem.
Para listar quais são as ações disponíveis execute o comando rhc app –help:

rhc app –help
Usage: rhc app <action>Creates and controls an OpenShift application. To see the list of all applications use the rhc domain show command. Note that delete is not reversible
and will stop your application and then remove the application and repo from the remote server. No local changes are made.

List of Actions
configure Configure several properties that apply to an application
create Create an application
delete Delete an application from the server
deploy Deploy a git reference or binary file of an application
force-stop Stops all application processes
reload Reload the application‘s configuration
restart Restart the application
scale-down Scale down the application’s web cartridge
scale-up Scale up the application‘s web cartridge
show Show information about an application
start Start the application
stop Stop the application
tidy Clean out the application’s logs and tmp directories and tidy up the git repo on the server

Por exemplo, na ação build, os arquivos serão procurados e executados na seguinte ordem:

pre_build
build
prepare
deploy
post_deploy

Não é preciso que nenhum arquivo exista, essa é só uma forma de controlar o comportamento do seu app.
Para saber mais sobre action hooks clique aqui.

No nosso caso, só vamos usar o arquivo deploy:

touch .openshift/action_hooks/deploy

É preciso que o arquivo seja executável, então:

chmod +x .openshift/action_hooks/deploy

Em nosso deploy, apenas vamos atualizar o schema do banco e recolher os arquivos estáticos.
Note que precisamos informar o arquivo de configuração que usaremos em produção, que é diferente daquele que está no arquivo manage.py.

cat > .openshift/action_hooks/deploy <<EOF
PYTHONPATH=$OPENSHIFT_REPO_DIR/openshift
django-admin.py migrate –settings=’openshift.production’ –pythonpath=$PYTHONPATH
python $PYTHONPATH/manage.py collectstatic -c –noinput –settings=’openshift.production’ –pythonpath=$PYTHONPATH
EOF

Feito isso, faça commit e depois execute git push.
O push irá disparar o processo de build.
Você verá varias mensagens em seu terminal mas no final irá aparecer:


remote: Git Post-Receive Result: success
remote: Activation status: success
remote: Deployment completed with status: success

Essa saída mostra que o deploy foi executado com sucesso.
Se você acessar a URL da sua app aparecerá ‘Hello World!’.
Pronto seu projeto Django está rodando no Openshift!

Aguardo feedback com dúvidas, sugestões, correções etc nos comentários.

Abraços e bons projetos!

Bonus

Execute o rhc tail para visualizar o arquivos de log do seu app, ótimo para visualizar problemas.
Acesse a documentação oficial para saber mais detalhes sobre o Openshift.
Aqui tem um quickstart de uma base de conhecimento para você utilizar no Openshift.

Este artigo foi importado automaticamente por fazer parte do Planetário Dev. Quer fazer parte deste HUB de conteúdos? Faça parte do Planetário e veja as vantagens.

Não tem site ou blog? Seja um autor do site e ainda pode ser remunerado.

Leia também:

Facebook
LinkedIn
Twitter
Pinterest
Reddit
Telegram
WhatsApp
Email
Print

Relacionados

Deixe uma resposta