Restic: Automatiza tus backups con restic y systemd

5 minutos de lectura

Anteriormente vimos como utilizar restic para realizar copias de seguridad cifradas de nuestros datos, este proceso lo podemos automatizar utilizando systemd

Utilizaremos dos servicios para systemd, uno para realizar las instantáneas y otro para realizar el borrado de los datos mediante prune

Instantánea

Creamos el fichero ~/.config/systemd/user/restic-backup.service

nano ~/.config/systemd/user/restic-backup.service

Y copiamos el siguiente código

[Unit]
Description=Restic backup service
[Service]
Type=oneshot
ExecStart=/usr/bin/restic backup --verbose --one-file-system --tag systemd.timer $BACKUP_EXCLUDES $BACKUP_PATHS
ExecStartPost=/usr/bin/restic forget --verbose --tag systemd.timer --group-by "paths,tags,host" --keep-daily $RETENTION_DAYS --keep-weekly $RETENTION_WEEKS --keep-monthly $RETENTION_MONTHS --keep-yearly $RETENTION_YEARS
EnvironmentFile=%h/bin/restic-backup.conf

En el caso de utilices el repositorio para almacenar las instantáneas de varios dispositivos puedes utilizar la opción tag para añadir una etiqueta descriptiva para la instantánea o host para especificar las instantáneas a las que les va a afectar la política de borrado, por ejemplo

[Unit]
Description=Restic backup service
[Service]
Type=oneshot
ExecStart=/usr/bin/restic backup --verbose --one-file-system --tag asus.home --tag systemd.timer $BACKUP_EXCLUDES $BACKUP_PATHS
ExecStartPost=/usr/bin/restic forget --verbose --tag asus.home --group-by "paths,tags,host" --keep-daily $RETENTION_DAYS --keep-weekly $RETENTION_WEEKS --keep-monthly $RETENTION_MONTHS --keep-yearly $RETENTION_YEARS
EnvironmentFile=%h/bin/restic-backup.conf

El archivo ~/bin/restic-backup.conf contiene la configuración del entorno, incluida la clave del repositorio en RESTIC_PASSWORD, también los archivos files_to_backup.txt y restic_exclude.txt con las carpetas y ficheros que se incluyen y excluyen en la instantánea, empezamos creando el archivo

nano ~/bin/restic-backup.conf

Ajusta los valores según tus preferencias y copia el siguiente código

BACKUP_PATHS="--files-from /home/carlos/bin/files_to_backup.txt"
BACKUP_EXCLUDES="--exclude-file /home/carlos/bin/restic_exclude.txt"
RETENTION_DAYS=7
RETENTION_WEEKS=4
RETENTION_MONTHS=12
RETENTION_YEARS=3
RESTIC_REPOSITORY=/mnt/backup/restic-repo
RESTIC_PASSWORD=xxxxxxxx

Vuelve a cargar systemd

systemctl --user daemon-reload

Ejecuta el servicio manualmente para crear una copia de seguridad

systemctl start --user restic-backup.service

Como el servicio es Type=oneshot, solo se ejecuta una sola vez. Comprobamos que se ha ejecutado correctamente

restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo snapshots
enter password for repository:
repository 7de6b43c opened successfully, password is correct
ID        Time                 Host        Tags           Paths
-------------------------------------------------------------------------------------
9863a3d6  2019-11-11 00:31:53  asus                       /etc/fstab
                                                          /home/carlos

d3e8a462  2019-11-11 13:52:27  rockpro64                  /home/carlos
                                                          /home/carlos/.config/rclone
                                                          /mnt/Datos
                                                          /mnt/datos/Docker
                                                          /mnt/datos/Media

b874c5cc  2019-11-11 21:44:36  rockpro64   systemd.timer  /home/carlos
                                                          /home/carlos/.config/rclone
                                                          /mnt/Datos
                                                          /mnt/datos/Docker
                                                          /mnt/datos/Media
-------------------------------------------------------------------------------------
systemctl status --user restic-backup.service
*restic-backup.service - Restic backup service
   Loaded: loaded (/home/carlos/.config/systemd/user/restic-backup.service; static; vendor preset: enabled)
   Active: inactive (dead)

Nov 11 21:46:12 rockpro64 restic[30554]: -------------------------------------------------------------------------------------------------------
Nov 11 21:46:12 rockpro64 restic[30554]: b874c5cc  2019-11-11 21:44:36  rockpro64   systemd.timer  daily snapshot    /home/carlos
Nov 11 21:46:12 rockpro64 restic[30554]:                                                           weekly snapshot   /home/carlos/.config/rclone
Nov 11 21:46:12 rockpro64 restic[30554]:                                                           monthly snapshot  /mnt/Datos
Nov 11 21:46:12 rockpro64 restic[30554]:                                                           yearly snapshot   /mnt/datos/Docker
Nov 11 21:46:12 rockpro64 restic[30554]:                                                                             /mnt/datos/Media
Nov 11 21:46:12 rockpro64 restic[30554]: -------------------------------------------------------------------------------------------------------
Nov 11 21:46:12 rockpro64 restic[30554]: 1 snapshots
Nov 11 21:46:12 rockpro64 systemd[23356]: restic-backup.service: Succeeded.
Nov 11 21:46:12 rockpro64 systemd[23356]: Started Restic backup service.

Después de verificar que el servicio se ejecuta y crea instantáneas como deseamos, crearemos un temporizador para ejecutar el servicio

Para ejecutar el servicio restic-backup.service diariamente, crea el fichero ~/.config/systemd/user/restic-backup.timer

nano ~/.config/systemd/user/restic-backup.timer

Y pega el siguiente código:

[Unit]
Description=Backup with restic daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target

Creamos y habilitamos el servicio

systemctl --user enable --now restic-backup.timer
Created symlink /home/carlos/.config/systemd/user/timers.target.wants/restic-backup.timer -> /home/carlos/.config/systemd/user/restic-backup.timer.

Puedes comprobar su estado y la fecha de su próxima ejecución

 systemctl --user status restic-backup.timer
 restic-backup.timer - Backup with restic daily
   Loaded: loaded (/home/carlos/.config/systemd/user/restic-backup.timer; enabled; vendor preset: enabled)
   Active: active (waiting) since Mon 2019-11-11 22:01:41 CET; 2min 7s ago
  Trigger: Tue 2019-11-12 00:00:00 CET; 1h 56min left

Nov 11 22:01:41 rockpro64 systemd[23356]: Started Backup with restic daily.

Prune

El servicio restic-backup.service utiliza políticas de mantenimiento mediante el comando forget para el mantenimiento de las instantáneas, pero como ya explique en el articulo anterior sobre restic, aunque se eliminan las instantáneas, los datos no se eliminan, para ello necesitamos del comando prune.

El comando prune inspecciona el repositorio y las instantáneas actuales, y elimina cualquier archivo que no esté asociado con una instantánea.

prune no es necesario ejecutarlo cada vez que se ejecuta una copia de seguridad, crearemos un segundo servicio y temporizador que se ejecute una vez al mes, creamos el archivo ~/.config/systemd/user/restic-prune.service

nano ~/.config/systemd/user/restic-prune.service

Copia y pegan este código:

[Unit]
Description=Restic backup service (data pruning)
[Service]
Type=oneshot
ExecStart=restic prune
EnvironmentFile=%h/bin/restic-backup.conf

Ahora creamos el temporizador

nano ~/.config/systemd/user/restic-prune.timer
[Unit]
Description=Prune data from the restic repository monthly
[Timer]
OnCalendar=monthly
Persistent=true
[Install]
WantedBy=timers.target

Volvemos a recargar systemd

systemctl --user daemon-reload

Y habilitamos el servicio

systemctl --user enable --now restic-prune.timer

Al igual que en el primer servicio, podemos ver el estado del temporizador y cuando será próxima ejecución

systemctl --user status restic-prune.timer

 restic-prune.timer - Prune data from the restic repository monthly
   Loaded: loaded (/home/carlos/.config/systemd/user/restic-prune.timer; enabled; vendor preset: enabled)
   Active: active (waiting) since Mon 2019-11-11 22:25:33 CET; 38s ago
  Trigger: Sun 2019-12-01 00:00:00 CET; 2 weeks 5 days left

Nov 11 22:25:33 rockpro64 systemd[23356]: Started Prune data from the restic repository monthly.

Espero que te haya gustado, pasa un buen día… :penguin:

Referencia:

https://fedoramagazine.org/automate-backups-with-restic-and-systemd/