Capítulo 8 · 8.1
Copias de seguridad con restic en otro lugar
Verlo en un vídeo corto
La copia de seguridad diaria de WebOké (consulte Restaurar las copias de seguridad de WebOké) siempre restaura su VPS completo y se guarda en el mismo proveedor. Con restic puede hacer además su propia copia de seguridad: cifrada, en otro lugar, y de la que puede recuperar archivos sueltos.
¿Qué necesita?
- Un lugar fuera de su VPS al que pueda acceder por SFTP, por ejemplo un servicio de almacenamiento o un segundo servidor. En los ejemplos es
backup.example.netcon el usuariobackup. - Una contraseña segura para la copia de seguridad. Si la pierde, su copia de seguridad será inservible. Guárdela también fuera del servidor, en su gestor de contraseñas.
Instalar y preparar
La copia de seguridad se ejecuta como root, para que pueda leerlo todo.
anna@web1:~$ sudo apt install restic
anna@web1:~$ sudo -i
root@web1:~# ssh-keygen -t ed25519 -C "restic web1" -N "" -f /root/.ssh/id_backup
root@web1:~# ssh-copy-id -i /root/.ssh/id_backup.pub backup@backup.example.net
root@web1:~# install -m 600 /dev/null /root/.restic-wachtwoord
root@web1:~# nano /root/.restic-wachtwoord
Indique en /root/.ssh/config que root use esta clave para el servidor de copias de seguridad:
Host backup.example.net
User backup
IdentityFile /root/.ssh/id_backup
Después cree el repositorio (el lugar donde restic guarda todo):
root@web1:~# export RESTIC_REPOSITORY=sftp:backup@backup.example.net:/restic/web1
root@web1:~# export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
root@web1:~# restic init
created restic repository 3c9a1e5b2d at sftp:backup@backup.example.net:/restic/web1
El script de copia de seguridad
Guarde esto en /usr/local/sbin/backup.sh y hágalo ejecutable con chmod 700 /usr/local/sbin/backup.sh:
#!/bin/sh
export RESTIC_REPOSITORY=sftp:backup@backup.example.net:/restic/web1
export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
# 1. Databases dumpen (zie 8.2)
/usr/local/sbin/voor-backup.sh || exit 1
# 2. Apps met SQLite even stilzetten, back-up maken, weer starten
cd /srv/diensten
docker compose stop vaultwarden uptime-kuma n8n
restic backup /etc /home /root /srv /var/backups/db /var/lib/docker/volumes --exclude /var/lib/docker/volumes/diensten_wp-db
RESULTAAT=$?
docker compose start vaultwarden uptime-kuma n8n
[ "$RESULTAAT" -eq 0 ] || exit 1
# 3. Oude back-ups opruimen
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune || exit 1
En stop y start indique solo las aplicaciones que realmente tenga; en Cómo incluir correctamente las bases de datos y los volúmenes de Docker se explica por qué deben detenerse un momento. Allí también puede leer qué contiene voor-backup.sh. Las aplicaciones siempre vuelven a iniciarse, aunque la copia de seguridad falle. Con forget y --prune conserva 7 copias diarias, 4 semanales y 6 mensuales; el resto se elimina.
Automáticamente cada noche
Cree /etc/systemd/system/backup.service:
[Unit]
Description=restic back-up
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup.sh
y /etc/systemd/system/backup.timer:
[Unit]
Description=restic back-up elke nacht
[Timer]
OnCalendar=*-*-* 03:15
Persistent=true
[Install]
WantedBy=timers.target
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl enable --now backup.timer
root@web1:~# systemctl start backup.service
root@web1:~# journalctl -u backup.service -e
Comprobar y restaurar
root@web1:~# restic snapshots
root@web1:~# restic check
root@web1:~# restic restore latest --target /tmp/terug --include /srv/diensten/vw-data
Restaure en una carpeta aparte, como /tmp/terug, y copie después lo que necesite. Practíquelo una vez por trimestre: una copia de seguridad que nunca ha restaurado es una esperanza, no una copia de seguridad.
Consejo: Configure un aviso por si la copia de seguridad no se ejecuta. Cree en Uptime Kuma un monitor Push (consulte Uptime Kuma: supervise sus sitios y su servidor) y añada estas dos líneas al final de backup.sh. Si no llega la señal, recibirá una notificación.
sleep 30
curl -fsS -m 10 "https://status.example.com/api/push/JOUWCODE?status=up&msg=OK" >/dev/null