Capitolul 8 · 8.1
Copii de siguranță cu restic într-o altă locație
Urmăriți într-un film scurt
Copia de siguranță zilnică de la WebOké (consultați Restaurarea backupurilor WebOké) restaurează întotdeauna întregul VPS și se află la același furnizor. Cu restic puteți face, în plus, propria copie de siguranță: criptată, într-o altă locație, din care puteți restaura fișiere individuale.
De ce aveți nevoie?
- O locație în afara VPS-ului la care aveți acces prin SFTP, de exemplu un serviciu de stocare sau un al doilea server. În exemple, aceasta este
backup.example.netcu utilizatorulbackup. - O parolă puternică pentru copia de siguranță. Dacă o pierdeți, copia de siguranță devine inutilizabilă. Păstrați-o și în afara serverului, în managerul dvs. de parole.
Instalare și pregătire
Copia de siguranță rulează ca root, astfel încât să poată citi totul.
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
Specificați în /root/.ssh/config că root folosește această cheie pentru serverul de copii de siguranță:
Host backup.example.net
User backup
IdentityFile /root/.ssh/id_backup
Creați apoi repository-ul (locul în care restic păstrează totul):
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
Scriptul pentru copia de siguranță
Puneți acest conținut în /usr/local/sbin/backup.sh și faceți-l executabil cu 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
La stop și start menționați doar aplicațiile pe care le aveți cu adevărat; motivul pentru care trebuie oprite pentru scurt timp este explicat în Cum includeți corect bazele de date și volumele Docker în copia de rezervă. Tot acolo aflați ce conține voor-backup.sh. Aplicațiile pornesc întotdeauna din nou, chiar și dacă copia de siguranță eșuează. Cu forget și --prune păstrați 7 copii de siguranță zilnice, 4 săptămânale și 6 lunare; restul sunt șterse.
Automat în fiecare noapte
Creați /etc/systemd/system/backup.service:
[Unit]
Description=restic back-up
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup.sh
și /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
Verificare și restaurare
root@web1:~# restic snapshots
root@web1:~# restic check
root@web1:~# restic restore latest --target /tmp/terug --include /srv/diensten/vw-data
Restaurați într-un folder separat, cum ar fi /tmp/terug, apoi copiați ce aveți nevoie. Exersați acest lucru o dată pe trimestru: o copie de siguranță pe care nu ați restaurat-o niciodată este o speranță, nu o copie de siguranță.
Sfat: Configurați o avertizare pentru cazul în care copia de siguranță nu rulează. Creați în Uptime Kuma un monitor de tip Push (consultați Uptime Kuma: monitorizarea site-urilor și a serverului dvs.) și adăugați aceste două rânduri la finalul backup.sh. Dacă semnalul nu sosește, primiți o notificare.
sleep 30
curl -fsS -m 10 "https://status.example.com/api/push/JOUWCODE?status=up&msg=OK" >/dev/null