Montando un servidor de rails en amazon, digital ocean o linode.

Motivación: Si hay scripts que automáticamente instalan rails con todo en linux es lógico preguntarse porque pasar por el suplicio de hacer una instalación custom, pero la razón es sencilla, en la mayoría de los casos el script que hace la instalación no utiliza el mismo stack que nosotros queremos, o instala aplicaciones demás que consumen mucha memoria ram.
En este tutorial aprenderás a montar un servidor rails con NginX, Passenger y PostgreSQL en ubuntu 14.04 y 14.10
Esta guía no es compatible con ubuntu 15.04
Paso 1: Setup
Crear un server vacío con ubuntu 14.10
ssh al server con la ip dada
1 |
ssh root@ip_del_server |
Opcional: Si el servidor te pide que actualices los paquetes de internacionalización hazlo.
actualizar paquetes
1 |
apt-get update |
1 |
apt-get upgrade |
luego reinicia la máquina
1 |
reboot |
y finalmente conéctate de nuevo.
1 |
ssh root@ip_del_server |
Paso 1: Crear al usuario deploy dentro del server
Cuando instalas programas como root estos le pertenecen a root, lo que nos va a causar problemas de permisos, además es simplemente peligroso, uno nunca debería trabajar como root, en lugar de eso vamos a crear el usuario deploy.
Aclaración (El nombre deploy es un buen nombre para el usuario de deployment, pero no es necesario que sea este, de todas formas al seguir el tutorial desaconsejo cambiarlo)
1 |
adduser deploy |
(anotar el pass para no olividarlo)
Añadir al usuario al grupo de sudoers
1 |
gpasswd -a deploy sudo |
Salimos del server
1 |
exit |
Y ahora nunca más entramos como root.
si lo hicimos bien deberíamos poder entrar al usuario deploy
1 |
su deploy |
y además ahora como deploy deberíamos poder correr comandos sudo.
1 |
sudo ls |
eso debería mostrar todos los archivo dentro de la carpeta.
Paso 2: Acceso directo y sin clave por ssh a [email protected]
Copiamos nuestra clave pública al llavero del usuario deploy. (Esto se hace desde nuestro computador, no del server)
1 |
ssh-copy-id deploy@IPADDRESS |
sabrás que este proceso lo hiciste bien si te pide el password del usuario deploy que acabas de crear en la etapa anterior y probemos que funciona con
1 |
ssh deploy@ipaddress |
si no pide password estamos ok. el root sigue pidiendo clave, el deploy ya no la pide, puedes copiar también la clave al root si lo deseas, pero no es necesario.
Si falla [Y SOLO SI FALLA] porque no encuentra el comando ssh-copy-id entonces puedes instalarlo a través de tu administrador de paquetes
En mac:
1 |
brew install ssh-copy-id |
En linux:
1 |
apt-get install ssh-copy-id |
Paso 3: Actualizando paquetes e instalando paquetes claves
A partir de este momento es necesario entrar al server con el usuario deploy
Primero actualizamos los paquetes
1 |
sudo apt-get update |
Ojo que el texto a continuación no tiene saltos de línea.
1 |
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties |
y ahora upgradeamos
1 |
sudo apt-get upgrade |
Paso 4: Instalar RVM
Instalamos librerías necesarias:
1 |
sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev |
Descargamos la llave pública de RVM para verificar los contenidos descargados
1 |
gpg —keyserver hkp://keys.gnupg.net —recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 |
Descargamos el script instalador de rvm y lo ejecutamos
1 |
curl -L https://get.rvm.io | bash -s stable |
Dejamos corriendo rvm en nuestra sesion actual:
1 |
source /home/deploy/.rvm/scripts/rvm |
Para cargar siempre rvm en el entorno vamos a correr la siguiente línea
1 |
echo "/home/deploy/.rvm/scripts/rvm" >> ~/.bashrc |
si ahora corremos RVM deberíamos obtener un mensaje de ayuda y como usarlo.
Paso 5: Instalar Ruby
instalamos la versión ruby 2.2.0 (la más actual al momento de la creación de este tutorial)
1 |
rvm install 2.2.0 |
Le pedimos a rvm que use por defecto la versión 2.2.0 (rvm puede manejar múltiples versiones
1 |
rvm use 2.2.0 --default |
Utilizamos rvmsudo para reparar los permisos de diversos programas y evitar futuros problemas de permisos.
1 |
rvmsudo /usr/bin/apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion |
Otra cosa útil pero es sólo opcional es especificar que no instale la documentación de las gemas, esto nos va a ayudar a instalar rails de forma mucho más rápida
1 |
echo "gem: --no-ri --no-rdoc" > ~/.gemrc |
Paso 6: Instalar Nginx
# Install Phusion’s PGP key to verify packages
1 2 |
gpg --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7 gpg --armor --export 561F9B9CAC40B2F7 | sudo apt-key add - |
# Add HTTPS support to APT
1 |
sudo apt-get install apt-transport-https |
# Add the passenger repository
1 |
sudo sh -c "echo 'deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main' >> /etc/apt/sources.list.d/passenger.list" |
1 |
sudo chown root: /etc/apt/sources.list.d/passenger.list |
1 2 |
sudo chmod 600 /etc/apt/sources.list.d/passenger.list sudo apt-get update |
Install nginx and passenger
1 |
sudo apt-get install nginx-full passenger |
Hacemos correr Nginx
1 |
sudo service nginx start |
El paso lo hicimos bien si al entrar con el navegador a la IP, deberías ver la página de NginX
Paso 7: Habilitando passenger en NginX
Para los siguientes pasos puedes ocupar Vim u otro editor a elección como nano o emacs.
1 |
sudo vim /etc/nginx/nginx.conf |
dentro del archivo nginx.con tenemos que especificar el passenger_root, busca donde están dentro del archivo, van a estar comentadas dentro (anteponen un signo #) y cambia esas líneas por esta, si son las mismas puedes simplemente eliminar el comentario (el signo #)
1 2 |
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini; passenger_ruby /home/deploy/.rvm/wrappers/ruby-2.2.0/ruby; |
y luego reiniciamos el servidor
1 |
sudo service nginx restart |
si el server no reinicia bien puedes revisar los logs
1 |
sudo tail /var/log/nginx/error.log |
Paso 8: Instalar Postgres y crear usuario
Instalar postgres
1 |
sudo apt-get install postgresql postgresql-contrib libpq-dev |
Opcional Para guardar el historial
sudo touch /var/lib/postgresql/.psql_history
Entra a postgres, Utiliza el usuario de postgres del sistema (no podemos entrar a postgres siendo otros usuarios)
1 |
sudo su postgres |
y luego entramos a postgres con la linea.
1 |
psql |
Paso 9: Crear un usuario dentro de Postgre
9.1 Crear usuario
Crea un usuario, yo utilizo el nombre de la aplicación con alguna variante, pero también podría ser uno genérico como deploy).
Recordar el ; al final de la línea de comando, ya no estamos en entorno bash, estamos entorno PSQL, Utiliza un password seguro
1 |
create user nombre_usuario with password 'xyz'; |
Si resultó bien, postgre responderá con CREATE ROLE
Opcional: Si queremos cambiar el password del usuario lo podemos hacer con:
1 |
alter user nombre_usuario with password 'xyz' |
podemos ver todos los usuarios creados en postgre con, aquí deberíamos ver al usuario que acabamos de crear.
1 |
\du |
9.2 Crear la base de datos
1 |
create database nombre_base_de_datos; |
Sugerencia: El nombre de la app + _production es un buen nombre para el de la base de datos.
Si lo haces correctamente postgre responderá con
CREATE DATABASE
9.3 darle permisos al usuario
Entregamos los privilegios del usuario a la base de datos.
1 |
GRANT ALL PRIVILEGES ON DATABASE nombre_base_datos to nombre_base_usuario; |
para salir del entorno de psql utilizamos:
1 |
\q |
finalmente para salir del usuario postgre basta con escribir en el bash:
1 |
exit |
Paso 10: Seteando el virtual host default
10.0 Explicación de los virtual hosts (sólo leer)
Nginx ocupa el mismo sistema de virtual hosts que apache
para eso ocupa dos carpetas /etc/nginx/sites-available y /etc/nginx/sites-enable
cuando uno empieza a crear uno nuevo lo pone sites-available y cuando lo quiere activar lo copia a través de un link simbólico a sites enable
ln -s ruta_completa_al_site_available ruta_destino
Nota: Editar el contenido del link simbólico o del original causa el mismo efecto.
Sin embargo nosotros estamos trabajando con el archivo default, este virtual host ya viene copiado, por lo que no tenemos que hacer nada, la explicación anterior es exclusivamente para cuando queremos poner más de una aplicación de rails en nuestro sitio.
paso 10.1 Configurando el virtual host por default
El siguiente paso consiste en editar el archivo /etc/nginx/sites-available/default
1 |
sudo vim /etc/nginx/sites-available/default |
puedes comentar el contenido que existe actualmente para no perderlo, o puedes incluso hacerle una copia, pero lo importante es que dentro del archivo vaya el siguiente contenido.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name mydomain.com; passenger_enabled on; rails_env production; root /home/deploy/nombre_proyecto/current/public; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } |
donde dice nombre_proyecto debe ir el nombre de la carpeta de tu proyecto.
donde dice mydomain.com debería el nombre de tu dominio comprado en nic chile o godaddy, sin embargo como es nuestro virtual host por default también será capaz de responder a la ip, en ese caso simplemente no ponemos la directiva server_name.
para hacer valer los cambios:
1 |
sudo service nginx restart |
si hay un fallo en el archivo es posible revisar los logs de nginx con
sudo tail -n 50 /var/log/nginx/error.log
tail te muestra las últimas n lineas, 50 es el n, puedes también ocupar cat, pero a medida que crezca el log se va demorar más.
finalmente lo que tenemos que hacer es copiar nuestra app corriendo de rails a nombre_proyecto/current
ahora, ¿Por qué ocupar una carpeta llamada current, porque en la siguiente tutorial vamos a aprender a hacer deployment automatizado con Capistrano.
Pingback: Deployment automatizado en Rails con Capistrano - Desafio Latam()