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

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

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

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

DJANGO DEPLOYComo servir e distribuir apps Django em um ambiente

de produção

Artur Felipe de Sousa

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

Web framework python

full stack

DJANGO DEPLOY

Baterias inclusasDesenvolvimento ágil

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

E quanto ao deploy?

DJANGO DEPLOY

Como servir a minha aplicação em um ambiente externo?

Pode usar? ./manage.py runserver

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

DJANGO DEPLOY

Como faço então?

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

DJANGO DEPLOY Servindo a aplicação

Application ServerWSGI

Web ServerHTTP

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

DJANGO DEPLOY Web Server (HTTP)

• Muito leve • Ótimo servidor de estáticos (html,css,js,imgs) • Cache • Proxy reverso • Redirects/Rewrites

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

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)

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

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)

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

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

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

DJANGO DEPLOY Application Sever (WSGI)

mod_wsgi

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

DJANGO DEPLOY Application Sever (WSGI)

•Green Unicorn •Compatível com a maioria dos web frameworks •Fácil de configurar •Leve •Rápido

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

DJANGO DEPLOY Application Sever (WSGI)

pip install gunicorn gunicorn minha_app.wsgi:application --workers 2 -b 127.0.0.1:8000

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

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?

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

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

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

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

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

DJANGO DEPLOY

/var/webapps/minha-app/

Estrutura de arquivos

logs confbin minha_app media static virtualenv

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

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

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

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?

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

DJANGO DEPLOY Deploy

Automatização OrquestraçãoProvisionamento

Infraestrutura como código

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

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

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

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))

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

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

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

DJANGO DEPLOY

Obrigado!!!

Artur Felipe de Sousa Software Developer - globo.com Entretenimento Como me encontrar https://twitter.com/arturfsousahttps://github.com/arturfelipe [email protected]

FIM

https://github.com/arturfelipe/django-deploy