DJANGO DEPLOYComo servir e distribuir apps Django em um ambiente
de produção
https://github.com/arturfelipe/django-deploy
Web framework python
full stack
DJANGO DEPLOY
Baterias inclusasDesenvolvimento ágil
E quanto ao deploy?
DJANGO DEPLOY
Como servir a minha aplicação em um ambiente externo?
Pode usar? ./manage.py runserver
DJANGO DEPLOY
Como faço então?
DJANGO DEPLOY Servindo a aplicação
Application ServerWSGI
Web ServerHTTP
DJANGO DEPLOY Web Server (HTTP)
• Muito leve • Ótimo servidor de estáticos (html,css,js,imgs) • Cache • Proxy reverso • Redirects/Rewrites
DJANGO DEPLOY
• Mais leve • Não serve dinâmico • URI Based Interpretation (locations)
•Mais fácil de instalar e configurar
X• Mais pesado • Serve dinâmico • File based interpretation
Web Server (HTTP)
DJANGO DEPLOY
nginx.conf (vitualhost)
upstream minha_app { server 127.0.0.1:8001 fail_timeout=0; }
server { listen 80; server_name minha_app.com.br;
access_log /var/webapps/minha-app/logs/nginx-access.log; error_log /var/webapps/minha-app/logs/nginx-error.log;
location /static/ { alias /var/webapps/minha-app/static/; }
location /media/ { alias /var/webapps/minha-app/media/; }
location /robots.txt { alias /var/webapps/minha-app/files/robots.txt; }
location / { try_files $uri @proxy_to_app; }
location @proxy_to_app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://minha_app; } }
Web Server (HTTP)
DJANGO DEPLOY Application Sever (WSGI)
WSGI?Web Server Gateway Interface
Especificação python que descreve a comunicação entre web server e web
applications.
PEP 333
DJANGO DEPLOY Application Sever (WSGI)
mod_wsgi
DJANGO DEPLOY Application Sever (WSGI)
•Green Unicorn •Compatível com a maioria dos web frameworks •Fácil de configurar •Leve •Rápido
DJANGO DEPLOY Application Sever (WSGI)
pip install gunicorn gunicorn minha_app.wsgi:application --workers 2 -b 127.0.0.1:8000
DJANGO DEPLOY Gerenciadores de processo
Como iniciar/parar a aplicação toda vez que eu fizer um deploy?
Não pode ser na mão né?
E se processo cair?
E se o servidor inteiro cair?
DJANGO DEPLOY Gerenciadores de processo
Supervisord
Permite controlar processos em sistemas UNIX-like
supervisord.conf
[program:minha_app] command=gunicorn minha_app.wsgi:application --workers 2 -b 127.0.0.1:8000 user=ubuntu stdout_logfile=/var/webapps/minha-app/logs/gunicorn.log stderr_logfile=/var/webapps/minha-app/logs/gunicorn_error.log environment=LANG="pt_BR.UTF-8",LC_ALL="pt_BR.UTF-8",LC_LANG="pt_BR.UTF-8" autostart=true autorestart=true
DJANGO DEPLOY
• Upload do projeto • Atualização de dependências (libs de terceiros) • Coleta de estáticos • Rodar migrations de BD • Restartar aplicação
Processo de deploy
DJANGO DEPLOY
/var/webapps/minha-app/
Estrutura de arquivos
logs confbin minha_app media static virtualenv
DJANGO DEPLOY
/var/webapps/minha-app/
Estrutura de arquivos
logs confbin minha_app media static virtualenv
Upload do projeto
Atualização de dependências
Coleta de estáticos
DJANGO DEPLOY Estrutura de arquivos
Taaaaah blzz!!!Vou precisar criar essa estrutura
inicialmente na mão?
E pra fazer o deploy toda vez que integrar algo no código?
Vai na mão também?
DJANGO DEPLOY Deploy
Automatização OrquestraçãoProvisionamento
Infraestrutura como código
DJANGO DEPLOY Deploy
Ferramenta python para automatização de deploy ou qualquer tarefa sysadmin utilizando SSH
• Simples • Tarefas são definidas como funções python • Command line • Configuração de múltiplos hosts
DJANGO DEPLOY
fabfile.py
Deploy
# coding: utf-8 import datetime from fabric.api import env, task, sudo, local, put, run, cd, prefix from fabric.colors import green from contextlib import contextmanager
PROJECT_NAME = 'minha_app' APP_PATH = ‘/var/webapps/minha-app/’
@task def dev(): env.hosts = ['122.122.121.1212'] env.user = 'dev'
@task def upload(): pgreen('Deploying project...')
# Generate release release_name = datetime.now().trftime(‘%Y%m%d%H%M%S') local('rm -f /tmp/{}.tgz'.format(PROJECT_NAME)) local('git archive --format=tar --prefix={0}/ HEAD | gzip > /tmp/{0}.tgz'.format(PROJECT_NAME)) put('/tmp/{}.tgz'.format(PROJECT_NAME), '/tmp/') run('tar -C /tmp -zxf /tmp/{}.tgz'.format(PROJECT_NAME))
with cd(APP_PATH): sudo('mv /tmp/{} ./releases/{}'.format(PROJECT_NAME, release_name)) sudo('rm -f ./current') sudo('ln -s ./releases/{} ./current'.format(release_name))
DJANGO DEPLOY Fontes
http://nginx.org/en/docs/ http://gunicorn.org/ http://supervisord.org/ http://www.fabfile.org/ http://wsgi.readthedocs.org/en/latest/
https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14-04#definitions-and-concepts
DJANGO DEPLOY
Obrigado!!!Artur Felipe de Sousa Software Developer - globo.com Entretenimento Como me encontrar https://twitter.com/arturfsousa https://github.com/arturfelipe [email protected]
FIM