DJANGO DEPLOY
Como servir e distribuir apps Django em um ambiente
de produção
Artur Felipe de Sousa


Web framework python
full stack
DJANGO DEPLOY
Baterias inclusas
Desenvolvimento á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 Server
WSGI
Web Server
HTTP
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
conf

bin
minha_app
media
static
virtualenv
DJANGO DEPLOY
/var/webapps/minha-app/
Estrutura de arquivos
logs
conf

bin
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
arturfelipe.sousa@gmail.com
FIM
https://github.com/arturfelipe/django-deploy

Django deploy - Como servir aplicações Django em produção

  • 1.
    DJANGO DEPLOY Como servire distribuir apps Django em um ambiente de produção Artur Felipe de Sousa
  • 2.
    
 Web framework python fullstack DJANGO DEPLOY Baterias inclusas Desenvolvimento ágil
  • 3.
    E quanto aodeploy? DJANGO DEPLOY Como servir a minha aplicação em um ambiente externo? Pode usar? 
 ./manage.py runserver
  • 4.
  • 5.
    DJANGO DEPLOY Servindoa aplicação Application Server WSGI Web Server HTTP
  • 6.
    DJANGO DEPLOY WebServer (HTTP) • Muito leve • Ótimo servidor de estáticos (html,css,js,imgs) • Cache • Proxy reverso • Redirects/Rewrites
  • 7.
    DJANGO DEPLOY • Maisleve • 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)
  • 8.
    DJANGO DEPLOY nginx.conf (vitualhost) upstreamminha_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)
  • 9.
    DJANGO DEPLOY ApplicationSever (WSGI) WSGI? Web Server Gateway Interface Especificação python que descreve a comunicação entre web server e web applications. PEP 333
  • 10.
    DJANGO DEPLOY ApplicationSever (WSGI) mod_wsgi
  • 11.
    DJANGO DEPLOY ApplicationSever (WSGI) •Green Unicorn •Compatível com a maioria dos web frameworks •Fácil de configurar •Leve •Rápido
  • 12.
    DJANGO DEPLOY ApplicationSever (WSGI) pip install gunicorn gunicorn minha_app.wsgi:application --workers 2 -b 127.0.0.1:8000
  • 13.
    DJANGO DEPLOY Gerenciadoresde 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?
  • 14.
    DJANGO DEPLOY Gerenciadoresde 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
  • 15.
    DJANGO DEPLOY • Uploaddo projeto • Atualização de dependências (libs de terceiros) • Coleta de estáticos • Rodar migrations de BD • Restartar aplicação Processo de deploy
  • 16.
    DJANGO DEPLOY /var/webapps/minha-app/ Estrutura dearquivos logs conf
 bin minha_app media static virtualenv
  • 17.
    DJANGO DEPLOY /var/webapps/minha-app/ Estrutura dearquivos logs conf
 bin minha_app media static virtualenv Upload do projeto Atualização de dependências Coleta de estáticos
  • 18.
    DJANGO DEPLOY Estruturade 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?
  • 19.
    DJANGO DEPLOY Deploy AutomatizaçãoOrquestraçãoProvisionamento Infraestrutura como código
  • 20.
    DJANGO DEPLOY Deploy Ferramentapython 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
  • 21.
    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))
  • 22.
  • 23.
    DJANGO DEPLOY Obrigado!!! Artur Felipede Sousa Software Developer - globo.com Entretenimento 
 Como me encontrar
 https://twitter.com/arturfsousa
 https://github.com/arturfelipe arturfelipe.sousa@gmail.com FIM https://github.com/arturfelipe/django-deploy