Capistrano es un script que permitirá con un simple llamado a cap deploy de tu computador, respaldar el código de producción, clonar el branch maestro (u otro a elección) de tu aplicación y subirlo a producción, precompilar los assets, reiniciar passenger (o unicorn), migrar la base de datos y además realizar las tareas rake que quieras.

Antes de empezar, necesitamos tener un servidor donde podamos hacer el deploy, en este tutorial puedes aprender a construir uno con Nginx, Passenger, y RVM, sin embargo es posible ocupar Apache en lugar de NginX o Unicorn en lugar de passenger.

Otra cosa que necesitamos es un proyecto rails (el que vamos a subir) y una cuenta en bitbucket que es desde donde haremos el deployment.

Paso 1: Instalando la gema Capistrano

Dentro de tu computador, en la carpeta del proyecto en el que quieres agregar capistrano vamos a abrir el gemfile y agregar las gemas relacionadas con capistrano.

y luego en el bash

Paso 2: Instalación de Capistrano

ahora con capistrano instalado en el mismo bash vamos a instalar capistrano

Paso 2.1 Configuración del Capfile

Luego en el archivo Capfile generado vamos a a copiar los requerimientos de las siguientes librerías:

ojo con la sección rvm_ruby_version, hay que utilizar la versión de ruby que tenemos instalada tanto en el servidor como la que tenemos instalada en el computador.

Paso 2.2 Configuración del archivo de deployment

Luego en el archivo config/deploy.rb, vamos a poner los datos necesarios para el deployment

Ojo con el lock, ahí hay que ocupar la versión correspondiente de la gema de capistrano, para saber la tuya puedes utilizar bundle show

donde dice nombre_app tienes que utilizar el nombre de tu aplicación, este nombre también tiene que coincidir con el nombre de la aplicación que pusiste en el virtual host.

donde dice repo_url debes poner la dirección ssh del git de tu aplicación

donde dice branch debes poner el branch que quieres ocupar para deployment, los más comunes son master, deploy y capistrano.

donde dice user: deploy es el nombre del usuario para hacer deployment, si seguiste el tutorial sobre como montar un servidor con nginx y passenger entonces tendrás a deploy como usuario.

donde dice deploy_to debemos poner el path hasta el usuario junto con el nombre de la app, por ejemplo si nuestra app se llama desafiolatam sería:

Paso 2.3 Configuración del archivo de producción

Otro archivo que nos falta modificar es el de config/deploy/production.rb, en este vamos a especificar donde está la aplicación y la base de datos.

aquí lo que hay que cambiar es deploy por el nombre del usuario de deployment (sólo si usaste uno distinto) y el ip del servidor. el resto se deja como está.

Paso 3: Generación de la clave ssh

hacemos ssh a la máquina del servidor con:

dentro de la máquina buscamos si tenemos una clave generada, ¿cómo lo hacemos? entramos a la carpeta del usuario.

revisamos si tenemos la carpeta .ssh y dentro el archivo id_rsa.pub, sólo en caso de que no tengamos algunas de las dos anteriores.

ahora vamos a mostrar la clave generada y la vamos a copiar

el texto copiado (completo, incluyendo el email que muestra) lo vamos a pegar en bitbucket (o github).

para agregar la clave vamos a bitbucket seleccionamos el proyecto, clickeamos en settings, luego en deployment keys y luego en add key y ahí agregamos la clave ssh de la máquina.

Paso 4: Revisando ssh

dentro de la carpeta de nuestro proyecto con capistrano (en nuestra máquina).

si hay algún error es porque hicimos uno de los pasos anteriores mal, habrá que buscar el error en internet y revisar bien los pasos, uno bastante posible es que hayamos copiado mal la clave del servidor.

paso 5: cap deploy

dentro del bash en la carpeta de nuestro proyecto

Advertencia fallará, pero eso es normal. Vamos a tener un error del tipo: ERROR linked file /home/deploy/nombre_app/shared/config/database.yml does not exist on 104.236.105.133

Paso 5.1 Configurando el database.yml

hay dos formas de manejar esta situación, una de ellas es crear el archivo en el computador y subirlo por scp o ftp, pero la mejor forma es crearlo directamente en la máquina remota con vim o nano (u otro editor)

dentro del archivo tenemos que poner como mínimo los siguientes parámetros:

Paso 5.2 Instalando el runtime de javascript

Si hacemos deploy en este momento probablemente fallará en el servidor por culpa del runtime de javascript el cual probablemente no estará instalado, una de las formas más fáciles de instalar es con:

Paso 6: Segundo deploy

volvemos a nuestra máquina y corremos nuevamente

Paso 6.1 Configurando el archivo secret.yml

Entra a la ip del server y deberías poder ver tu app.

Si a esta altura falla, lo que hay que hacer es revisar los logs de nginx, uno de los errors más comunes es haber olvidado setear dentro de tu app la clave secreta para producción dentro del archivo de tu proyecto de rails llamado config/secrets.yml

para arreglar eso vamos utilizar cualquier editor (vim, nano, etc) a e el archivo config/secret.yml

dentro del archivo:

el código random inventando puede ser como cualquiera de los secret_key_base que tienes en tu proyecto local pero con algunas variantes introducidas por ti.

Paso 7: la tercera es la vencida

ahora si que al entrar al servidor deberíamos poder ver nuestra app, si todavía falla hay que revisar los logs, lo más importantes son el nginx y el de rails, el de nginx se encuentra en etc/nginx/error.log y los de rails se encuentran dentro de /home/deploy/nombre_app/log/production.log

Share Button

Director de DesafíoLatam. Ingeniero Civil Informático de la Universidad Federico Santa María. Emprendedor lean, dedicado al desarrollo de una mejor web con ruby on rails. Fanático de los números y las métricas, la música y la fotografía.