Capítulo 8 · 8.1
Cópias de segurança com restic para outro local
Ver num vídeo curto
A cópia de segurança diária da WebOké (consulte Restaurar cópias de segurança da WebOké) repõe sempre o VPS completo e fica no mesmo fornecedor. Com o restic pode criar, além disso, a sua própria cópia de segurança: encriptada, noutro local, e da qual pode recuperar ficheiros individuais.
Do que precisa?
- Um local fora do seu VPS a que possa aceder por SFTP, por exemplo um serviço de armazenamento ou um segundo servidor. Nos exemplos, trata-se de
backup.example.netcom o utilizadorbackup. - Uma palavra-passe forte para a cópia de segurança. Se a perder, a sua cópia de segurança fica inutilizável. Guarde-a também fora do servidor, no seu gestor de palavras-passe.
Instalar e preparar
A cópia de segurança é executada como root, para que consiga ler tudo.
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 em /root/.ssh/config que o root utiliza esta chave para o servidor de cópias de segurança:
Host backup.example.net
User backup
IdentityFile /root/.ssh/id_backup
Em seguida, crie o repositório (o local onde o restic guarda tudo):
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
O script de cópia de segurança
Coloque isto em /usr/local/sbin/backup.sh e torne-o executável com 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
Em stop e start, indique apenas as aplicações que tem de facto; o motivo pelo qual têm de ser paradas por momentos está explicado em Incluir corretamente bases de dados e volumes Docker na cópia de segurança. O que consta de voor-backup.sh também é explicado aí. As aplicações voltam sempre a arrancar, mesmo que a cópia de segurança falhe. Com forget e --prune guarda 7 cópias de segurança diárias, 4 semanais e 6 mensais; as restantes são eliminadas.
Automaticamente todas as noites
Crie /etc/systemd/system/backup.service:
[Unit]
Description=restic back-up
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup.sh
e /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
Verificar e repor
root@web1:~# restic snapshots
root@web1:~# restic check
root@web1:~# restic restore latest --target /tmp/terug --include /srv/diensten/vw-data
Reponha para uma pasta separada, como /tmp/terug, e copie depois aquilo de que precisa. Pratique isto uma vez por trimestre: uma cópia de segurança que nunca foi reposta é uma esperança, não uma cópia de segurança.
Dica: Receba um aviso quando a cópia de segurança não for executada. Crie no Uptime Kuma um monitor Push (consulte Uptime Kuma: monitorizar os seus sites e o seu servidor) e acrescente estas duas linhas no final de backup.sh. Se o sinal não chegar, recebe uma notificação.
sleep 30
curl -fsS -m 10 "https://status.example.com/api/push/JOUWCODE?status=up&msg=OK" >/dev/null