Com fer deployment d'una aplicació Django:

Que tal una salutació a tots, aquest és el meu primer article a <» Des de Linux (de diversos que tinc als meus esborranys xD), espero els sigui d'utilitat 

Bé, en el meu nou i actual treball, a hores d'ara s'està realitzant la migració de diversos sistemes cap a Django (que estrany eh ?? xD) i una de les meves tasques, a part de el desenvolupament, és la posada en producció d'aquests, llavors com bon aprenent, ja que era la meva primera vegada posar en producció una aplicació en un servidor real: $ em vaig posar a llegir la doc oficial de cada un dels paquets requerits de l'stack (Gunicorn i Supervisord mes que tot), i veient que els tutorials en espanyol que hi ha no em van ser molt clars en alguns aspectes, vaig decidir crear una mini guia amb els passos que segui per posar en producció l'aplicació, basant-nos en el stack Django, Gunicorn, Supervisord, Nginx i Postgresql.

En el cas on treball, els servidors encara corren amb Debian Squeeze, però la guia hauria de ser totalment vàlida per a altres distribucions ... llavors anem directe a el gra i comencem:

Jo treballés com super usuari. Primer de tot, es requereixen els següents paquets:

PIP -> Eina per a instal·lar i administrar paquets per Python
aptitude install python-pip

Nginx -> Servidor web (el farem servir com a proxy invertso i per escorcollar els arxius estàtics 'img, js, css') El instal·lem amb:
aptitude install nginx

Supervisord -> Aplicació per administrar i supervisar la nostra aplicació, encara que serveix per a molt mes. El instal·lem amb:
aptitude install supervisor

Virtualenv -> Ens serveix per crear un entorn virtual d'execució personalitzat per a la nostra aplicació. El instal·lem amb:
aptitude install python-virtualenv

Gunicorn -> Servidor web per python (això no ho instal·larem encara)

Assumeixo que ja haurien de tenir instal·lat i configurat postgresql

psíquic 2 -> Connector de postgresql per python (tampoc ho instal·larem encara)

Crear entorn virtual amb virtualenv:

Primer anem a moure'ns fins al directori de treball que utilitzarem per a la posada en producció:
cd /var/www/

Després en aquest directori crearem l'entorn virtual:
virtualenv ENV-nombreApp

Ens movem fins al directori que acabo de crear virtualenv
cd ENV-nombreAPP

Copiem l'aplicació en aquest directori i ara procedim a activar l'entorn amb:
source bin/activate

El prompt ha de quedar ara com (ENV)usuario@host:

Això farà que ara tot el que fem aquest emmagatzemat al directori / Var / www / ENV-nombreAPP / sense afectar els paquets de sistema

Ara ens movem a directori de l'aplicació:
cd nombreApp

Procedim a instal·lar la llista de dependències de l'aplicació (de ser necessari), en el qual les mateixes estan especificades a l'arxiu requisits.txt:
pip install -r requirements.txt

També podem instal·lar paquets de manera individual, per exemple, per instal·lar el connector de postgresql:
pip install psycopg2

Instal·lació i configuració d'GUnicorn:

Per instal·lar-ho fem de la mateixa manera:
pip install gunicorn

Ara anem a configurar-lo, per això crearem un fitxer anomenat gunicorn-deploy.py en l'arrel de la nostra aplicació, (encara que el nom pot ser qualsevol) amb el següent contingut:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Configuració de Supervisord:

Ara configurem el supervisor, Per a això generem el fitxer de configuració amb

echo_supervisord_conf > /etc/supervisord.conf

Ara editem el archivpo de configuració:
vim /etc/supervisord.conf

I descomentem les següents línies quitandole el; (Punt i coma):

[Unix_http_server] file = / tmp / supervisor.sock [supervisord] logfile = / var / log / supervisord.log logfile_maxbytes = 50MB logfile_backups = 10 loglevel = debug PidFile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverURL = unix: [program: nombreApp] command = / var / www / ENV-nombreApp / bin / django_unicorn -c / var / www / ENV -nombreApp / nombreApp / gunicorn-deploy.py directory = / var / www / ENV-nombreApp / nombreApp / autostart = true autorestart = true user = nombreUser redirect_stderr = true stdout_logfile = / var / www / logs / nombreApp / supervisord.log

Ara crearem el script perquè supervisord iniciï amb el sistema, per a això crearem l'arxiu:
vim /etc/init.d/supervisord

I li afegim el següent contingut:

 # Supervisord acte-start # # description: Acte-starts supervisord # processname: supervisord # PidFile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl casi $ 1 in start) echo -n "Iniciant supervisord:" $ SUPERVISORD fet ;; stop) echo -n "Aturant supervisord:" $ SUPERVISORCTL shutdown fet ;; restart) echo -n "Aturant supervisord:" $ SUPERVISORCTL shutdown fet echo -n "Iniciant supervisord:" $ SUPERVISORD fet ;; esac

I ara li donem permisos d'execució a l'arxiu perquè pugui iniciar amb el sistema:
sudo chmod +x /etc/init.d/supervisord

Actualitzem els enllaços per arrencar el servei:
sudo update-rc.d supervisord defaults

Iniciem el servei:
sudo /etc/init.d/supervisord start

Configurant nginx:

Aquest pas també és bastant senzill, crearem el següent fitxer de configuració de nginx per a la nostra aplicació:

vim /etc/nginx/sites-enabled/nombreApp

I li afegirem el següent contingut

server {listen 9001; # Port on volen que escolti nginx SERVER_NAME www.dominio.com; # O 192.168.0.100, direcció a la qual accedirem access_log /var/log/nginx/nombreApp.access.log; # On tindrem el log de l'aplicació location / {# a on cridés nginx a l'accedir a www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } Location / static / {# a on accedira nginx quan ingressem en www.dominio.com/static/ àlies / var / www / ENV-nombreApp / nombreApp / staticfiles /; }}

I reiniciem nginx:
service nginx restart

Configurant Django:

Anem a modificar el fitxer de configuració de django:
vim nombreApp/settings.py

Busquem la línia que diu DEBUG = True i li canviem el valor, quedant DEBUG = False

Afegim els paràmetres de la DB:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # o mysql, o el que estiguin fent servir 'NAME': 'NomDB', 'USER': 'usuarioDB', 'PASSWORD' : 'contrasenaDB', 'HOST': 'localhost', # o el que necessitin 'PORT': '', # o el que estiguin usant}}

Busquem la línia ALLOWED_HOSTS = [] i li afegim el domini o la direcció per mitjà de qual accedirem, quedant alguna cosa com ALLOWED_HOSTS = [ 'www.dominio.com']

Configurem el directori per als fitxers estàtics, busquem la línia que diu STATIC_ROOT = ' ' i li canviem el valor, col·locant-la ruta absoluta on volem que estiguin nostres arxius estàtics, en el meu cas ho deixi més o menys així STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Ja gairebé per acabar, executem la següent comanda:
./manage.py collectstatic

Això ens creés una carpeta amb el nom 'estàtica en la ruta que especifiquem en el settings.py ', És allà on hi seran tots els nostres arxius estàtics.

I per últim reiniciem el supervisord perquè prengui els nous canvis:
supervisorctl restart nombreApp

I això seria tot, al final no era per a tanta veritat? a mi em va semblar senzill 

Espero us sigui d'utilitat, salutacions 

documentació GUnicorn

documentació Supervisord


Afegir com a font preferida a Google