Zálohování VPS pomocí restic: šifrované, deduplikované, automatické
Nastavte restic na Ubuntu: repozitář na S3 nebo přes SFTP, záloha souborů i databáze, mazání starých snapshotů, timer a hlavně test obnovy.
Snapshot od poskytovatele VPS je fajn, ale není to plnohodnotná záloha – leží u stejného poskytovatele a obnovit z něj jeden smazaný soubor bývá nepohodlné. Restic je nástroj, který zálohuje šifrovaně, deduplikuje data (každý blok uloží jen jednou) a umí ukládat na S3 kompatibilní úložiště, SFTP server, Backblaze B2 a další cíle.
Instalace
sudo apt install restic
restic version
Verze v repozitáři Ubuntu bývá starší. Novější binárku získáte přes sudo restic self-update (funguje u oficiálních binárek z GitHubu; balíček z distribuce může mít tuto funkci vypnutou).
Kam zálohovat
Pravidlo 3-2-1: tři kopie dat, na dvou typech médií, jedna mimo lokalitu. Pro VPS to v praxi znamená zálohovat mimo poskytovatele, kde server běží.
Restic podporuje mimo jiné:
| Backend | Příklad adresy repozitáře |
|---|---|
| Lokální adresář | /mnt/backup/restic |
| SFTP | sftp:[email protected]:/srv/restic |
| S3 kompatibilní | s3:https://s3.example.com/muj-bucket/server1 |
| Backblaze B2 | b2:muj-bucket:server1 |
| rclone | rclone:remote:cesta |
Konfigurace přes soubor s proměnnými
Vytvořte /etc/restic/env (práva 600, vlastník root):
export RESTIC_REPOSITORY="s3:https://s3.example.com/muj-bucket/web01"
export RESTIC_PASSWORD_FILE="/etc/restic/password"
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
Heslo k repozitáři vygenerujte a uložte:
sudo mkdir -p /etc/restic
openssl rand -base64 32 | sudo tee /etc/restic/password
sudo chmod 600 /etc/restic/password /etc/restic/env
Heslo si uložte i jinam (správce hesel). Bez něj data z repozitáře nikdo neobnoví – ani vy.
Inicializace repozitáře:
sudo -i
source /etc/restic/env
restic init
Záloha databáze
Soubory databáze za běhu nekopírujte, vytvořte dump. Restic umí číst ze stdin, takže dump nemusí ležet na disku:
mysqldump --single-transaction --all-databases | restic backup --stdin --stdin-filename mysql.sql --tag db
Pro PostgreSQL:
sudo -u postgres pg_dumpall | restic backup --stdin --stdin-filename postgres.sql --tag db
U mysqldump předpokládáme, že root se přihlašuje přes unix_socket (výchozí v MariaDB na Ubuntu) nebo že máte přihlašovací údaje v /root/.my.cnf.
Zálohovací skript
/opt/scripts/restic-backup.sh:
#!/usr/bin/env bash
set -euo pipefail
source /etc/restic/env
# 1) Databáze
mysqldump --single-transaction --all-databases \
| restic backup --stdin --stdin-filename mysql.sql --tag db
# 2) Soubory
restic backup /etc /var/www /home /opt \
--exclude-caches \
--exclude '/var/www/*/cache' \
--exclude 'node_modules' \
--tag files
# 3) Retence
restic forget --prune \
--keep-daily 7 --keep-weekly 4 --keep-monthly 6
# 4) Kontrola integrity části dat
restic check --read-data-subset=5%
sudo chmod 700 /opt/scripts/restic-backup.sh
forget odstraní snapshoty mimo retenční pravidla, --prune pak uvolní místo. Retence se uplatňuje zvlášť pro každou kombinaci hostname a cest, takže snapshoty databáze a souborů si nepřekážejí.
Automatické spouštění
/etc/systemd/system/restic-backup.service:
[Unit]
Description=Restic záloha
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/opt/scripts/restic-backup.sh
Nice=10
IOSchedulingClass=idle
/etc/systemd/system/restic-backup.timer:
[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=15min
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
sudo systemctl start restic-backup.service # první ruční běh
journalctl -u restic-backup -n 50
Obnova: jediná část, na které záleží
Záloha, kterou jste nikdy neobnovili, je jen naděje. Vyzkoušejte si to:
source /etc/restic/env
restic snapshots
restic ls latest --tag files | grep nginx.conf
Obnova jednoho souboru do dočasného adresáře:
restic restore latest --tag files --target /tmp/obnova --include /etc/nginx/nginx.conf
Obnova databáze:
restic dump latest --tag db mysql.sql | mysql
Pohodlné procházení: restic mount /mnt/restic připojí všechny snapshoty jako adresáře (vyžaduje FUSE).
Restic, nebo Borg?
| restic | BorgBackup | |
|---|---|---|
| Šifrování a deduplikace | ano | ano |
| Cloudová úložiště (S3, B2) | nativně | jen přes SSH server |
| Komprese | ano (od verze 0.14, formát repozitáře v2) | ano, víc voleb |
| Nejčastější volba pro | S3/B2 a různé cíle | vlastní zálohovací server přes SSH |
Oba nástroje jsou spolehlivé. Pokud zálohujete na úložiště typu S3, je restic jednodušší.
Kontrolní seznam
- [ ] heslo k repozitáři uložené mimo server
- [ ] záloha mimo poskytovatele VPS
- [ ] databáze přes dump, ne kopírováním souborů
- [ ] retence přes
forget --prune - [ ] vyzkoušená obnova souboru i databáze
- [ ] kontrola logu timeru alespoň jednou za čas