Noticia Como hacer deployment de una aplicación Django:

Que tal un saludo a todos, este es mi primer articulo en <” DesdeLinux (de varios que tengo en mis borradores xD), espero les sea de utilidad :D

Bueno, en mi nuevo y actual trabajo, en estos momentos se esta realizando la migración de varios sistemas hacia Django (que raro eh?? xD) y una de mis tareas, aparte del desarrollo, es la puesta en producción de estos, entonces como buen aprendiz, puesto que era mi primera vez poner en producción una aplicación en un servidor real :$ me puse a leer la doc oficial de cada uno de los paquetes requeridos del stack (Gunicorn y Supervisord mas que todo), y viendo que los tutoriales en español que hay no me fueron muy claros en algunos aspectos, decidí crear una mini guía con los pasos que segui para poner en producción la aplicacion, basándonos en el stack Django, Gunicorn, Supervisord, Nginx y Postgresql.

En el caso donde trabajo, los servidores aun corren con Debian Squeeze, pero la guía debería ser totalmente valida para otras distribuciones… entonces vayamos directo al grano y comencemos:

Yo trabajare como super usuario. Primero que nada, se requieren los siguientes paquetes:


PIP -> Herramienta para instalar y administrar paquetes para Python
aptitude install python-pip

Nginx -> Servidor web (lo utilizaremos como proxy invertso y para cachear los archivos estaticos ‘img, js, css’ ) Lo instalamos con:
aptitude install nginx

Supervisord – > Aplicación para administrar y supervisar nuestra aplicación, aunque sirve para mucho mas. Lo instalamos con:
aptitude install supervisor

Virtualenv -> Nos sirve para crear un entorno virtual de ejecución personalizado para nuestra aplicación. Lo instalamos con:
aptitude install python-virtualenv

Gunicorn -> Servidor web para python (esto no lo instalaremos todavía)

Asumo que ya deberían tener instalado y configurado postgresql


psycopg2 -> Conector de postgresql para python (tampoco lo instalaremos todavia)

Crear entorno virtual con virtualenv:


Primero vamos a movernos hasta el directorio de trabajo que utilizaremos para la puesta en producción:
cd /var/www/

Luego en dicho directorio crearemos el entorno virtual:
virtualenv ENV-nombreApp

Nos movemos hasta el directorio que acabo de crear virtualenv
cd ENV-nombreAPP

Copiamos la aplicación en este directorio y ahora procedemos a activar el entorno con:
source bin/activate

El prompt deberá quedar ahora como (ENV)usuario@host:

Esto hará que ahora todo lo que hagamos este almacenado en el directorio /var/www/ENV-nombreAPP/ sin afectar los paquetes del sistema

Ahora nos movemos al directorio de la aplicación:
cd nombreApp

Procedemos a instalar la lista de dependencias de la aplicación (de ser necesario), en el cual las mismas están especificadas en el archivo requirements.txt:
pip install -r requirements.txt

También podemos instalar paquetes de manera individual, por ejemplo, para instalar el conector de postgresql:
pip install psycopg2

Instalación y configuración de GUnicorn:


Para instalarlo lo hacemos de la misma manera:
pip install gunicorn

Ahora vamos a configurarlo, para ello vamos a crear un archivo llamado gunicorn-deploy.py en la raíz de nuestra aplicación, (aunque el nombre puede ser cualquiera) con el siguiente contenido:

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

Configuracion de Supervisord:


Ahora configuremos el supervisord, para eso generamos el fichero de configuración con

echo_supervisord_conf > /etc/supervisord.conf

Ahora editamos el archivpo de configuración:
vim /etc/supervisord.conf

Y descomentamos las siguientes lineas quitandole el ; (punto y 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

Ahora crearemos el script para que supervisord inicie con el sistema, para eso crearemos el archivo:
vim /etc/init.d/supervisord

Y le agregamos el siguiente contenido:

# Supervisord auto-start
#
# description: Auto-starts supervisord
# processname: supervisord
# pidfile: /var/run/supervisord.pid

SUPERVISORD=/usr/local/bin/supervisord
SUPERVISORCTL=/usr/local/bin/supervisorctl

case $1 in
start)
echo -n "Iniciando supervisord:"
$SUPERVISORD
echo
;;
stop)
echo -n "Deteniendo supervisord:"
$SUPERVISORCTL shutdown
echo
;;
restart)
echo -n "Deteniendo supervisord:"
$SUPERVISORCTL shutdown
echo
echo -n "Iniciando supervisord: "
$SUPERVISORD
echo
;;
esac

Y ahora le damos permisos de ejecución al archivo para que pueda iniciar con el sistema:
sudo chmod +x /etc/init.d/supervisord

Actualizamos los enlaces para arrancar el servicio:
sudo update-rc.d supervisord defaults

Iniciamos el servicio:
sudo /etc/init.d/supervisord start

Configurando nginx:


Este paso también es bastante sencillo, crearemos el siguiente archivo de configuración de nginx para nuestra aplicación:

vim /etc/nginx/sites-enabled/nombreApp

Y le agregaremos el siguiente contenido

server {

listen 9001; # puerto donde quieren que escuche nginx
server_name www.dominio.com; # o 192.168.0.100, dirección a la cual accederemos
access_log /var/log/nginx/nombreApp.access.log; # donde tendremos el log de la aplicación

location / { # a donde llamara nginx al acceder a www.dominio.com/
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $http_host;
}

location /static/ { # a donde accedera nginx cuando ingresemos en www.dominio.com/static/
alias /var/www/ENV-nombreApp/nombreApp/staticfiles/;
}

}

Y reiniciamos nginx:
service nginx restart

Configurando Django:


Vamos a modificar el archivo de configuración de django:
vim nombreApp/settings.py

Buscamos la linea que dice DEBUG = True y le cambiamos el valor, quedando DEBUG = False

Agregamos los parámetros de la DB:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # o mysql, o lo que estén usando
'NAME': 'nombreDB',
'USER': 'usuarioDB',
'PASSWORD': 'contrasenaDB',
'HOST': 'localhost', # o el que necesiten
'PORT': '', # o el que esten usando
}
}

Buscamos la linea ALLOWED_HOSTS=[] y le agregamos el dominio o la dirección por medio del cual accederemos, quedando algo como ALLOWED_HOSTS=['www.dominio.com']

Configuramos el directorio para los archivos estáticos, buscamos la linea que dice STATIC_ROOT = ' ' y le cambiamos el valor, colocándole la ruta absoluta donde queremos que estén nuestros archivos estáticos, en mi caso lo deje mas o menos así STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Ya casi por finalizar, ejecutamos el siguiente comando:
./manage.py collectstatic

Esto nos creara una carpeta con el nombre ‘statics en la ruta que especificamos en el settings.py ‘, es allí donde estarán todos nuestros archivos estáticos.

Y por ultimo reiniciamos el supervisord para que tome los nuevos cambios:
supervisorctl restart nombreApp

Y eso seria todo, al final no era para tanto verdad? a mi me pareció sencillo :D

Espero les sea de utilidad, saludos ;)



Documentación GUnicorn

Documentación Supervisord




kQx0etD0hUE


Continúar leyendo...