Cómo instalar Drupal con Docker en Ubuntu 22.04

Drupal es un sistema de gestión de contenidos (CMS) de código abierto escrito en PHP. Muchas organizaciones de todo el mundo lo utilizan para crear blogs, sitios gubernamentales, sitios web corporativos y mucho más. Viene con un conjunto creciente de características y módulos para ampliar su funcionalidad, permitiéndote crear cualquier sitio web que desees.

Este tutorial te enseñará a instalar Drupal utilizando Docker en un servidor Ubuntu 22.04. Drupal funciona con PHP 8.2 y MySQL. También soporta PostgreSQL desde la versión 9, pero hay algunos errores. Por lo tanto, nos ceñiremos al uso de MySQL para nuestro tutorial. Utilizaremos Docker Compose para integrar Drupal con Nginx y la herramienta Certbot para servir un sitio web Drupal en protocolo seguro HTTPS.

Requisitos previos

  • Un servidor que ejecute Ubuntu 22.04 con un mínimo de 1 GB de RAM para comunidades más pequeñas. Para alojar comunidades más grandes, debes conseguir un servidor con un mínimo de 2GB de RAM o más.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) que apunte a tu servidor. Para nuestros propósitos, utilizaremos example.com como nombre de dominio.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update
    
  • Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.
    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

Paso 1 – Configurar el Cortafuegos

El primer paso es configurar el cortafuegos. Ubuntu viene con ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Deberías obtener la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver un resultado similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala Docker y Docker Compose

Ubuntu 22.04 incluye una versión antigua de Docker. Para instalar la última versión, importa primero la clave GPG de Docker.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Crea un archivo de repositorio de Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala la última versión de Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Comprueba que se está ejecutando.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2054 (dockerd)
      Tasks: 52
     Memory: 22.5M
        CPU: 248ms
     CGroup: /system.slice/docker.service
             ??  2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Por defecto, Docker requiere privilegios de root. Si quieres evitar utilizar sudo cada vez que ejecutes el comando docker, añade tu nombre de usuario al grupo docker.

$ sudo usermod -aG docker $(whoami)

Tendrás que salir del servidor y volver a entrar como el mismo usuario para activar este cambio o utilizar el siguiente comando.

$ su - ${USER}

Confirma que tu usuario se ha añadido al grupo Docker.

$ groups
navjot wheel docker

Paso 3 – Crear el archivo Docker Compose para Drupal

Crea el directorio para Drupal.

$ mkdir ~/drupal

Cambia al directorio.

$ cd ~/drupal

Crea y abre el archivo docker-compose.yml para editarlo.

$ nano docker-compose.yml

Pega en él el siguiente código.

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    env_file: .env
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - internal
  
  drupal:
    image: drupal:10-fpm-alpine
    container_name: drupal
    depends_on:
      - mysql
    restart: unless-stopped
    networks:
      - internal
      - external
    volumes:
      - drupal-data:/var/www/html
  
  webserver:
    image: nginx:1.22.1-alpine
    container_name: webserver
    depends_on:
      - drupal
    restart: unless-stopped
    ports:
      - 80:80
    volumes:
      - drupal-data:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
    networks:
      - external
  
  certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - drupal-data:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d example.com -d www.example.com

networks:
  external:
    driver: bridge
  internal:
    driver: bridge

volumes:
  drupal-data:
  db-data:
  certbot-etc:

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Repasemos cada uno de los servicios definidos en el archivo anterior.

Servicio Docker MySQL

Aquí estamos sacando la última imagen mysql:8.0 del hub Docker. Estamos utilizando la versión 8.x en lugar de utilizar la última etiqueta. De esta forma nos ceñimos a la versión estable y probada de MySQL que funciona con Drupal. Hemos establecido un nombre para el contenedor, que puede utilizarse con los comandos Docker para detenerlo, iniciarlo y ver los registros. El contenedor seguirá funcionando a menos que se detenga manualmente. Hemos definido un archivo .env que rellenaremos con las credenciales de MySQL. También hemos montado un volumen con nombre db-data en el directorio /var/lib/mysql del contenedor. El servicio MySQL utilizará una red interna para conectarse con drupal.

Servicio Drupal

Estamos utilizando la imagen Alpine de Drupal 10. Las imágenes docker Alpine son de menor tamaño. Esta imagen también contiene PHP-FPM para gestionar el procesamiento PHP. Esto funcionará junto con Nginx para servir el sitio. La opción depends_on indica a Drupal que se conecte con el servicio MySQL. También garantiza que el contenedor de Drupal se iniciará siempre después del contenedor de MySQL. Drupal utiliza la red interna para conectarse con MySQL y la red externa para exponerse a otros contenedores. También hemos creado un volumen con nombre para que Drupal apunte al directorio /var/www/html en el contenedor.

Servicio Nginx

Estamos utilizando una imagen Alpine para Nginx. Expone el puerto 80 al host. Utilizamos dos volúmenes con nombre, uno para el directorio público de Drupal y otro para almacenar los certificados SSL Let’s Encrypt. El tercer volumen está vinculado al directorio de configuración de Nginx en el host, que definiremos más adelante. Nginx también se conecta a una red Docker externa para que funcione el sitio Drupal.

Servicio Certbot

Y por último, tiramos de la imagen Certbot para instalar certificados SSL. Comparte sus volúmenes con el servicio Nginx para los certificados y la definición de webroot. También hemos incluido un comando que se ejecutará cuando se cree el contenedor. Aquí el comando utiliza la bandera --staging para obtener un servidor de prueba por primera vez. Necesitamos que nginx valide los certificados, pero Nginx no se iniciará si faltan los certificados. Por eso crearemos un certificado de prueba, lo utilizaremos para iniciar Nginx y luego crearemos los certificados reales.

Paso 4 – Crear la configuración de Nginx

Crea el directorio para la configuración de Nginx.

$ mkdir nginx-conf

Crea y abre el archivo para Nginx.

$ nano nginx-conf/drupal.conf

Pega en él el siguiente código.

server {
    listen 80;
    listen [::]:80;

    server_name drupal.example.com;

    index index.php index.html index.htm;

    root /var/www/html;

    location ~ /.well-known/acme-challenge {
        allow all;
        root /var/www/html;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass drupal:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico { 
        log_not_found off; access_log off; 
    }
    location = /robots.txt { 
        log_not_found off; access_log off; allow all; 
    }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

En este archivo, añadiremos un bloque de servidor con directivas para el nombre de nuestro servidor y la raíz del documento, y bloques de ubicación para dirigir la solicitud del cliente Certbot de certificados, el procesamiento PHP y las solicitudes de activos estáticos. Por ahora, el Nginx sólo escuchará en el puerto 80 para permitir que Certbot solicite el certificado de staging colocando un archivo temporal en el directorio /var/www/html/.well-known/acme-challenge para validar el DNS. Esto nos permite utilizar Certbot con el plugin de webroot.

Paso 5 – Generar certificados SSL

Para generar los certificados SSL, iniciaremos nuestros contenedores. Los certificados correctos estarán disponibles en la carpeta /etc/letsencrypt/live del contenedor Nginx.

$ docker compose up -d

Comprueba el estado de los servicios.

$ docker compose ps
NAME                IMAGE                  COMMAND                  SERVICE             CREATED             STATUS                     PORTS
certbot             certbot/certbot        "certbot certonly --…"   certbot             6 minutes ago       Exited (1) 5 minutes ago
drupal              drupal:10-fpm-alpine   "docker-php-entrypoi…"   drupal              6 minutes ago       Up 6 minutes               9000/tcp
mysql               mysql:8.0              "docker-entrypoint.s…"   mysql               6 minutes ago       Up 6 minutes               3306/tcp, 33060/tcp
webserver           nginx:1.22.1-alpine    "/docker-entrypoint.…"   webserver           6 minutes ago       Up 6 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp

El contenedor Certbot sale correctamente después de generar el certificado. Comprueba la ubicación de los certificados en el contenedor Nginx.

$ docker compose exec webserver ls -la /etc/letsencrypt/live

Obtendrás la siguiente salida.

total 16
drwx------    3 root     root          4096 Jan 17 09:15 .
drwxr-xr-x    9 root     root          4096 Jan 17 09:15 ..
-rw-r--r--    1 root     root           740 Jan 17 09:15 README
drwxr-xr-x    2 root     root          4096 Jan 17 09:15 drupal.example.com

Esto confirma que todo ha ido bien. El siguiente paso es generar los certificados reales.

Abre el archivo docker-compose.yml para editarlo.

$ nano docker-compose.yml

Sustituye la bandera --staging en la sección del servicio Certbot y sustitúyela por la bandera --force-renewal. Esto indica a Certbot que solicite nuevos certificados para tu dominio. Se utiliza la bandera de renovación porque se utilizará para renovar los certificados de aquí en adelante.

  certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - drupal-data:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email --staple-ocsp --force-renewal -d drupal.example.com

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Ejecuta de nuevo el comando docker compose up para volver a crear el contenedor de Certbot. La bandera --no-deps indica a Certbot que no inicie el contenedor webserver, puesto que ya se está ejecutando.

$ docker compose up --force-recreate --no-deps certbot

Obtendrás la siguiente salida.

[+] Running 1/0
 ? Container certbot  Recreated                                                                                                                                                                             0.1s
Attaching to certbot
certbot  | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot  | Account registered.
certbot  | Renewing an existing certificate for drupal.example.com
certbot  |
certbot  | Successfully received certificate.
certbot  | Certificate is saved at: /etc/letsencrypt/live/drupal.example.com/fullchain.pem
certbot  | Key is saved at:         /etc/letsencrypt/live/drupal.example.com/privkey.pem
certbot  | This certificate expires on 2023-04-17.
certbot  | These files will be updated when the certificate renews.
certbot  | NEXT STEPS:
certbot  | - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
certbot  |
certbot  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
certbot  | If you like Certbot, please consider supporting our work by:
certbot  |  * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
certbot  |  * Donating to EFF:                    https://eff.org/donate-le
certbot  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
certbot exited with code 0

Paso 6 – Configurar Nginx para SSL

Ahora que nuestros certificados están activos, tenemos que configurar Nginx para que los sirva y redirija las peticiones HTTP a HTTPS.

Detén el servidor Nginx.

$ docker stop webserver

Crea un nuevo archivo Nginx para la configuración SSL y ábrelo para editarlo.

$ nano nginx-conf/drupal-ssl.conf

Pega en él el siguiente código.

server {
    listen 80;
    listen [::]:80;

    server_name drupal.example.com;

    location ~ /.well-known/acme-challenge {
        allow all;
        root /var/www/html;
    }

    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name drupal.example.com;

    index index.php index.html index.htm;

    root /var/www/html;

    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/drupal.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/drupal.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/drupal.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_ecdh_curve secp384r1;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass drupal:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off; access_log off;
    }
    location = /robots.txt {
        log_not_found off; access_log off; allow all;
    }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

El bloque HTTP especifica la ubicación del plugin webroot de Certbot y redirige cualquier petición HTTP a HTTPS.

El siguiente paso es asegurarse de que el contenedor Nginx escucha el puerto 443. Abre el archivo docker-compose.yml para editarlo.

$ nano docker-compose.yml

En la sección Nginx del archivo, haz cambios para exponer 443 y habilitar SSL como se muestra a continuación.

  webserver:
    image: nginx:1.22.1-alpine
    container_name: webserver
    depends_on:
      - drupal
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes:
      - drupal-data:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
      - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem
    networks:
      - external

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Ahora que hemos habilitado y añadido la configuración SSL para Nginx, puedes eliminar el antiguo archivo de configuración HTTP.

$ rm nginx-conf/drupal.conf

Antes de reiniciar Nginx, necesitamos generar un certificado de grupo Diffie-Hellman que ya hemos configurado anteriormente.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Vuelve a crear el contenedor Nginx.

$ docker compose up -d --force-recreate --no-deps webserver

Comprueba el estado de los contenedores.

$ docker compose ps
NAME                IMAGE                  COMMAND                  SERVICE             CREATED             STATUS                   PORTS
certbot             certbot/certbot        "certbot certonly --…"   certbot             3 hours ago         Exited (0) 3 hours ago
drupal              drupal:10-fpm-alpine   "docker-php-entrypoi…"   drupal              3 hours ago         Up 3 hours               9000/tcp
mysql               mysql:8.0              "docker-entrypoint.s…"   mysql               3 hours ago         Up 3 hours               3306/tcp, 33060/tcp
webserver           nginx:1.22.1-alpine    "/docker-entrypoint.…"   webserver           15 seconds ago      Up 13 seconds            0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp

Paso 7 – Iniciar el Instalador Web de Drupal

Es hora de iniciar el instalador web de Drupal. Abre la URL https://drupal.example.com en tu navegador y obtendrás la siguiente pantalla.

Instalador de Drupal Inicio

Haz clic en el botón Guardar y continuar para pasar a la página Perfil de instalación.

Perfil de instalación de Drupal

Nos ceñiremos al perfil Estándar. Haz clic en el botón Guardar y continuar para pasar a la página de configuración de la base de datos.

Configuración de la base de datos de Drupal

Introduce las credenciales de la base de datos que utilizamos en el archivo de entorno, amplía la sección Opciones avanzadas e introduce mysql como host de la base de datos. Esto coincide con el nombre del servicio MySQL en nuestro archivo Docker compose con el que Drupal necesitará conectarse.

Haz clic en el botón Guardar y continuar para continuar. Drupal empezará a instalar los módulos y temas predeterminados.

Instalador de módulos y temas de Drupal

A continuación, accederás a la página de configuración de Drupal. Rellena el nombre del sitio, el correo electrónico, el nombre de usuario, la contraseña y la configuración regional. Haz clic en el botón Guardar y continuar cuando hayas terminado.

Configuración del sitio Drupal

Por último, accederás al panel de control de Drupal. Ya puedes empezar a utilizar Drupal para crear tu sitio web.

Panel Drupal

Paso 8 – Configurar Drupal

Este paso es opcional pero ayuda a mejorar el rendimiento de Drupal. El primer paso es establecer el nivel de aislamiento de transacciones de MySQL. El nivel de aislamiento de transacciones por defecto para MySQL, MariaDB y bases de datos equivalentes es «LECTURA REPETIBLE». Esta configuración con Drupal puede provocar bloqueos en las tablas, lo que hará que el sitio se vuelva muy lento o no responda en absoluto. El nivel de aislamiento de transacciones recomendado para los sitios Drupal es «READ COMMITTED».

Accede al shell SSH del contenedor MySQL.

$ docker exec -it mysql bash

Abre el shell de MySQL utilizando el usuario root.

bash-4.4# mysql -u root -p
Enter password:

Ejecuta el siguiente comando para cambiar el nivel de transacción globalmente.

mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

Sal del intérprete de comandos MySQL y del contenedor escribiendo exit dos veces.

El siguiente paso es introducir tu dominio como host de confianza para protegerlo de los ataques HTTP HOST Header. Para ello, necesitamos editar el archivo /var/www/html/sites/default/settings.php dentro del contenedor Drupal. Dado que estamos utilizando un volumen con nombre para los archivos de Drupal, la forma recomendada de realizar cualquier cambio es copiar el archivo del contenedor al host, realizar la edición y volver a copiarlo en el contenedor. Puedes hacer esto con cualquier archivo que necesites cambiar dentro de la instalación de Drupal.

Copia el archivo de configuración del contenedor al host.

$ docker cp drupal:/var/www/html/sites/default/settings.php settings.php

El archivo está en modo sólo lectura. Dale permisos de escritura.

$ chmod+w settings.php

Abre el archivo para editarlo.

$ nano settings.php

Busca la siguiente sección en el archivo.

#$settings['trusted_host_patterns'] = [
#  '^www\.example\.com$',
#];

Descoméntala eliminando el signo de almohadilla y añadiendo tu dominio de Drupal como se muestra a continuación.

$settings['trusted_host_patterns'] = [
  '^drupal\.example\.com$',
];

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Vuelve a quitar los permisos de escritura.

$ chmod -w settings.php

Vuelve a copiar el archivo dentro del contenedor.

$ docker cp settings.php drupal:/var/www/html/sites/default

Paso 9 – Copia de seguridad de Drupal

Utilizaremos la línea de comandos para hacer una copia de seguridad de la base de datos de Drupal. Cambia al directorio de Drupal.

$ cd ~/drupal

Crea el directorio para Copias de Seguridad.

$ mkdir backup-data

Utiliza el siguiente comando para hacer una copia de seguridad de la base de datos de Drupal. Se te pedirá la contraseña de root de MySQL.

$ docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
Enter password: root_password

El comando anterior creará la copia de seguridad SQL en el directorio ~/drupal/backup-data.

Comprueba el contenido del directorio.

$ ls -al backup-data
total 6716
drwxrwxr-x 2 navjot navjot    4096 Jan 19 13:59 .
drwxrwxr-x 4 navjot navjot    4096 Jan 19 13:35 ..
-rw-rw-r-- 1 navjot navjot 6868325 Jan 19 13:37 data_19-01-2023_13_36_58.sql

Puedes ver la base de datos respaldada en el directorio. Puedes restaurar esta base de datos utilizando la herramienta phpMyAdmin o utilizando el siguiente comando.

$ docker compose exec mysql sh -c "exec mysql -uroot -p" < backup-data/data_19-01-2023_13_36_58.sql

Puedes crear una tarea cron para realizar copias de seguridad de la base de datos con regularidad.

Crea el script de copia de seguridad en el directorio /etc/cron.daily y ábrelo para editarlo.

$ sudo nano /etc/cron.daily/drupalbackup.sh

Pega en él el siguiente código.

#!/bin/bash
cd /home/navjot/drupal/
/usr/bin/docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Haz que el script sea ejecutable.

$ sudo chmod +x /etc/cron.daily/drupalbackup.sh

Ahora, se realizará una copia de seguridad diaria de tu base de datos.

Paso 10 – Actualizar Drupal

El primer paso para actualizar Drupal es hacer una copia de seguridad de la base de datos de Drupal utilizando el comando del paso 9.

A continuación, pasa al directorio

$ cd ~/drupal

Detén los Contenedores.

$ docker compose down

Extrae las últimas imágenes de contenedor.

$ docker compose pull drupal:10-fpm-alpine

Si quieres actualizar a la siguiente versión principal, tendrás que ajustar el nombre de la imagen en consecuencia y revisar las notas de la versión de Drupal para comprobar si hay algún problema.

Haz los cambios que necesites en docker-compose.yml si quieres. El resto de imágenes puedes actualizarlas cambiando su definición en el archivo Docker compose.

Reinicia los contenedores de Drupal. Esto también sacará las últimas imágenes para versiones menores de otros paquetes.

$ docker compose up -d

Conclusión

Con esto concluye nuestro tutorial sobre la instalación de Drupal utilizando Docker en un servidor Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...