Introducción
Si aún no estás cansado de repetir las mismas tareas mundanas para actualizar tus servidores de aplicación y llevar tu proyecto en línea, probablemente lo estarás eventualmente. La alegría que sientes al desarrollar tu proyecto tiende a disminuir cuando se trata de las partes aburridas de la administración del sistema (por ejemplo, cargar tu base de código, modificar configuraciones, ejecutar comandos una y otra vez, etc.)
¡Pero no temas! Capistrano, la herramienta de automatización de tareas, está aquí para ayudar.
En este artículo de DigitalOcean, vamos a crear una configuración de servidor sólida como una roca, ejecutando la última versión de CentOS para alojar aplicaciones Ruby-on-Rails utilizando Nginx y Passenger. Continuaremos aprendiendo cómo automatizar el proceso de despliegues – y actualizaciones – utilizando la herramienta de automatización basada en Ruby, Capistrano.
Nota: Este artículo se basa en el conocimiento de nuestro artículo anterior sobre Capistrano: Automatización de implementaciones con Capistrano: Primeros pasos. Para obtener un buen conocimiento de la herramienta, lo cual es muy recomendable si vas a usarla, se te aconseja leerlo antes de continuar con este artículo. Del mismo modo, si deseas aprender más sobre cómo preparar un nuevo droplet para implementaciones de aplicaciones basadas en Rails con Passenger (y Nginx), consulta el artículo Cómo implementar aplicaciones de Rails usando Passenger con Nginx.
Nota: Capistrano depende de Git para las implementaciones. Para obtener más información, considera leer los artículos de la comunidad de DigitalOcean sobre el tema haciendo clic aquí.
Glosario
1. Preparando el servidor de implementación
- Actualización y preparación del sistema operativo
- Configuración del entorno Ruby y Rails
- Descarga e instalación de aplicaciones y servidores HTTP
- Creando el Script de Gestión de Nginx
- Configurando Nginx Para Implementación de Aplicaciones
- Descargando e Instalando Capistrano
- Creando un Usuario del Sistema Para Implementación
2. Preparando Aplicaciones de Rails Para Implementación con Capistrano Basado en Git
- Creando una Aplicación Básica de Ruby-On-Rails
- Creando un Repositorio de Git
3. Trabajando con Capistrano Para Automatizar Implementaciones
- Instalando Capistrano Dentro del Directorio del Proyecto
- Trabajando con
config/deploy.rb
Dentro del Directorio del Proyecto - Trabajando con
config/deploy/production.rb
Dentro del Directorio del Proyecto - Implementando en el Servidor de Producción
Preparando el Servidor de Implementación
Nota: Para tener una mejor comprensión de la siguiente sección, que puede considerarse un resumen extenso, consulte el artículo completo sobre el tema: Cómo implementar aplicaciones Rails usando Passenger con Nginx.
Actualización y preparación del sistema operativo
Ejecute el siguiente comando para actualizar las herramientas predeterminadas de su droplet basado en CentOS:
yum -y update
Instale el paquete que contiene las herramientas de desarrollo ejecutando el siguiente comando:
yum groupinstall -y 'development tools'
Algunos de los paquetes que necesitamos para este tutorial (por ejemplo, libyaml-devel, nginx, etc.) no se encuentran en el repositorio oficial de CentOS.
Ejecute lo siguiente para agregar el repositorio EPEL:
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
yum -y update
Finalmente, para instalar algunas bibliotecas y herramientas adicionales, ejecute el siguiente comando:
yum install -y curl-devel nano sqlite-devel libyaml-devel
Configuración del entorno Ruby y Rails
Nota: Esta sección es un resumen de nuestro artículo dedicado Cómo instalar Ruby 2.1.0 en CentOS 6.5.
Ejecute los siguientes dos comandos para instalar RVM y crear un entorno de sistema para Ruby:
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0
Dado que Rails necesita un intérprete de JavaScript, también necesitaremos configurar Node.js.
Ejecute lo siguiente para descargar e instalar nodejs usando yum
:
yum install -y nodejs
Ejecute el siguiente comando utilizando gem
de RubyGems para descargar e instalar rails
:
gem install bundler rails
Descargando e instalando servidores de aplicaciones y HTTP
Nota: Si su VPS tiene menos de 1 GB de RAM, deberá realizar el siguiente procedimiento sencillo para preparar un espacio de intercambio (SWAP) de disco de 1024 MB para ser utilizado como un soporte de datos temporal (sustituto de RAM). Dado que los servidores de DigitalOcean vienen con discos SSD rápidos, esto realmente no constituye un problema al realizar las tareas de instalación de aplicaciones de servidor.
# Crear un espacio SWAP de 1024 MB
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap
Phusion Passenger
El administrador de paquetes predeterminado de Red Hat Linux RPM (RPM Package Manager) proporciona aplicaciones contenidas en archivos .rpm
. Desafortunadamente, en el caso de Passenger, están bastante desactualizadas. Por lo tanto, utilizaremos RubyGem, una vez más, para descargar e instalar la última versión disponible de Passenger, versión 4.
Utiliza el siguiente comando para descargar e instalar Passenger:
gem install passenger
Nginx
Nota: Normalmente, para descargar e instalar Nginx, podrías agregar el repositorio EPEL (como ya hemos hecho) y obtener Nginx a través de yum
. Sin embargo, para que Nginx funcione con Passenger, su código fuente debe compilarse con los módulos necesarios.
Ejecuta lo siguiente para comenzar a compilar Nginx con el módulo nativo de Passenger:
passenger-install-nginx-module
Una vez que ejecutes el comando, presiona Enter y confirma tu elección de idioma(s) (es decir, Ruby, en nuestro caso). Puedes usar las teclas de flecha y la barra espaciadora para seleccionar solo Ruby, si lo deseas.
Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.
‣ ⬢ Ruby
⬢ Python
⬢ Node.js
⬡ Meteor
En el siguiente paso, elige Item 1
:
1. Yes: download, compile and install Nginx for me. (recommended)
The easiest way to get started. A stock Nginx 1.4.4 with Passenger
support, but with no other additional third party modules, will be
installed for you to a directory of your choice.
Y presiona Enter para continuar.
Ahora, se descargará, compilará e instalará el código fuente de Nginx con soporte para Passenger.
Nota: ¡Esta acción puede llevar un tiempo, probablemente más del que uno desearía o esperaría!
Creación del Script de Gestión de Nginx
Después de compilar Nginx, para poder controlarlo fácilmente, necesitamos crear un script de gestión simple.
Ejecuta los siguientes comandos para crear el script:
nano /etc/rc.d/init.d/nginx
Copia y pega el siguiente contenido:
#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
start
}
reload() {
configtest || return $?
echo -n $”Reloading $prog: ”
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
Presiona CTRL+X y confirma con Y para guardar y salir.
Establece el modo de este script de gestión como ejecutable:
chmod +x /etc/rc.d/init.d/nginx
Configurando Nginx Para el Despliegue de la Aplicación
En este último paso de configurar nuestros servidores, necesitamos crear un bloque de servidor Nginx, que se traduce aproximadamente a los hosts virtuales de Apache.
Como podrás recordar de la instalación de Passenger en Nginx, este procedimiento consiste en agregar un bloque de código al archivo de configuración de Nginx nginx.conf
. Por defecto, a menos que se especifique lo contrario, este archivo se puede encontrar en /opt/nginx/conf/nginx.conf
.
Escribe el siguiente comando para abrir este archivo de configuración y editarlo con el editor de texto nano:
nano /opt/nginx/conf/nginx.conf
Como primer paso, encuentra el nodo http {
y añade lo siguiente justo después de las directivas passenger_root
y passenger_ruby
:
# Solo para propósitos de desarrollo.
# Elimina esta línea cuando subas una aplicación real.
# Solo para * PRUEBAS *.
passenger_app_env development;
Desplázate hacia abajo en el archivo y encuentra server { ..
. Comenta la ubicación por defecto, es decir:
..
# location / {
# root html;
# index index.html index.htm;
# }
..
Y define la raíz de tu aplicación por defecto:
# Establezca la carpeta donde desplegará su aplicación.
# Estamos usando: /home/deployer/apps/my_app
root /home/deployer/apps/my_app/public;
passenger_enabled on;
Presione CTRL+X y confirme con Y para guardar y salir.
Ejecute lo siguiente para recargar Nginx con la nueva configuración de la aplicación:
# !! Recuerde crear un script de gestión de Nginx
# siguiendo el artículo principal de implementación de Rails para CentOS
# vinculado al principio de esta sección.
/etc/init.d/nginx restart
Para verificar el estado de Nginx, puede usar:
/etc/init.d/nginx status
Nota: Para obtener más información sobre Nginx, consulte Cómo Configurar el Servidor Web Nginx en un VPS.
Descarga e Instalación de Capistrano
Una vez que tengamos nuestro sistema listo, obtener la última versión de Capistrano, gracias a RubyGems, es muy fácil.
Simplemente puede usar lo siguiente para obtener la versión 3 de Capistrano:
gem install capistrano
Creación de un Usuario del Sistema para Despliegue
En este paso, vamos a crear un usuario del sistema CentOS para realizar las acciones de implementación. Este será el usuario que utilizará Capistrano.
Nota: Para mantener las cosas básicas, vamos a crear un usuario deployer
con los privilegios necesarios. Para una configuración más completa, considera usar el ejemplo de grupos del tutorial de introducción de Capistrano.
Crea un nuevo usuario del sistema deployer
:
adduser deployer
Configura la contraseña de deployer
:
passwd deployer
# Ingresa una contraseña
# Confirma la contraseña
Edita /etc/sudoers
usando el editor de texto nano
:
nano /etc/sudoers
Desplázate hacia abajo en el archivo y encuentra donde se define root
:
..
## La sección COMMANDS puede tener otras opciones agregadas.
##
## Permite a root ejecutar cualquier comando en cualquier lugar
root ALL=(ALL) ALL
..
Agrega lo siguiente justo después de root ALL=(ALL) ALL
:
deployer ALL=(ALL) ALL
Esta sección del archivo /etc/sudoers
debería verse así ahora:
..
## La sección COMMANDS puede tener otras opciones agregadas.
##
## Permite a root ejecutar cualquier comando en cualquier lugar
root ALL=(ALL) ALL
deployer ALL=(ALL) ALL
..
Pulsa CTRL+X y confirma con Y para guardar y salir.
Preparando Aplicaciones Rails Para Implementación de Capistrano Basada en Git
Una vez que tengamos nuestro sistema listo, con todas las aplicaciones necesarias configuradas y funcionando correctamente, podemos pasar a crear una aplicación de Rails ejemplar para usar como muestra.
En la segunda etapa, vamos a crear un repositorio de Git y enviar la base de código a un lugar central y accesible en GitHub para que Capistrano la utilice para implementaciones.
Nota: Aquí, estamos creando una aplicación de muestra. Para las implementaciones reales, debes realizar estas acciones por tu cuenta, después de asegurarte de que todo esté respaldado, ¡por si acaso! Además, ten en cuenta que deberás ejecutar Capistrano desde una ubicación diferente al servidor donde se debe implementar la aplicación.
Creación de una aplicación básica de Ruby-On-Rails
Nota: El siguiente paso es para crear una aplicación de Rails de sustitución para probar Capistrano.
Con Ruby y Rails ya instalados, nos queda solo un comando para comenzar.
Ejecuta el siguiente comando para que Rails cree una nueva aplicación llamada my_app:
# Crear una aplicación de muestra de Rails
rails new my_app
# Ingresar al directorio de la aplicación
cd my_app
# Crear un recurso de muestra
rails generate scaffold Task title:string note:text
# Crear una base de datos de muestra
RAILS_ENV=development rake db:migrate
Para comprobar que su aplicación está configurada correctamente y todo funciona bien, ingrese al directorio de la aplicación y ejecute un servidor simple a través de rails s
:
# Ingrese al directorio de la aplicación
cd my_app
# Ejecute un servidor simple
rails s
# Ahora debería poder acceder a él mediante
# visitando: http://[la IP de su droplet]:3000
# Para terminar el proceso del servidor,
# Presione CTRL+C
Creando Un Repositorio Git
Nota: Para aprender más sobre cómo trabajar con Git, consulte el tutorial Cómo Usar Git Eficazmente en las páginas de la comunidad de DigitalOcean.
Nota: Para seguir esta sección, necesitará una cuenta de Github. Alternativamente, puede configurar un droplet para alojar su propio repositorio Git siguiendo este artículo de DigitalOcean sobre el tema. Si decide hacerlo, asegúrese de usar la URL relevante en los archivos de despliegue.
Vamos a utilizar las instrucciones de muestra proporcionadas por Github para crear un repositorio fuente.
Ejecute los siguientes comandos autoexplicativos dentro del directorio my_app
para iniciar un repositorio:
# !! Estos comandos deben ejecutarse en
# tu máquina de desarrollo, desde donde
# implementarás en tu servidor.
# Las instrucciones pueden variar ligeramente según
# tu elección de sistema operativo.
#
# Asegúrate de establecer las rutas correctas para la aplicación
# De lo contrario, Nginx podría no poder localizarla.
# Iniciar el repositorio
git init
# Agregar todos los archivos al repositorio
git add .
# Confirmar los cambios
git commit -m "first commit"
# Agregar el enlace de tu repositorio de Github
# Ejemplo: git remote add origin [email protected]:[nombre de usuario]/[nombre del proyecto].git
git remote add origin [email protected]:user123/my_app.git
# Crear una clave RSA/SSH
# Seguir las instrucciones en pantalla
ssh-keygen -t rsa
# Ver el contenido de la clave y agregarlo a tu Github
# copiando y pegando desde la sesión remota actual
# visitando: https://github.com/settings/ssh
# Para obtener más información sobre el proceso,
# visita: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub
# Configurar tu información de Github
# Username:
# Uso: git config --global user.name "[tu nombre de usuario]"
git config --global user.name "user123"
# Email:
# Uso: git config --global user.email "[tu correo electrónico]"
git config --global user.email "[email protected]"
# Empujar el código fuente del proyecto a tu cuenta de Github
git push -u origin master
Trabajando con Capistrano para automatizar despliegues
Como recordarás de nuestro primer artículo sobre Capistrano, la forma de comenzar a usar la biblioteca es instalándola dentro del directorio del proyecto. En esta sección, veremos cómo hacer eso, seguido de la creación de archivos necesarios para configurar los servidores.
Instalando Capistrano dentro del directorio del proyecto
Otro paso simple en nuestro artículo es instalar los archivos de Capistrano. El siguiente comando creará algunos directorios y archivos para ser utilizados por la herramienta para el despliegue.
Ejecuta lo siguiente para iniciar (es decir, instalar) los archivos de Capistrano:
cap install
# mkdir -p config/deploy
# crear config/deploy.rb
# crear config/deploy/staging.rb
# crear config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified
Trabajando con config/deploy.rb dentro del directorio del proyecto
El archivo deploy.rb
contiene argumentos y configuraciones relevantes para el servidor(es) de implementación. Aquí, le diremos a Capistrano a qué servidor(es) nos gustaría conectarnos e implementar y cómo hacerlo.
Nota: Al editar el archivo (o definir las configuraciones), puedes comentarlas o agregar nuevas líneas. Asegúrate de no tener algunas configuraciones de ejemplo que anulen las que estás agregando.
Ejecuta lo siguiente para editar el archivo usando el editor de texto nano
:
nano config/deploy.rb
Agrega el siguiente bloque de código, modificándolo para que se adapte a tus propias configuraciones:
# Define el nombre de la aplicación
set :application, 'my_app'
# Define dónde puede acceder Capistrano al repositorio fuente
# set :repo_url, 'https://github.com/[nombre de usuario]/[nombre de la aplicación].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'
# Define dónde colocar el código de tu aplicación
set :deploy_to, "/home/deployer/apps/my_app"
set :pty, true
set :format, :pretty
# Establece las instrucciones posteriores al despliegue aquí.
# Una vez que se complete el despliegue, Capistrano
# comenzará a realizarlas según se describa.
# Para obtener más información sobre la creación de tareas,
# consulta:
# http://capistranorb.com/
# namespace: deploy do
# desc 'Reiniciar la aplicación'
# task :restart do
# en roles(:app), in: :sequence, wait: 5 do
# # Tu mecanismo de reinicio aquí, por ejemplo:
# execute :touch, release_path.join('tmp/restart.txt')
# end
# end
# después de :publishing, :restart
# después de :restart, :clear_cache do
# en roles(:web), in: :groups, limit: 3, wait: 10 do
# # Aquí podemos hacer cualquier cosa como:
# # dentro de release_path do
# # execute :rake, 'cache:clear'
# # end
# end
# end
# end
Pulsa CTRL+X y confirma con Y para guardar y salir.
Trabajando con config/deploy/production.rb dentro del directorio del proyecto
Nota: Similar a deploy.rb
, necesitarás hacer algunas modificaciones al archivo production.rb
. Es mejor modificar el código en lugar de agregar el bloque a continuación.
Ejecuta lo siguiente para editar el archivo usando el editor de texto nano
:
nano config/deploy/production.rb
Ingresa la configuración de tu servidor, similar a la siguiente:
# Definir roles, usuario y dirección IP del servidor de implementación
# role :nombre, %{[usuario]@[dirección IP]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db, %w{[email protected]}
# Definir servidor(es)
server '162.243.74.190', user: 'deployer', roles: %w{web}
# Opciones SSH
# Ver la sección de ejemplo comentada en el archivo
# para más opciones.
set :ssh_options, {
forward_agent: false,
auth_methods: %w(password),
password: 'user_deployers_password',
user: 'deployer',
}
Pulsa CTRL+X y confirma con Y para guardar y salir.
Implementación en el servidor de producción
Una vez que hayamos terminado con la configuración, es hora de implementar.
Ejecuta el siguiente código en tu máquina de desarrollo para implementar en el servidor de producción. Como se define en los archivos anteriores, Capistrano:
-
Se conectará al servidor de implementación
-
Descarga la fuente de la aplicación
-
Realiza las acciones de implementación (por ejemplo, reiniciar la aplicación con Passenger)
cap production deploy
Para obtener más información sobre Capistrano y lo que puede hacer, considera leer la documentación de Capistrano.
<div class=“author”>Enviado por: <a
href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>