Skip to content

Cómo subir un proyecto Roots a Digital Ocean

José Debuchy

Jun 30, 2021 | 8 min to read |

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:

  1. Creado el droplet en Digital Ocean
  2. Configurado las variables en wordpress_sites.yml y vault.yml en el entorno que queremos trabajar.
  3. 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 💪

Pantalla de Bienvenida de WordPress