Deployments Automáticos para Django

La única queja que tengo de Django, mi framework para aplicaciones web favorito es que hacer un deployment es mucho más difícil que con un proyecto de PHP. En el pasado he tratado de documentar el proceso que uso para hacer mis deployments pero sigo pensando que es muy complicado.

En el mercado hay algunos servicios que facilitan esto usando la estrategia que hizo famoso a Heroku en el mundo de Ruby on Rails. El más conocido de estos servicios para Django era Djangy, quienes hace unos días anunciaron que no les interesaba más seguir operando ese servicio. Esta noticia me tomó por sorpresa y me hizo pensar en que este tipo de cosas como la infraestructura quizás no sea tan buena idea confiarla a un servicio de estos.

Las ventajas de simpleza en el deployment no comparan con la ventaja que es tener control absoluto del setup de los servidores que sirven tu aplicación. Al final del día, hacer un deployment es algo bastante repetitivo y con un poco de trabajo se puede automatizar.

Esto último es precisamente lo que me propongo hacer. Automatizar mis deployments de Django al punto que sea solo cuestión de correr un comando desde mi maquina de desarrollo y esto sea suficiente para crear, configurar una instancia de servidor con la aplicación instalada y funcionando lista para recibir usuarios.

Hoy comparto con ustedes la primera parte de este proyecto. Se llama bootstrap.sh y es un bash script que se debe correr en un servidor con una instalación nueva de Ubuntu Server 10.10. Con un solo comando (un poco largo) se puede configurar el servidor para servir aplicaciones de Django con Apache y mod_wsgi además de nginx para servir los archivos estáticos. Esta primera versión hace en 5 minutos lo que antes me tomaba 2 horas o más.

En el futuro espero cambiar este script a que sea un script de Fabric y 100% Python. Quiero que con solo un comando se pueda crear una instancia de Amazon EC2 y luego se instalen y configuren todos los requisitos. Pero eso es para más adelante. Por el momento comparto lo que he logrado con la ayuda de @jpadilla_ que creo va a ayudarlos mucho.

Update, versión 100% Python
Después de recibir feedback de varios amigos y personas que respeto decidí mover este script a Python. Pensaba que sería difícil pero la verdad es que no me dio tanto trabajo y ahora es parte de mis herramientas habituales.

Antes de hacer esta nueva versión del script pensaba que la meta debía ser hacer un deployment en un solo paso pero la verdad es que después de un poco de “trial and error” terminé decidiendo que en 3 pasos no está nada mal.

Este script es un fabfile.py que necesita Fabric para correr desde tu sistema de desarrollo. Así que la ventaja principal es que no tienes que crear una instancia manualmente antes de ejecutar. Debo señalar que es necesario tener una cuenta de Amazon EC2 y haber podido correr alguna instancia antes de correr este script. Como se puede ver en las variables requeridas hace falta tener un keypair y security group definido.

Los comando a continuación deben ser ejecutados usando fab como prefijo.

  1. create_server – Crear nueva instancia de Ubuntu Server 10.10 (ami-ccf405a5).
  2. bootstrap_server – Hacer todo el “setup” del server incluyendo todas las instalaciones y confuguración de los servicios principales como Apache, nginx y git
  3. first_deploy – Finalmente hacer un clone del app en el lugar correcto en el servidor y hacer restart a Apache.

1 thought on “Deployments Automáticos para Django”

Leave a Reply