Como hacer la instalación rápida de una aplicación Ruby on Rails en DigitalOcean


Enrique Vargas

@kike77

linkedin

23 de Diciembre de 2015

Nada más fascinante que hacer deploy de una aplicación Ruby on Rails en cuestión de minutos, esto es algo que la empresa DigitalOcean nos ofrece a un precio bajo y sin muchas complicaciones, este articulo explica en detalle la instalación de una aplicación RoR con el Droplet más económico.

Debo admitir que he estado trabajando mucho tiempo con Amazon Web Services y he ignorado un poco el mundo de los VPS, pero obviamente no todos nuestros clientes están dispuestos a pagar tarifas tan altas (después del año), además no todas las aplicaciones necesitan un arquitectura distribuida y  escalable, así que DigitalOcean nos da una plataforma híbrida perfecta entre una clásica VPS y un servicio de cloud computing de pago por consumo.

 

Cuando empecé a trabajar con estos servidores virtuales llamados Droplets tenia poca esperanza que los económicos pudiesen soportar eficazmente la carga de trabajo, pero para mi sorpresa han superado mis expectativas y me he convertido en un fan inmediato de esta empresa.

 

Ahora entramos en la parte técnica que seguro les interesa, la tecnología que más disfruto trabajar es Ruby, unido con el framework Ruby on Rails, ¿por que es mi preferida?, pues es un tema largo que seguro pudiese extenderme a uno o más artículos así que pasemos a lo que nos interesa; hacer un despliegue (deploy) rápido de nuestra aplicación en el Droplet más económico de DigitalOcean.

 

DigitalOcean cuenta con un servicio llamado 1-click application, este servicio nos permite crear un Droplet con un ambiente hecho especifico a la tecnología que necesitamos trabajar,  en nuestro caso es un Droplet con Ruby on Rails 4+, Nginx, Unicorn y PostgreSQL este último añadido recientemente y que elimina el clásico MySQL de la receta, a mi opinión; lo mejor que pudieron a hacer. PostgreSQL vs MySQL es otro tema que seguro despertaría mucha controversia.

 

Crear el Droplet es fácil, con solo colocar el nombre , el tamaño (en nuestro caso el de 5$), región y seleccionar el tipo de aplicación (Ruby on Rails) obtendremos en menos de un minuto nuestro servidor Rails.

 

Instalación Ruby on Rails en DigitalOcean     Deploy Ruby on Rails en DigitalOcean

Instalacion ruby on rails en DigitalOceandeploy RoR en DigitalOcean

 

Cuando se termina de crear nos otorga una dirección IP con una aplicación Ruby on Rails funcionando perfectamente, más fácil imposible.

 

Ahora es momento de revisar nuestro correo electrónico donde DigitalOcean nos ha enviado los datos para hacer un SSH a nuestro servidor, algo parecido a esto:

 


  Your new droplet has been created!
  You can access it using the following credentials:
  IP Address: 104.131.38.121
  Username: root
  Password: hlbjnspvzodd

 

Entramos a nuestra sesión SSH y lo primero que nos pedirá es cambiar la contraseña, luego nos dará un mensaje de bienvenida unido con los datos de conexión que necesitamos para instalar nuestra aplicación., el primero que veremos es de FTP.

 


  You can use the following SFTP credentials to upload your webpages (using FileZilla/WinSCP/Rsync):
  Host: 104.131.38.121
  User: rails
  Pass: hlbjnspasdasdvzodd

 

Seguido encontramos las credenciales de la base de datos instalada:

 


  You can use the following Postgress database credentials:
    * User: rails
    * Pass: KHSYSRSOYcGT


 

Al conectarnos por FTP nos llevará a la ruta del proyecto (/home/rails/rails_project), allí suplantaremos todos los archivos por los de nuestra aplicación, cabe acotar que esto lo hacemos asumiendo que conocen Git y están guardando el código en algún repositorio (GitHub, BitBucket,etc), tampoco hemos querido incluir el despliegue con capristrano que lo consideramos la mejor forma para hacer despliegues basado en nuestro repositorio Git. Esto lo profundizaremos en un próximo articulo.

 

Ahora al suplantar los archivos de nuestro proyecto tenemos que tener en cuenta que necesitamos cambiar ciertos datos de nuestra configuración que ya DigitalOcean nos lo coloca como variable de ambiente, estos datos lo podemos ver en /etc/default/unicorn

 

Lo que debemos cambiar en nuestra aplicación:

 


  rails/config/secrets.yml
	  production:
       secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>

  rails/config/database.yml
	  production:
       <<: *default
       database: app_production
       username: rails
       password: <%= ENV['APP_DATABASE_PASSWORD'] %>


 

Antes de empezar tenemos que actualizar las librerías del servidor 

 


    apt-get update

 

Luego importante, para las aplicaciones que utilizan manejo de imágenes, por ejemplo CarrierWave (Ruby Gem) debemos instalar ImageMagic.

 


  sudo apt-get install imagemagick libmagickwand-dev

 

 

Ahora bien, el siguiente paso es opcional y es utilizar el Linux swap, yo lo hago por que muchas veces utilizo Gems que cuando se instalan consumen mucha memoria y nada peor que ver el odioso mensaje de falta de memoria, obvio, esto no tendríamos que hacerlo si tuviésemos un servidor más poderoso.

 


  Primer paso:
    sudo dd if=/dev/zero of=/swapfile bs=1024 count=256k
	
  segundo paso:
    sudo mkswap /swapfile

  el resultado será algo asi:
    Setting up swapspace version 1, size = 262140 KiB no label, UUID=103c4545-5fc5-47f3-a8b3-dfbdb64fd7eb

  para activar
    sudo swapon /swapfile

  Ahora para configurarlo cada vez que se reinicie el servidor solo debes hacer esto:
   Abrir este archivo
    sudo nano /etc/fstab

  y añadir esta línea
    /swapfile       none    swap    sw      0       0

 

Ya que hemos terminado con el sistema operativo, es momento de nuestro servidor de aplicaciones, recuerden que ya el servidor se encuentra corriendo, por lo tanto es buena idea apagarlo por los momentos.

 

  service unicorn stop 

 

Antes de ejecutar el Bundle debemos agregar la variable de ambiente de base datos (APP_DATABASE_PASSWORD) para poder crear estrutura y hacer migrate en cualquier momento, esta se encuentra en /etc/default/unicorn al final del archivo, solo se debe copiar y agregarlo como variable de sesión. lo haremos con el usuario que estamos conectados(root) que fue el que nos envio DigitalOcean, esto para hacerlo rápido, pero por motivos de seguridad se debería utilizar un usuario diferente.

 

  Copiar la variable de ambiente de base de datos del siguiente archivo:
    vi /etc/default/unicorn 
  
  Y ejecutamos
    export APP_DATABASE_PASSWORD=LA-CONTRASEÑA-DEL-ARCHIVO

  Luego lo pegarmos en el .profile al final del archivo para la próxima vez que nos conectemos
    vi ~/.profile


 

Luego empezamos a actualizar e instalar los Gems de nuestro proyecto

 

  cd /home/rails/rails_project
  bundle update

 

(Revisión) Ahora se debe revisar la configuración de PostgreSQL para que no te ocurra el odiado error "Peer authentication failed for user" 

Modificas el siguiente archivo : /etc/postgresql/9.3/main/pg_hba.conf

local   all             all                                     peer

Debes cambiar "peer" por "trust"

Ahora solo tienes que reinicar el servidor, puedes hacerlo desde la consola con este comando (sudo shutdown -r now) o en caso que no funcione directamente desde tu sesión en DigitalOcean, dentro de tu droplet vas a la opción Power y luego pinchas en la opción "Power Cycle"

 

 

Creamos la base de datos y estructuras del proyecto

 


  rake db:create RAILS_ENV="production"
  rake db:migrate RAILS_ENV="production" 
  rake db:seed RAILS_ENV="production"

 

Precompilamos todos los assets


  RAILS_ENV=production rake assets:precompile

 

Si no tenemos problemas, debemos estar preparados para iniciar el servidor de aplicaciones Unicorn, antes de esto si trabajamos con Devise recuerden que el archivo rails/config/initializers/devise.rb cuenta con un config.secret_key que debemos configurar con nuestras variables de entorno.

 


  service unicorn start

Ahora al ir a nuestro IP debemos ver nuestra aplicación desplegada.

 

El archivo log de Unicorn lo pueden ver por la siguiente ruta

/var/log/unicorn/unicorn.log

 

Espero esta pequeña guía les haya ayudado, si tienen alguna duda o sugerencia no duden en escribirme.