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.
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.