lunes, 3 de marzo de 2014

Alternativas a Heroku para aplicaciones Rails

Hasta ahora, prácticamente todas las aplicaciones web las tenía alojadas en Heroku. Al ser aplicaciones pequeñas, podía acogerme al plan gratuito sin problemas, y usar los Add-ons que ofrecen una mini versión sin coste.
El mayor problema llega a la hora, por ejemplo, de incluir en una aplicación un proceso en Backend como Resque o Sidekiq. En este caso es necesario tener un dyno para la parte web, y otro para el proceso.

Buscando otras opciones, me han llamado especialmente la atención DigialOcean, que últimamente está haciendo una gran campaña publicitaria; OpenShift y Amazon AWS.
Las tres variantes ofrecen Iaas (Infraestructure as a Service) es decir, un servidor virtual (VPS) donde es necesario realizar la configuración de la máquina y la instalación de todos los componentes.
En el caso de Heroku, se trata de un PaaS (Platform as a Service), lo que quiere decir que nos ofrece todas las facilidades para desplegar las aplicaciones, ocupándonos solamente del código en si. En este post de Stackoverflow hay una explicación más completa.



Viendo estas opciones, en un principio me decidí por usar los servicios Web de Amazon. Ofrecen un año gratis con su capa gratuita. Además, ofrece (en teoría) un PaaS, aunque posteriormente me di cuenta de que esto solo es viable en algunas aplicaciones. En el caso de DigitalOcean, ofrecen 20GB de SSD, que está muy bien, aunque tenía dudas de que el rendimiento de la aplicación fuera óptimo. Openshift, por su parte ofrece gratis hasta 3 gears, lo cual me hace pensar en realizar la prueba en un futuro. Pero como digo, finalmente me incliné por AWS.

Una vez registrado en AWS, intenté realizar el despliegue mediante Elastic Beanstalk. Muy bonito y sencillo en principio, pero acabó mal. Este producto sólo permite usar la versión 1.9.3 de Ruby, y mi aplicación estaba en la versión 2.0.0, con expectativas de subir a la 2.1. Intenté actualizar la máquina virtual, pero con bastantes problemas. finalmente desistí e intenté otra opción.

En el segundo intento, probé con OpsWorks (beta). Un producto que te permite definir varias capas y configurarlos. El problema es que gran parte de la configuración se realiza por medio de recetas. No hay demasiada documentación, y menos aún para Ruby on Rails y la infraestructura que quería montar (Redis, Elasticsearch, etc). Por lo tanto, tampoco me iba a ser cómodo el despliegue.

Finalmente me decidí por un doityourself. Creé una instancia de EC2 (Amazon Elastic Compute Cloud) con Ubuntu 13.10 como SO, y comencé con la instalación: RVM, Nginx, MySQL, MongoDb, ...
Posteriormente modifiqué mi aplicación para poder hacer el despliegue usando Capistrano, Unicorn como servidor por medio de sockets, y configuré Nginx para comunicarse con él. Todo esto lo iré explicando en otros posts.
Tras varias peleas, entre las cuales entró el tener que crear una partición de swap para la máquina, ya que venía sin ella, finalmente conseguí tener la aplicación desplegada, funcionando y a la escucha.