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

  • Published on
    12-Aug-2015

  • View
    130

  • Download
    2

Embed Size (px)

Transcript

  1. 1. DJANGO DEPLOY Como servir e distribuir apps Django em um ambiente de produo Artur Felipe de Sousa
  2. 2. Web framework python full stack DJANGO DEPLOY Baterias inclusas Desenvolvimento gil
  3. 3. E quanto ao deploy? DJANGO DEPLOY Como servir a minha aplicao em um ambiente externo? Pode usar? ./manage.py runserver
  4. 4. DJANGO DEPLOY Como fao ento?
  5. 5. DJANGO DEPLOY Servindo a aplicao Application Server WSGI Web Server HTTP
  6. 6. DJANGO DEPLOY Web Server (HTTP) Muito leve timo servidor de estticos (html,css,js,imgs) Cache Proxy reverso Redirects/Rewrites
  7. 7. DJANGO DEPLOY Mais leve No serve dinmico URI Based Interpretation (locations) Mais fcil de instalar e congurar X Mais pesado Serve dinmico File based interpretation Web Server (HTTP)
  8. 8. 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)
  9. 9. DJANGO DEPLOY Application Sever (WSGI) WSGI? Web Server Gateway Interface Especicao python que descreve a comunicao entre web server e web applications. PEP 333
  10. 10. DJANGO DEPLOY Application Sever (WSGI) mod_wsgi
  11. 11. DJANGO DEPLOY Application Sever (WSGI) Green Unicorn Compatvel com a maioria dos web frameworks Fcil de congurar Leve Rpido
  12. 12. DJANGO DEPLOY Application Sever (WSGI) pip install gunicorn gunicorn minha_app.wsgi:application --workers 2 -b 127.0.0.1:8000
  13. 13. DJANGO DEPLOY Gerenciadores de processo Como iniciar/parar a aplicao toda vez que eu zer um deploy? No pode ser na mo n? E se processo cair? E se o servidor inteiro cair?
  14. 14. 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
  15. 15. DJANGO DEPLOY Upload do projeto Atualizao de dependncias (libs de terceiros) Coleta de estticos Rodar migrations de BD Restartar aplicao Processo de deploy
  16. 16. DJANGO DEPLOY /var/webapps/minha-app/ Estrutura de arquivos logs conf bin minha_app media static virtualenv
  17. 17. DJANGO DEPLOY /var/webapps/minha-app/ Estrutura de arquivos logs conf bin minha_app media static virtualenv Upload do projeto Atualizao de dependncias Coleta de estticos
  18. 18. DJANGO DEPLOY Estrutura de arquivos Taaaaah blzz!!! Vou precisar criar essa estrutura inicialmente na mo? E pra fazer o deploy toda vez que integrar algo no cdigo? Vai na mo tambm?
  19. 19. DJANGO DEPLOY Deploy Automatizao OrquestraoProvisionamento Infraestrutura como cdigo
  20. 20. DJANGO DEPLOY Deploy Ferramenta python para automatizao de deploy ou qualquer tarefa sysadmin utilizando SSH Simples Tarefas so denidas como funes python Command line Congurao de mltiplos hosts
  21. 21. DJANGO DEPLOY fable.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. 22. DJANGO DEPLOY Fontes http://nginx.org/en/docs/ http://gunicorn.org/ http://supervisord.org/ http://www.fable.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#denitions- and-concepts
  23. 23. 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