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 montaremos un servidor rails con NginX, Puma y PostgreSQL en ubuntu 18.04

Esta guía no es complamente compatible con otros servidores u otras versiones de ubuntu

Paso 1: Actualización del server

Crear un server vacío con ubuntu 18.04

ssh al server con la ip dada

ssh [email protected]_del_server

Las acciones de esta parte suponen que el acceso a la máquina es de root, en caso contrario agrega sudo a las instrucciones hasta la sección hasta llegar a la instrucción donde nos conectamos como un usuario (al final del paso 2).

Dentro del servidor actualizamos los paquetes

apt-get update
apt-get upgrade

Luego reiniciamos la máquina.

reboot

y finalmente nos conectaremos de nuevo.

ssh [email protected]_del_server

Paso 2: 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)

adduser deploy

(anotar el pass para no olvidarlo)

Luego añadimos el usuario al grupo de sudoers

gpasswd -a deploy sudo

Salimos del server

exit

Y ahora nunca más entramos como usuario root.

Probando el acceso

Si lo hicimos bien deberíamos poder entrar al usuario deploy desde nuestra máquina local

su deploy

También deberíamos poder correr comandos sudo.

sudo ls

este último paso debería mostrar todos los archivo dentro de la carpeta.

Paso 3: 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)

ssh-copy-id [email protected]

Nos pedirá el password por última vez, luego podemos entrar sin clave a:

ssh [email protected]

3.1: En caso de no tener ssh-copy-id instalarlo en la máquina local

En mac:

brew install ssh-copy-id

En linux:

apt-get install ssh-copy-id

Paso 4: Instalar RVM

Dentro del servidor necesitamos Instalar los siguientes programas:

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

gpg —keyserver hkp://keys.gnupg.net —recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

Descargamos el script instalador de rvm y lo ejecutamos

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

Cargamos rvm en nuestra sesión actual:

source ~/.rvm/scripts/rvm

Para cargar siempre rvm (cuando realicemos nuevas conexiones ssh) vamos a agregar la línea anterior al archivo .bashrc, la forma más rápida es ejecutar lo siguiente en el terminal.

echo "~/.rvm/scripts/rvm" >> ~/.bashrc

Ei ahora corremos RVM deberíamos obtener un mensaje de ayuda y como usarlo.

Paso 5: Instalar Ruby

Instalamos la versión ruby 2.5.3 (la más actual al momento de la creación de este tutorial)

rvm install 2.5.3

Le pedimos a rvm que use por defecto la versión 2.5.3 (rvm puede manejar múltiples versiones)

rvm use 2.5.3 --default

Utilizamos rvmsudo para reparar los permisos de diversos programas y evitar futuros problemas de permisos.

rvmsudo /usr/bin/apt-get install build-essential openssl 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

Finalmente otro paso muy útil pero es sólo opcional es especificarle a nuestro servidor que no instale la documentación de las gemas. Esto nos ayudará a realizar nuestros deployment más rápido.

echo "gem: --no-ri --no-rdoc" > ~/.gemrc

Paso 6: Instalar Nginx

sudo apt-get install nginx

Hacemos correr Nginx

sudo service nginx start

Sin más configuración deberíamos poder entrar a la ip del servidor con nuestro navegador y ver:

nginx página de inicio

nginx página de inicio

No hemos terminado la configuración de Nginx pero con rails podemos generarla automáticamente, así que la estudiaremos cuando terminemos la instalación de los programas necesarios. El link al tutorial siguiente aparece al final de este.

Paso 7: Instalar Postgres y crear usuario

Instalar postgres

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)

sudo su postgres

y luego entramos a postgres con la linea.

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

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:

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.

\du

9.2 Crear la base de datos

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.

GRANT ALL PRIVILEGES ON DATABASE nombre_base_datos to nombre_base_usuario;

para salir del entorno de psql utilizamos:

\q

Finalmente cerramos la sesión con:

exit

ya tenemos todas las herramientas necesarias y podemos utilizarlas para hacer un deploy automatizado con capistrano.