Mi solución de backup
Intro
¿Los backups son importantes, ok? Yo lo sé, vos deberías saberlo. ¿Entonces, por qué la mayoría no tiene backups decentes de sus compus?
Porque la mayoría de las maneras de hacer backups son inconvenientes o inútiles.
Así que acá está la solución que yo implementé, que hace mis backups útiles y convenientes.
La herramienta de backup en sí
Uso restic porque está buena. Funciona, es rápida, es eficiente con el espacio, y es fácil.
Nada más hay que escribir un script como este:
#!/bin/bash -x
# Backup dónde?
MOUNTDIR=/backup
BACKUPDIR=$MOUNTDIR/backup-$HOSTNAME
if [ -d $BACKUPDIR ]
then
# Backups con password
export RESTIC_PASSWORD=passwordgoeshere
# Backup qué cosa?
restic -r $BACKUPDIR --verbose backup \
/home/ralsina \
--exclude ~ralsina/.cargo \
--exclude ~ralsina/.local/share/Steam/ \
--exclude ~ralsina/.cache \
--exclude ~ralsina/.config/google-chrome/ \
--exclude ~ralsina/.rustup \
--exclude ~ralsina/.npm \
--exclude ~ralsina/.gitbook \
\
/etc/systemd/system/backup.* \
/usr/local/bin
# Guardar un backup por día de los últimos 7 días que hay backups
restic -r $MOUNTDIR/backup-pinky forget --prune --keep-daily=7
# Limpieza
restic -r $MOUNTDIR/backup-pinky prune
# Asegurate que están en disco
sync; sync; sync; sync
fi
La regla 3-2-1 de los backups
Dice la regla 3-2-1:
- 3 copias de los datos (1 backup primario, dos secundarios)
- 2 medios de almacenamiento distinto
- 1 remoto
En mi caso, es así:
- Backup primario es en el disco
- Backup secundario es a disco en otra máquina (un script similar, usando sftp)
- Backup terciario a un pen drive (medio distinto) que después va en mi bolsillo (remoto)
Para hacer los backups primario y secondario son dos versiones de ese script (en realidad el mismo script, con argumentos).
El backup terciario es un poco más complicado, porque quiero que sea conveniente.
La manera conveniente de hacer backup a un medio removible
Esta es mi "user story":
Como persona que quiere un backup offsite pero no tiene ganas de transmitir todos esos datos, quiero enchufar un pen drive en la máquina a backupear y que AUTOMÁTICAMENTE se haga el backup de los datos al pen drive.
Entonces, cuando en algún momento el backup termine, lo puedo desenchufar y llevármelo.
Digamos que encontrar la forma de hacer eso me tomó varias horas y estoy bastante seguro que mi solución es más complicada de lo necesario. Pero bueno, funciona, así que está bien.
Siendo esto Linux en el año 2022 ... esta solución implica systemd. Y porque es systemd, es complicado.
Automount
Lo primero es montar el pen drive automáticamente en un lugar conocido. Para eso se
necesitan dos cosas. Un servicio de automount, para que systemd monte algo en /backup
:
/etc/systemd/system/backup.automount
[Unit]
Description=Automount Backup
[Automount]
Where=/backup
TimeoutIdleSec=5min
[Install]
WantedBy=multi-user.target
Y un servicio de mount, para que sepa qué se monta en /backup
y cómo:
/etc/systemd/system/backup.mount
[Unit]
Description=Backup
Wants=backup.service
Before=backup.service
[Mount]
What=/dev/disk/by-uuid/74cac511-4d7a-4221-9c0f-e554de12fbf1
Where=/backup
Type=ext4
Options=auto
[Install]
WantedBy=multi-user.target
Las partes interesantes son:
-
Wants
yBefore
: esebackup.service
v a a ser un servicio systemd que efectivamente corre el script de backup. Queremos que lo haga, y que lo haga DESPUÉS de que el pen drive se haya montado. -
Where
yWhat
: "Where" dónde se monta y "What" es el UUID del pen drive como lo muestrasudo blkid
Hay que habilitar e iniciar el servicio automount, no hace falta hacer nada con el de mount.
Por supuesto después viene el servicio de backup en sí. Es un "oneshot": cuando arranca ejecuta el script de backup:
/etc/systemd/system/backup.service
[Unit]
Description=Backup
Requires=backup.mount
After=backup.mount
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
[Install]
WantedBy=multi-user.target
Hay que habiliatarlo pero no hacer "start". Ya que está en el "Wanted" del mount, cuando el dispositivo se monta el backup se ejecuta.
O ASÍ SERÍA EN UN MUNDO EN EL QUE LAS COSAS TIENEN SENTIDO
Lamentablemente el dispositivo solo se monta cuando, después de ser insertado, alguien
trata de usar el mountpoint. Así que con estos servicios nada pasa hasta que, después
de enchufar el pen drive uno va y hace algo como ls /backup
, lo que dispara el mount,
que a su vez inicia el script de backup.
¿Y cómo se arregla? Ni idea. Mi workaround fue agregar OTROS DOS SERVICIOS, así ls /backup
se ejecuta una vez por minuto.
/etc/systemd/system/backup_try.timer
[Unit]
Description=Try to run backup
[Timer]
OnUnitActiveSec=1min
[Install]
WantedBy=timers.target
/etc/systemd/system/backup_try.service
[Unit]
Description=Trigger Backup
[Service]
Type=oneshot
ExecStart=/bin/ls /backup
[Install]
WantedBy=multi-user.target
Y con eso, sí, puedo enchufar el pen drive cuando llego a la oficina a la mañana y desenchufarlo más tarde, sabiendo que tiene un backup de hoy adentro.