Ruby on Rails: Instalación de servidor y despliegue con Capistrano.

A continuación lanzamos un pequeño tutorial de cómo instalar Ruby on Rails y desplegar con Capistrano. Partiendo de una maquina Ubuntu(14.04 o 16.04) recién instalada, pasos a seguir para la instalación de varios proyectos Ruby on Rails con nginx y unicorn.

Accedemos por ssh con las credenciales iniciales que nos dieron con el servidor.

Actualización de repositorio de paquetes

sudo apt-get update

sudo apt-get upgrade

Paquete de idioma y zona horaria

(Echar un vistazo a http://www.psce.com/blog/kb/how-to-periodically-synchronize-time-in-linux/)
Ejecutamos:

sudo apt-get install language-pack-es

sudo cp /usr/share/zoneinfo/Europe/Madrid /etc/localtime

Usuario

Estamos con el usuario <<root>>por defecto, debemos crear un usuario con privilegios. Para este tutorial, utilizaremos al usuario <<web>>. Ejecutamos:

sudo mkdir /home/web

sudo groupadd web

sudo useradd -d /home/web -s /bin/bash -g web web

sudo chown -R web:web /home/web

sudo passwd web

Nos pedirá introducir y confirmar una contraseña para este usuario.
Después damos privilegios para poder instalar las dependencias de Ruby on Rails.

sudo adduser web sudo

Ahora forzamos a que el usuario ‘web’ pueda escalar a root sin necesidad de introducir la contraseña de root

sudo visudo

Al final del archivo agregamos esta línea:

web ALL=(ALL) NOPASSWD: ALL

Ya que esta vez el editor es nano, guardamos con Ctrl + X y aceptamos

Configuración de SSH

Se puede usar cualquier editor de textos, para este tutorial usaremos vi. Ejecutamos:

sudo vi /etc/ssh/sshd_config

Buscamos la línea comentada “AuthorizedKeysFile %h/.ssh/authorized_keys” y la descomentamos. En caso de no existir, la creamos.
Guardamos cambios y cerramos el editor. Reiniciamos SSH, ejecutando:

sudo /etc/init.d/ssh restart

Salimos del servidor

exit

Nos conectamos como el nuevo usuario web.

Para facilitar el proceso, vamos a hacer que le servidor nos ‘conozca’ cada vez que nos conectamos a él y no nos pida la contraseña. Es una operación segura ya que solo afectará al equipo desde el que nos estamos conectando. Para ello debemos conocer la IP del servidor y la contraseña que asignamos al usuario ‘web’ unos pasos atrás en este tutorial.

ssh-copy-id web@ip_de_nuestro_servidor

Nos pedirá la clave del usuario web. La ponemos.

Si estamos usando MAC OS, debemos agregar antes  en nuestro equipo el siguiente comando: brew install ssh-copy-id

Ahora podemos acceder a nuestro servidor sin contraseña:

ssh web@ip_de_nuestro_servidor

Ya dentro del servidor nuevamente, generamos par de claves el SSH del usuario ‘web’ para añadir a nuestro repositorio, ejecutando:

ssh-keygen -t rsa

Elige un destino o deja por defecto “/home/web/.ssh/id_rsa“. y no asignes ninguna contraseña, simplemente pulsa Enter

Seguimos el resto del tutorial con este usuario web.

Instalación de paquetes necesarios

Ejecutamos:

sudo apt-get install mysql-server libmysqlclient-dev libmagickwand-dev imagemagick nginx nodejs git-core curl build-essential openssl libreadline6 libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libxml2-dev libxslt-dev autoconf libc6-dev nmon

Nos pedirá una contraseña para el usuario root de mysql, y se la confirmaremos. Debemos recordarla.

Creación de BD MySQL

Accedemos a la consola de MySQL, ejecutando:

mysql -u root -p

Introducimos la contraseña que generamos anteriormente.
Para este tutorial, utilizaremos “database_proof” como base de datos de ejemplo, y la contraseña del root de MySQL será “pass_proof”.
Creamos la base de datos y damos privilegios ejecutando:

CREATE DATABASE database_proof;

GRANT ALL PRIVILEGES ON database_proof.* TO root@localhost IDENTIFIED BY ‘pass_proof’;

Importante: Si estás copiando y pegando el código desde este tutorial, las comillas simples debes ponerlas manualmente.

FLUSH PRIVILEGES;

Salimos con “exit”

Programación de copias de seguridad automáticas de mySQL

Probablemente usemos mysql como base de datos en el sistema. Es buena práctica hacer una copia de seguridad diariamente de las bases de datos existente paara evitar o mitigar desastres que pudieran producirse. Para ello utilizaremos automysqlbackup. Este scrpit se instala automáticamente en el sistema y mantien copias diarias, semanales y mensuales de todas nuestras bases de datos.

mkdir -p /home/web/apps/bbdd

sudo apt-get install automysqlbackup

La instalación de este paquete exige la instalación de un servidor postfix para el envío de correos con los resultados del backup. De momento podemos dejarlo como ‘No configuration’.

Ya que usamos la carpeta /home/web para almacenar todos nuestros proyectos, parece buena idea dejar allí también las copias de seguridad de las bases de datos. De ese modo, si nuestro proyecto gestiona imágenes, uploads o cualquier otro tipo de archivo que aporten los usuarios de nuestro proyecto, todo los ‘importante’ estará dentro de ‘home/web’. Sacando un backups de ese directorio, tendremos nuestros proyectos a salvo y completos.

sudo vi /etc/default/automysqlbackup

Allí localizaremos la linea: BACKUPDIR=”…….” y lo reemplazaremos por esta: BACKUPDIR=”/home/web/apps/bbdd” y agregamos POSTBACKUP=”chmod -R 644 /home/web/apps/bbdd/”

Probemos y verifiquemos que se van a hacer las copias de seguridad diariamente

sudo automysqlbackup

cd /home/web/apps/bbdd

Allí habrán aparecido unas carpetas (daily / weekly / monthly) que almacenarán las bases de datos. Al menos una copia de la base de datos que creamos anteriormente debería existir en la carpeta daily.

También queda agregada una tarea en cron.daily para que diariamente se hagan las copias de seguridad sin que nosotros tengamos que hacer nada.

Ahora cada día se ejecutará un backup de todas las bases de datos MySQL (actuales y futuras) y quedará almacenado en nuestra carpeta de deploys.

Conexión con repositorio

Agregar la clave SSH en el repositorio git para deploy.

Copiamos el contenido del archivo /home/web/.ssh/id_rsa.pub en el apartado ‘Deployment keys’ en nuestro repositorio de código. Podemos visualizarlo con este comando:

cat /home/web/.ssh/id_rsa.pub

Una vez agregada la deploy key, probamos que el repositorio nos reconozca.

ssh -T git@bitbucket.org

Instalación de RVM

Ya que es probable que en un mismo servidor existan varios proyectos diferentes y puede que éstos proyectos tengan diferentes versiones de ruby, instalaremos rvm para poder gestionar más fácilmente las diferentes versiones de ruby y los diferentes gemsets de cada proyecto.

Instalamos rvm.

curl -L https://get.rvm.io | bash -s stable

La primera vez nos informa que la descarga solo puede hacerse si tenemos agregada la clave GPG. Nos pedirá que ejecutemos un comando similar a este: (Ejecutar el que aparezca en la pantalla, no este de ejemplo)

gpg –keyserver hkp://keys.gnupg.net –recv-keys 409B6B1796C275462xxxxxxxxxxxxxxx

curl -L https://get.rvm.io | bash -s stable

El instalador de rvm nos indica al finalizar que debemos ejecutar esta linea para poder usar rvm inmediatamente:

source /home/web/.rvm/scripts/rvm

Si conocemos la versión de ruby que utiliza nuestro primer proyecto podemos dejarla descargada ya.

rvm install ruby-2.3.1

La gema bundler la necesita el sistema para poder hacer cualquier deploy, la instalamos:

gem install bundler

El sistema ahora está listo para recibir el deploy del proyecto.

En este repositorio está la receta adecuada de Capistrano y las instrucciones para agregarlo a tu proyecto.