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

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

Y copiamos el siguiente código

1[Unit]
2Description=Restic backup service
3[Service]
4Type=oneshot
5ExecStart=/usr/bin/restic backup --verbose --one-file-system --tag systemd.timer $BACKUP_EXCLUDES $BACKUP_PATHS
6ExecStartPost=/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
7EnvironmentFile=%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

1[Unit]
2Description=Restic backup service
3[Service]
4Type=oneshot
5ExecStart=/usr/bin/restic backup --verbose --one-file-system --tag asus.home --tag systemd.timer $BACKUP_EXCLUDES $BACKUP_PATHS
6ExecStartPost=/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
7EnvironmentFile=%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

1nano ~/bin/restic-backup.conf

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

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

Vuelve a cargar systemd

1systemctl --user daemon-reload

Ejecuta el servicio manualmente para crear una copia de seguridad

1systemctl start --user restic-backup.service

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

 1restic -r sftp:carlos@192.168.2.3:/mnt/backup/restic-repo snapshots
 2enter password for repository:
 3repository 7de6b43c opened successfully, password is correct
 4ID        Time                 Host        Tags           Paths
 5-------------------------------------------------------------------------------------
 69863a3d6  2019-11-11 00:31:53  asus                       /etc/fstab
 7                                                          /home/carlos
 8
 9d3e8a462  2019-11-11 13:52:27  rockpro64                  /home/carlos
10                                                          /home/carlos/.config/rclone
11                                                          /mnt/Datos
12                                                          /mnt/datos/Docker
13                                                          /mnt/datos/Media
14
15b874c5cc  2019-11-11 21:44:36  rockpro64   systemd.timer  /home/carlos
16                                                          /home/carlos/.config/rclone
17                                                          /mnt/Datos
18                                                          /mnt/datos/Docker
19                                                          /mnt/datos/Media
20-------------------------------------------------------------------------------------
 1systemctl status --user restic-backup.service
 2*restic-backup.service - Restic backup service
 3   Loaded: loaded (/home/carlos/.config/systemd/user/restic-backup.service; static; vendor preset: enabled)
 4   Active: inactive (dead)
 5
 6Nov 11 21:46:12 rockpro64 restic[30554]: -------------------------------------------------------------------------------------------------------
 7Nov 11 21:46:12 rockpro64 restic[30554]: b874c5cc  2019-11-11 21:44:36  rockpro64   systemd.timer  daily snapshot    /home/carlos
 8Nov 11 21:46:12 rockpro64 restic[30554]:                                                           weekly snapshot   /home/carlos/.config/rclone
 9Nov 11 21:46:12 rockpro64 restic[30554]:                                                           monthly snapshot  /mnt/Datos
10Nov 11 21:46:12 rockpro64 restic[30554]:                                                           yearly snapshot   /mnt/datos/Docker
11Nov 11 21:46:12 rockpro64 restic[30554]:                                                                             /mnt/datos/Media
12Nov 11 21:46:12 rockpro64 restic[30554]: -------------------------------------------------------------------------------------------------------
13Nov 11 21:46:12 rockpro64 restic[30554]: 1 snapshots
14Nov 11 21:46:12 rockpro64 systemd[23356]: restic-backup.service: Succeeded.
15Nov 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

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

Y pega el siguiente código:

1[Unit]
2Description=Backup with restic daily
3[Timer]
4OnCalendar=daily
5Persistent=true
6[Install]
7WantedBy=timers.target

Creamos y habilitamos el servicio

1systemctl --user enable --now restic-backup.timer
2Created 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

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

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

Copia y pegan este código:

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

Ahora creamos el temporizador

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

Volvemos a recargar systemd

1systemctl --user daemon-reload

Y habilitamos el servicio

1systemctl --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

1systemctl --user status restic-prune.timer
2
3 restic-prune.timer - Prune data from the restic repository monthly
4   Loaded: loaded (/home/carlos/.config/systemd/user/restic-prune.timer; enabled; vendor preset: enabled)
5   Active: active (waiting) since Mon 2019-11-11 22:25:33 CET; 38s ago
6  Trigger: Sun 2019-12-01 00:00:00 CET; 2 weeks 5 days left
7
8Nov 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/