Restic: Automatiza tus backups con restic y systemd
2019-12-05
Índice
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:[email protected]:/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… 🐧