Cómo subir un proyecto Roots a Digital Ocean
José Debuchy
Wordpress
En el primer post de la serie ya vimos cómo crear un proyecto local en Roots desde cero.
Otra de las grandes virtudes de Roots, en particular de Trellis, es que nos permite instalar un servidor optimizado para WordPress con apenas algunos comandos.
Si uno desea tener mayor control sobre el servidor, Digital Ocean ofrece droplets por 5 dólares mensuales, un precio muy accesible en relación a proveedores de hosting compartido.
Con este “referral code” tenés 100 dólares para utilizar libremente durante 2 meses.
Crear un Droplet en Digital Ocean
Una vez creada una cuenta en Digital Ocean, y agregado un método de pago, elegimos la opción “Host a website or static site” en esta pantalla.
Luego elegimos la opción “Deploy an Ubuntu server”.
Y elegimos las características que queremos del servidor.
Versión de Ubuntu
Para elegir la versión de Ubuntu que vamos a utilizar, sugiero ir al repo de Trellis y tomar la última versión soportada por el proyecto. En este caso vamos a elegir la versión 20.04 (LTS) x64.
Opciones de CPU
Dependerá de las características del proyecto. Pero para arrancar un CPU regular Intel de 1GB a un costo de 5$/mes es más que suficiente.
Block Storage
No es necesario.
Ubicación
También nos va a preguntar dónde queremos que se ubique el servidor.
VPC Network
No es necesario para proyectos básicos.
Autenticación
Este tipo de servidores utiliza el protocolo Secure Shell (SSH) para acceder al servidor.
Para acceder mediante este protocolo tenemos 2 alternativas:
1. Con las SSH keys
Tenemos que tener creada o crear una ssh key. Acá hay una buena guía para crearla, en caso de no tenerla. Y luego la agregamos yendo a la terminal, ejecutando cat ~/.ssh/.id_rsa.pub
y copiando todo el contenido del archivo (comienza con ssh-rsa ...
), pegándolo en Digital Ocean y dándole un nombre. Esta es la opción más segura.
2. Con un password
Esta es una opción menos segura. Es importante guardar la contraseña root en caso de que hubiera algún inconveniente con el servidor.
Hostname
Es un nombre interno para que nosotros podamos recordar.
Tags
Son opcionales. Se pueden utilizar cuando se tienen muchos recursos en uso.
Backups
Esta opción resulta útil en caso de tener un servidor en producción.
Variables Trellis
Una vez que creamos el servidor DigitalOcean nos proveerá un número de IP que nos permitirá vincular los dominios y a su vez, generar el setup del server. Pero antes vamos a configurar todas las variables necesarias para poder instalar un software óptimo.
Dentro de la carpeta trellis/group_vars
vamos a ver que tenemos 4 carpetas. Estas carpetas hacen referencia a variables que formarán parte de los entornos que utilicemos. Las variables que agreguemos en all
se aplicarán a todos los entornos. En nuestro caso, vamos a trabajar con el entorno de producción.
wordpress_sites.yml
Vamos a production/wordpress_sites.yml
. En este archivo vamos a reemplazar example.com
por nuestro dominio de producción y configurar los siguientes valores.
En nuestro caso nuestro dominio en producción será un subdominio. elfaro.40q.agency
wordpress_sites:
elfaro.40q.agency:
site_hosts:
- canonical: elfaro.40q.agency
redirects:
- www.elfaro.40q.agency
local_path: ../site # path targeting local Bedrock site directory (relative to Ansible root)
repo: git@github.com:40Q/elfaro.git # replace with your Git repo URL
repo_subtree_path: site # relative path to your Bedrock/WP directory in your repo
branch: master
multisite:
enabled: false
ssl:
enabled: false
provider: letsencrypt
cache:
enabled: false
Básicamente lo que se hizo fue configurar un dominio principal para correr los comandos, indicarle la url del repositorio donde se encuentra el proyecto y configurar SSL.
En este link de la documentación de Roots encontrarás todas las opciones disponibles.
Una vez que completamos la información vamos a vault.yml
Vamos a ver que hay un archivo de estos por cada entorno. La idea es separar la información sensible del proyecto para que pueda ser encriptada y no quede expuesta en el repositorio. Para encriptar estos archivos vamos a utilizar la forma manual que sugiere la documentación (también se podría utilizar la cli de Trellis).
En este archivo debemos reemplazar example.com
por el dominio que vamos a utilizar (en este caso, elfaro.40q.agency
y completar todos los valores que van a tener tanto el usuario root de MySQL del servidor, el admin user (no tocar {{ admin_user }}
) también las salt keys siguiendo el link del comentario (https://roots.io/salts.html).
# Documentation: <https://roots.io/trellis/docs/vault/>
vault_mysql_root_password: productionpw
# Documentation: <https://roots.io/trellis/docs/security/>
vault_users:
- name: "{{ admin_user }}"
password: example_password
salt: "generateme"
# Variables to accompany `group_vars/production/wordpress_sites.yml`
# Note: the site name (`example.com`) must match up with the site name in the above file.
vault_wordpress_sites:
elfaro.40q.agency:
env:
db_password: example_dbpassword
# Generate your keys here: <https://roots.io/salts.html>
auth_key: "generateme"
secure_auth_key: "generateme"
logged_in_key: "generateme"
nonce_key: "generateme"
auth_salt: "generateme"
secure_auth_salt: "generateme"
logged_in_salt: "generateme"
nonce_salt: "generateme"
Para encriptar todas estas variables seguimos los siguientes pasos:
1. Creamos el password
– Dentro de la carpeta trellis
creamos el archivo .vault_pass
y agregamos, en forma plana, el password que queremos asignar.
– Podemos ejecutar chmod 600 .vault_pass
para restringir el acceso al archivo.
– Ese archivo se encuentra en el .gitignore
de la carpeta de trellis, de todas maneras, no está de más revisar y cerciorarse que no se va a enviar al repo.
2. Informamos a Ansible sobre el password Le informamos a ansible acerca de este archivo en ansible.cfg
# ansible.cfg
[defaults]
roles_path = vendor/roles
force_handlers = True
inventory = hosts
vault_password_file = .vault_pass
3. Encriptamos los archivos
Con este comando vamos a encriptar todos los archivos vault.yml
del proyecto. Desde la carpeta trellis
$ ansible-vault encrypt group_vars/all/vault.yml group_vars/development/vault.yml group_vars/staging/vault.yml group_vars/production/vault.yml
De la misma manera, si quisiéramos desencriptar correríamos el mismo comando anterior pero con decrypt
$ ansible-vault decrypt group_vars/all/vault.yml group_vars/development/vault.yml group_vars/staging/vault.yml group_vars/production/vault.yml
Setup inicial mediante Trellis
En la carpeta trellis
de nuestro proyecto primero vamos a la carpeta hosts y elegimos el entorno que queremos asignar a esta ip. En nuestro caso vamos a production
y reemplazamos your_server_hostname
por el número de IP.
Apuntar dominio al Servidor
Esto dependerá de donde hagan la gestión de dominio. Pero deberán apuntar los registros A a la dirección IP que tiene asignada el droplet que creamos en Digital Ocean. En este caso,
A elfaro.40q.agency 147.182.142.67
Provisión del Servidor
Hasta el momento estos fueron los pasos que seguimos:
- Creado el droplet en Digital Ocean
- Configurado las variables en
wordpress_sites.yml
yvault.yml
en el entorno que queremos trabajar. - Tomado la IP que nos proveé Digital Ocean e indicándole a Trellis esa información.
Una vez realizados estos pasos estamos en condiciones de hacer el setup del servidor en Digital Ocean. Vamos a realizarlo con ayuda de la trellis-cli
.
trellis provision production
Por detrás, gracias a Ansible, se habrá creado un servidor con estas características:
- Nginx
- MariaDB (MySQL drop-in replacement)
- PHP 7.4 (+ extensions)
- Composer
- WP-CLI
- sSMTP
- Memcached
- Fail2ban
- ferm (firewall)
- Mailhog
Deploy del código
Utilizaremos una vez más la CLI de Trellis para hacer un deployment del código. En otra ocasión contaremos cuáles son los beneficios de hacer un deployment con estas herramientas contra hacerlo mediante FTP, por ejemplo.
Corriendo el comando trellis deploy production
Ansible ejecutará una serie de pasos que, clonando los archivos que tenemos de referencia en el repositorio que indicamos, los ubicará en una carpeta temporal y, tras hacer distintas revisiones, creará un symlink que será la última versión estable del sitio, con 0 tiempo de caída y posibilidad de dar marcha atrás con los cambios en caso de ser necesario.
Si todos los pasos salen bien tendríamos que ir al browser, buscar la url (en nuestro caso elfaro.40q.agency) y debería aparecer la pantalla de instalación de WordPress.
Tarea hecha 💪