Chapitre 8 · 8.1
Sauvegardes avec restic vers un autre emplacement
La sauvegarde quotidienne de WebOké (voir Restaurer les sauvegardes de WebOké) restaure toujours l'intégralité de votre VPS et se trouve chez le même fournisseur. Avec restic, vous réalisez en plus votre propre sauvegarde : chiffrée, à un autre emplacement, et vous pouvez en restaurer des fichiers individuels.
De quoi avez-vous besoin ?
- Un emplacement en dehors de votre VPS auquel vous accédez par SFTP, par exemple un service de stockage ou un second serveur. Dans les exemples, il s'agit de
backup.example.netavec l'utilisateurbackup. - Un mot de passe robuste pour la sauvegarde. Si vous le perdez, votre sauvegarde devient inutilisable. Conservez-le aussi en dehors du serveur, dans votre gestionnaire de mots de passe.
Installation et préparation
La sauvegarde s'exécute en tant que root, afin de pouvoir tout lire.
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
Indiquez dans /root/.ssh/config que root utilise cette clé pour le serveur de sauvegarde :
Host backup.example.net
User backup
IdentityFile /root/.ssh/id_backup
Créez ensuite le dépôt (l'emplacement où restic conserve tout) :
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
Le script de sauvegarde
Placez ceci dans /usr/local/sbin/backup.sh et rendez-le exécutable avec 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
Pour stop et start, indiquez uniquement les applications que vous utilisez réellement ; la raison pour laquelle elles doivent être brièvement arrêtées est expliquée dans Bien inclure les bases de données et les volumes Docker dans vos sauvegardes. Vous y trouverez aussi le contenu de voor-backup.sh. Les applications redémarrent toujours, même si la sauvegarde échoue. Avec forget et --prune, vous conservez 7 sauvegardes quotidiennes, 4 hebdomadaires et 6 mensuelles ; les autres sont supprimées.
Automatiquement chaque nuit
Créez /etc/systemd/system/backup.service :
[Unit]
Description=restic back-up
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup.sh
et /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
Vérifier et restaurer
root@web1:~# restic snapshots
root@web1:~# restic check
root@web1:~# restic restore latest --target /tmp/terug --include /srv/diensten/vw-data
Restaurez vers un dossier séparé comme /tmp/terug, puis copiez ce dont vous avez besoin. Entraînez-vous à le faire une fois par trimestre : une sauvegarde que vous n'avez jamais restaurée est un espoir, pas une sauvegarde.
Astuce : Faites-vous avertir si la sauvegarde ne s'exécute pas. Créez dans Uptime Kuma un moniteur Push (voir Uptime Kuma : surveiller vos sites et votre serveur) et ajoutez ces deux lignes à la fin de backup.sh. Si le signal n'arrive pas, vous recevez une notification.
sleep 30
curl -fsS -m 10 "https://status.example.com/api/push/JOUWCODE?status=up&msg=OK" >/dev/null