SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

Vagrant Got Plugins
Vagrant Got PluginsVagrant Got Plugins
Vagrant Got Plugins
Rogerio Prado de Jesus
 
I educar-manual-de-instalaao
I educar-manual-de-instalaaoI educar-manual-de-instalaao
I educar-manual-de-instalaao
Fabio Junior Novais Silva
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Felipe Blini
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneos
Fernando Ike
 
Conceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java NoroesteConceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java Noroeste
Carlos Eduardo Alves da Silva
 
Node JS - Parte 3
Node JS - Parte 3Node JS - Parte 3
Node JS - Parte 3
Bruno Catão
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
Caio Cutrim
 
Docker + Django
Docker + DjangoDocker + Django
Docker + Django
Allisson Azevedo
 
Alta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - NginxAlta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - Nginx
Thiago Paes
 
Google App Engine e PHP
Google App Engine e PHPGoogle App Engine e PHP
Google App Engine e PHP
Luiz Messias
 
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
tdc-globalcode
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
Fabrízio Mello
 
Estudo de caso - Uso Docker no Desenvolvimento
Estudo de caso - Uso Docker no DesenvolvimentoEstudo de caso - Uso Docker no Desenvolvimento
Estudo de caso - Uso Docker no Desenvolvimento
Carlos Eduardo Alves da Silva
 
Otimizando sites com o nosql redis
Otimizando sites com o nosql redisOtimizando sites com o nosql redis
Otimizando sites com o nosql redis
Allisson Azevedo
 
FISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de DatacentersFISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de Datacenters
iG - Internet Group do Brasil S/A
 
Dockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSDockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJS
Luís Bianchin
 
Replicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManagerReplicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManager
Vinicius Aquino do Vale
 
Rest workshop
Rest workshopRest workshop
Rest workshop
Diogo Gomes
 
Devshare - Automatizando tarefas de javascript com GruntJS
Devshare  - Automatizando tarefas de javascript com GruntJSDevshare  - Automatizando tarefas de javascript com GruntJS
Devshare - Automatizando tarefas de javascript com GruntJS
Rafael Lyra
 
[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano
Code Experts Learning
 

Mais procurados (20)

Vagrant Got Plugins
Vagrant Got PluginsVagrant Got Plugins
Vagrant Got Plugins
 
I educar-manual-de-instalaao
I educar-manual-de-instalaaoI educar-manual-de-instalaao
I educar-manual-de-instalaao
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneos
 
Conceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java NoroesteConceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java Noroeste
 
Node JS - Parte 3
Node JS - Parte 3Node JS - Parte 3
Node JS - Parte 3
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
Docker + Django
Docker + DjangoDocker + Django
Docker + Django
 
Alta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - NginxAlta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - Nginx
 
Google App Engine e PHP
Google App Engine e PHPGoogle App Engine e PHP
Google App Engine e PHP
 
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Estudo de caso - Uso Docker no Desenvolvimento
Estudo de caso - Uso Docker no DesenvolvimentoEstudo de caso - Uso Docker no Desenvolvimento
Estudo de caso - Uso Docker no Desenvolvimento
 
Otimizando sites com o nosql redis
Otimizando sites com o nosql redisOtimizando sites com o nosql redis
Otimizando sites com o nosql redis
 
FISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de DatacentersFISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de Datacenters
 
Dockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSDockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJS
 
Replicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManagerReplicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManager
 
Rest workshop
Rest workshopRest workshop
Rest workshop
 
Devshare - Automatizando tarefas de javascript com GruntJS
Devshare  - Automatizando tarefas de javascript com GruntJSDevshare  - Automatizando tarefas de javascript com GruntJS
Devshare - Automatizando tarefas de javascript com GruntJS
 
[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano
 

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

Web Tools Pt B R
Web Tools Pt  B RWeb Tools Pt  B R
Web Tools Pt B R
guestb9d145
 
Automação de Data Center
Automação de Data CenterAutomação de Data Center
Automação de Data Center
Eduardo Scarpellini
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Thiago Rodrigues
 
Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...
Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...
Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...
Bruno Grange
 
Deploy Automatizado usando Octopus
Deploy Automatizado usando OctopusDeploy Automatizado usando Octopus
Deploy Automatizado usando Octopus
André Minelli
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016
Felipe Klerk Signorini
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011
Luís Cobucci
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
antonio sérgio nogueira
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
Igor Sobreira
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011
Luís Cobucci
 
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Jeronimo Zucco
 
Jenkins
JenkinsJenkins
Depurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSSDepurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSS
Thiago Rodrigues
 
TDC2016POA | Trilha Web - Front-end that scales
TDC2016POA | Trilha Web - Front-end that scalesTDC2016POA | Trilha Web - Front-end that scales
TDC2016POA | Trilha Web - Front-end that scales
tdc-globalcode
 
Programação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebProgramação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente Web
Israel Messias
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com Docker
Wellington Silva
 
Escalando aplicação Python usando Getup OpenShift
Escalando aplicação Python usando Getup OpenShiftEscalando aplicação Python usando Getup OpenShift
Escalando aplicação Python usando Getup OpenShift
Getup Cloud
 
Django
DjangoDjango
Iniciando com django
Iniciando com djangoIniciando com django
Iniciando com django
Marcelo Santos
 
Web Offline
Web OfflineWeb Offline
Web Offline
Bruno Catão
 

Semelhante a Django deploy - Como servir aplicações Django em produção (20)

Web Tools Pt B R
Web Tools Pt  B RWeb Tools Pt  B R
Web Tools Pt B R
 
Automação de Data Center
Automação de Data CenterAutomação de Data Center
Automação de Data Center
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
 
Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...
Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...
Instalando e usando a XPages Extension Library para IBM Designer - extlib (Po...
 
Deploy Automatizado usando Octopus
Deploy Automatizado usando OctopusDeploy Automatizado usando Octopus
Deploy Automatizado usando Octopus
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011
 
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
 
Jenkins
JenkinsJenkins
Jenkins
 
Depurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSSDepurando aplicações PHP like a BOSS
Depurando aplicações PHP like a BOSS
 
TDC2016POA | Trilha Web - Front-end that scales
TDC2016POA | Trilha Web - Front-end that scalesTDC2016POA | Trilha Web - Front-end that scales
TDC2016POA | Trilha Web - Front-end that scales
 
Programação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebProgramação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente Web
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com Docker
 
Escalando aplicação Python usando Getup OpenShift
Escalando aplicação Python usando Getup OpenShiftEscalando aplicação Python usando Getup OpenShift
Escalando aplicação Python usando Getup OpenShift
 
Django
DjangoDjango
Django
 
Iniciando com django
Iniciando com djangoIniciando com django
Iniciando com django
 
Web Offline
Web OfflineWeb Offline
Web Offline
 

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