Kapitel 8 · 8.1
Backups mit restic an einen anderen Ort
Im kurzen Video ansehen
Das tägliche Backup von WebOké (siehe Backups von WebOké wiederherstellen) stellt immer Ihren gesamten VPS wieder her und liegt beim selben Anbieter. Mit restic erstellen Sie zusätzlich Ihr eigenes Backup: verschlüsselt, an einem anderen Ort, und Sie können daraus einzelne Dateien wiederherstellen.
Was benötigen Sie?
- Einen Ort außerhalb Ihres VPS, auf den Sie per SFTP zugreifen können, zum Beispiel einen Speicherdienst oder einen zweiten Server. In den Beispielen ist das
backup.example.netmit dem Benutzerbackup. - Ein starkes Passwort für das Backup. Verlieren Sie es, ist Ihr Backup unbrauchbar. Bewahren Sie es auch außerhalb des Servers auf, in Ihrem Passwortmanager.
Installieren und vorbereiten
Das Backup läuft als root, damit es alles lesen kann.
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
Legen Sie in /root/.ssh/config fest, dass root diesen Schlüssel für den Backup-Server verwendet:
Host backup.example.net
User backup
IdentityFile /root/.ssh/id_backup
Erstellen Sie dann das Repository (den Ort, an dem restic alles speichert):
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
Das Backup-Skript
Speichern Sie dies in /usr/local/sbin/backup.sh und machen Sie es mit chmod 700 /usr/local/sbin/backup.sh ausführbar:
#!/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
Nennen Sie bei stop und start nur die Apps, die Sie tatsächlich haben; warum sie kurz angehalten werden müssen, steht in Datenbanken und Docker-Volumes richtig sichern. Was in voor-backup.sh steht, lesen Sie dort ebenfalls. Die Apps starten immer wieder, auch wenn das Backup fehlschlägt. Mit forget und --prune behalten Sie 7 tägliche, 4 wöchentliche und 6 monatliche Backups; der Rest wird aufgeräumt.
Jede Nacht automatisch
Erstellen Sie /etc/systemd/system/backup.service:
[Unit]
Description=restic back-up
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup.sh
und /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
Prüfen und wiederherstellen
root@web1:~# restic snapshots
root@web1:~# restic check
root@web1:~# restic restore latest --target /tmp/terug --include /srv/diensten/vw-data
Stellen Sie in einen separaten Ordner wie /tmp/terug wieder her und kopieren Sie danach, was Sie benötigen. Üben Sie das einmal pro Quartal: Ein Backup, das Sie nie wiederhergestellt haben, ist eine Hoffnung, kein Backup.
Tipp: Lassen Sie sich warnen, wenn das Backup nicht läuft. Erstellen Sie in Uptime Kuma einen Push-Monitor (siehe Uptime Kuma: Ihre Websites und Ihren Server überwachen) und fügen Sie unten in backup.sh diese zwei Zeilen ein. Bleibt das Signal aus, erhalten Sie eine Benachrichtigung.
sleep 30
curl -fsS -m 10 "https://status.example.com/api/push/JOUWCODE?status=up&msg=OK" >/dev/null