453 - Backups de bases de datos en Docker programadas

453 - Backups de bases de datos en Docker programadas

Te traigo algunas herramientas para que hagas tus copias de seguridad, tus backups de bases de datos en Docker programadas. Por supuesto en Docker.

1:25
-3:15

De nuevo ataco con esto de las copias de seguridad, pero en este caso me quiero referir a los backups de bases de datos en Docker programadas. Y es que, tal y como comento en muchas ocasiones, lo de tener tus servicios autolojados, tiene sus ventajas y sus inconvenientes, y precisamente uno de los inconvenientes, es que tienes que invertir un tiempo en tareas de mantenimiento. Aunque también puedes dejarlo a lo loco, y que sea el destino el que elija la suerte.

No está mal para empezar el año, con esos propósitos de año nuevo, y uno de esos propósitos podría ser perfectamente, realizar esas copias de seguridad periódicas. Pero, porque hacerlo nosotros si podemos programarlo para que se haga de forma completamente automatizada?.

Backups de bases de datos en Docker programadas

Backups de bases de datos en Docker programadas

Un poco de contexto

Hace unos días escuché a AlexPro, en su podcast Desahogo Geek comentar que había preparado una script para realizar copias de seguridad de Nextcloud. En este sentido, explicó que había hecho para mantener copias de seguridad de la siguiente forma,

  • Uno por cada uno de los últimos siete días
  • Igualmente, uno por cada una de las últimas semanas
  • Lo mismo para los meses

Creo recordar que también lo hizo para los años, pero, de esto ya no estoy tan seguro. La cuestión, es que esto me llevó a rebuscar en el baúl de la Piquer, y no porque sea un equipaje muy viajado, sino porque con el paso del tiempo, ya hay prácticamente cualquier cosa que te puedas imaginar.

Entre las herramientas que encontré estaba una imagen Docker para hacer copias de seguridad de bases de datos PostgreSQL y esto fue el punto de partida.

Copias de seguridad de bases de datos PostgreSQL

En concreto me refiero a postgres-backup-local. Se trata de una imagen Docker con la que puedes hacer copias de seguridad al sistema de archivos local, es decir, al sistema de archivos del host, con rotado periódico de copias de seguridad. Esto del rotado periódico, es precisamente lo que explicaba anteriormente, y a lo que hacía referencia AlexPro, en su podcast.

A su vez, la imagen anterior se basa en otra que hace las copias de seguridad sobre S3.

En mi caso, he decidido basarme directamente en el que hace las copias de seguridad en local, y reemplazar la herramienta que utiliza para la programación de las copias de seguridad en una de desarrollo propio implementada en Rust.

cronirs

cronirs es una herramienta de desarrollo propio implementada en Rust, y que básicamente funciona como un cron, pero con la diferencia de que parte de segundos. Es decir, que puedes programar tareas que se repitan cada segundo o cada n segundos.

Básicamente utiliza el formato de programación siguiente,

sec   min   hour   day of month   month   day of week   year
*     *     *      *              *       *             *

Que es el que viene definido en tokio-cron-scheduler. El crate que estoy empleando para realizar la programación. De esta manera, puedes definir en un archivo cron.txt las tareas que quieres que realice. En concreto, para el caso que nos ocupa, solo una, la del backup.sh.

En este caso, lo que hice, fue pasarla como variable de entorno, y escribirla directamente en el archivo /app/cron.txt para simplificar al máximo la cosa. Lo cierto es que hubo un momento, que me planteé la necesidad de reescribir cronirs para aceptar variables de entorno, pero… ¿para que?.

postgres-backup

Este es el punto de partida, para realizar copias de seguridad de bases de datos PostrgreSQL con rotado de esos backup. Te permite realizar copias de seguridad de varias bases de datos.

Para utilizarlo, te remito al repositorio de GitHub, pero simplemente sería añadir lo siguiente en tu docker-compose.yml, donde ya tienes configurada tu PostgreSQL,

backup:
  image: atareao/postgres-backup:latest
  container_name: backup_postgres
  init: true
  restart: unless-stopped
  networks:
    - internal
  volumes:
    - ./hooks:/hooks
    - ./backup:/backup
  environment:
    POSTGRESQL_DB: test_db
    POSTGRESQL_HOST: postgres
    POSTGRESQL_USER: root
    POSTGRESQL_PASSWORD: root
    SCHEDULE: '0 25 17/24 * * * *'
    BACKUP_KEEP_MINS: 1440
    BACKUP_KEEP_DAYS: 7
    BACKUP_KEEP_WEEKS: 4
    BACKUP_KEEP_MONTHS: 6

Algunos detalles interesantes,

  • Utilizo una red internal, que es la misma en la que se encuentra la base de datos, el PostgreSQL. Este detalle es importante si quieres que la pueda encontrar.
  • La programación está para que se realice cada día a las 17:25:00 a las 17 horas y 25 minutos. Es importante el 0 en los segundos porque en el caso que pongas * hará una copia cada segundo, lo que no es nada recomendable.
  • La variable BACKUP_KEEP_MINS indica cuanto tiempo mantiene los archivos en el directorio last, que según ves, está configurado a 1440 minutos, es decir, un día.
  • El resto de parámetros, indica cuantos días, semanas y meses mantiene.
  • Si quieres indicar mas de una base de datos, en POSTGRESQL_DB, indica las que necesitas separadas por comas.

mariadb-backup

Este es el punto de partida, para realizar copias de seguridad de bases de datos PostrgreSQL con rotado de esos backup. Te permite realizar copias de seguridad de varias bases de datos.

Para utilizarlo, te remito al repositorio de GitHub, pero simplemente sería añadir lo siguiente en tu docker-compose.yml, donde ya tienes configurada tu PostgreSQL,

backup:
  image: atareao/postgres-backup:latest
  container_name: backup_postgres
  init: true
  restart: unless-stopped
  networks:
    - internal
  volumes:
    - ./hooks:/hooks
    - ./backup:/backup
  environment:
    POSTGRESQL_DB: test_db
    POSTGRESQL_HOST: postgres
    POSTGRESQL_USER: root
    POSTGRESQL_PASSWORD: root
    SCHEDULE: '0 25 17/24 * * * *'
    BACKUP_KEEP_MINS: 1440
    BACKUP_KEEP_DAYS: 7
    BACKUP_KEEP_WEEKS: 4
    BACKUP_KEEP_MONTHS: 6

Como te puedes imaginar, el funcionamiento es exactamente igual que en el caso de la base de datos PostrgreSQL. Puedes consultar sobre los detalles en GitHub.

El asunto multiplataforma

Quizá lo que mas me ha costado ha sido conseguir que estas imágenes admitan al menos dos plataformas, amd/64 y arm/64, lo que te permitirá utilizarlo en tu Raspberry en el caso de que estés utilizando arm64. Para 32 bits, por el momento no he conseguido resolverlo… Veremos en un futuro no muy lejano.


Espero que te haya gustado este nuevo episodio del podcast. Si puedes, te agradecería una valoración en iVoox y/o en Apple Podcast.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *