django deploy

Post on 24-Jan-2016

39 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

django

TRANSCRIPT

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 arturfelipe.sousa@gmail.com

FIM

top related