Zálohy pomocí nástroje restic
Modul 8: Zálohy a monitoring · Doba čtení: 12 min.
Cíl lekce: Po této lekci budete umět pomocí nástroje restic vytvářet šifrované zálohy na úložiště mimo Váš server, mazat staré verze podle plánu uchovávání, kontrolovat zálohu, obnovovat soubory a nechat celý proces běžet automaticky.
Klíčové pojmy: restic, repozitář, init, heslo (soubor s heslem), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplikace, append-only, systemd časovač
Proč restic?
Zálohovacích programů existuje mnoho. restic je dobrou volbou pro vlastní server, protože:
- vše zašifruje dříve, než data opustí server; úložiště vidí jen nečitelné bloky;
- deduplikuje: soubor, který se nezměnil, se znovu neukládá, takže denní zálohy zaberou málo místa;
- podporuje mnoho druhů úložišť: adresář, jiný server přes SFTP, úložiště kompatibilní s S3, vlastní rest-server;
- je to jediný program, dostupný v repozitáři balíčků Debianu i Ubuntu (
apt install restic).
Alternativou s podobnými vlastnostmi je BorgBackup. Principy z této lekce platí i pro něj.
Základní pojmy
- Repozitář: místo, kam restic ukládá zálohy. Vždy mimo server, který zálohujete.
- Snapshot: jedna záloha v jednom okamžiku. (Pozor: jde o něco jiného než snapshot od Vašeho poskytovatele z lekce 8.1.)
- Heslo: každý repozitář má heslo, kterým se vše šifruje. Dokumentace nástroje restic je v tom jednoznačná: kdo heslo ztratí, ztratí data nenávratně.
Vytvoření repozitáře
Předpokládejme, že máte úložný server backup.example.net, ke kterému se dostanete přes SFTP pomocí klíče jako uživatel web1. Nejprve na serveru vytvořte soubor s heslem (a totéž heslo si uložte do svého správce hesel, lekce 8.1):
root@web1:~# install -m 600 /dev/null /root/.restic-wachtwoord
root@web1:~# openssl rand -base64 32 > /root/.restic-wachtwoord
root@web1:~# export RESTIC_REPOSITORY=sftp:web1@backup.example.net:/srv/restic/web1
root@web1:~# export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
root@web1:~# restic init
created restic repository 5f1a9c2e3b at sftp:web1@backup.example.net:/srv/restic/web1
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.Díky proměnným prostředí RESTIC_REPOSITORY a RESTIC_PASSWORD_FILE nemusíte pokaždé zadávat volby -r a --password-file.
Vytvoření zálohy
Nejprve výpis databáze (lekce 8.1), potom záloha:
root@web1:~# restic backup /etc /var/www /opt /var/backups/db \
--exclude /var/www/*/cache --tag dagelijks
repository 5f1a9c2e opened (version 2, compression level auto)
...
Files: 8421 new, 0 changed, 0 unmodified
Dirs: 1203 new, 0 changed, 0 unmodified
Added to the repository: 612.338 MiB (402.117 MiB stored)
processed 8421 files, 1.204 GiB in 0:41
snapshot 3c7e91d4 savedNásledující den proběhne mnohem rychleji: zálohuje se jen to, co se změnilo.
root@web1:~# restic snapshots
ID Time Host Tags Paths
-----------------------------------------------------------------------
3c7e91d4 2026-11-08 03:10:02 web1 dagelijks /etc /opt /var/backups/db /var/www
a18f0b77 2026-11-09 03:10:05 web1 dagelijks /etc /opt /var/backups/db /var/www
-----------------------------------------------------------------------
2 snapshotsÚklid: forget a prune
Každý den jeden snapshot navíc znamená po roce 365 snapshotů. Příkazem forget určíte, které si ponecháte, a to pomocí plánu uchovávání:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prunePlán funguje takto:
--keep-daily 7: podívá se na posledních sedm dní, ve kterých existuje snapshot, a z každého dne ponechá ten nejnovější;--keep-weekly 4: totéž pro poslední čtyři týdny (pondělí až neděle);--keep-monthly 6: totéž pro posledních šest měsíců.
Snapshot zůstane zachován, pokud splňuje alespoň jedno z pravidel. Vše, co nesplňuje žádné pravidlo, bude zapomenuto. Nový plán si nejprve vyzkoušejte s volbou --dry-run: uvidíte, co by se odstranilo, aniž by se cokoli změnilo.
Důležitý rozdíl: forget odstraní pouze odkaz na snapshot. Data zůstávají v repozitáři, dokud prune neuklidí bloky, které už žádný snapshot nepoužívá. Volba --prune u příkazu forget to provede najednou. Prune zabere čas a uzamkne repozitář; neplánujte jej proto současně se zálohou.
Kontrola: check
Zálohu, která se tiše poškodí, odhalíte až při obnově. Nechte proto restic repozitář pravidelně kontrolovat:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Samotný check kontroluje strukturu. S volbou --read-data-subset skutečně načte i část dat zpět a zkontroluje jejich obsah. Provádějte to například jednou týdně s několika procenty; za čas tak budou všechna data alespoň jednou přečtena.
Obnova: restore a mount
Obnovujte do samostatného adresáře, nikdy rovnou přes originál:
root@web1:~# restic restore latest --target /tmp/terug --include /etc/nginx
restoring snapshot a18f0b77 of [/etc /opt /var/backups/db /var/www] at 2026-11-09 03:10:05 ...
Summary: Restored 41 files/dirs (88.104 KiB) in 0:00
root@web1:~# diff -r /tmp/terug/etc/nginx /etc/nginx && echo gelijk
gelijklatest je nejnovější snapshot; můžete použít i ID (restic restore 3c7e91d4 ...). Pomocí restic mount /mnt/restic (vyžaduje FUSE) uvidíte všechny snapshoty jako adresáře, můžete se v nich rozhlédnout a kopírovat jednotlivé soubory. Ukončíte to klávesami Ctrl+C.
Databázi obnovíte tak, že vytáhnete výpis ze zálohy a naimportujete jej, například gunzip < alles.sql.gz | mariadb.
Automaticky, každou noc
Vytvořte skript a systemd časovač (lekce 6.3). Skript:
#!/bin/sh
# /usr/local/sbin/backup.sh
set -eu
export RESTIC_REPOSITORY=sftp:web1@backup.example.net:/srv/restic/web1
export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
mariadb-dump --single-transaction --all-databases | gzip > /var/backups/db/alles.sql.gz
restic backup /etc /var/www /opt /var/backups/db --tag dagelijks
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneK tomu .service s Type=oneshot a ExecStart=/usr/local/sbin/backup.sh a .timer s OnCalendar=*-*-* 03:10:00 a Persistent=true. set -eu zajistí, že se skript zastaví při první chybě, takže systemd vyhodnotí běh jako neúspěšný. Připojte k tomu upozornění (lekce 8.3), jinak si nepovedené zálohy nevšimnete.
Proti ransomwaru: append-only
Ve skriptu výše může server zálohu také sám smazat (forget a prune). Pokud útočník server ovládne, může to tedy udělat i on. Existují dva způsoby, jak tomu zabránit:
- rest-server v režimu append-only: na úložném serveru provozujete vlastní rest-server od restic s volbou
--append-only. Webový server pak může zálohy přidávat, ale nic mazat. Úklid (forget --prune) provádíte z jiného, dobře zabezpečeného počítače s plnými oprávněními. - Úložiště se správou verzí nebo uzamčením objektů u poskytovatele S3, takže smazané objekty lze ještě nějakou dobu obnovit.
Dejte pozor na záludnou past, kterou zmiňuje sama dokumentace nástroje restic: útočník, který přidá falešné snapshoty, může plán jako --keep-weekly přimět k zapomenutí skutečných snapshotů. S --keep-within (například --keep-within 30d) zůstane zachováno vše z daného období, falešné i skutečné.
Shrnutí
- restic šifruje, deduplikuje a umí zálohovat na mnoho druhů úložišť mimo Váš server; ztracené heslo znamená ztracená data.
initvytvoří repozitář,backupsnapshot,snapshotsje zobrazí.forgets--keep-*určuje, co si ponecháte; teprveprune(nebo--prune) data skutečně uklidí. Zkoušejte s--dry-run.check(s--read-data-subset) kontroluje,restore --targetobnovuje do samostatného adresáře,mountVám umožní se v zálohách rozhlédnout.- Automatizujte pomocí časovače a upozornění a mějte alespoň jeden repozitář mimo dosah serveru (append-only).
Kvíz
Úkol
Úkol Z8.2: Co zůstane po příkazu forget? V ukázkovém souboru restic-snapshots.txt najdete seznam snapshotů a plán uchovávání. Určete, které snapshoty zůstanou po restic forget s tímto plánem. Program odpověď porovná s pevným klíčem.
Úkol O8.2: Test obnovy. Na svém vlastním serveru vytvořte repozitář restic mimo server, zazálohujte /etc a svá data a jeden adresář obnovte do /tmp/terug. Porovnejte pomocí diff, zapište si, jak dlouho to trvalo, a odpovězte, kde máte mimo server uložené heslo a přístupové údaje k úložišti.
Úkol O8.2: Test obnovy
Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.
Repozitář je u jiného poskytovatele než server. diff neukazuje žádné rozdíly, nebo jen soubory, které se změnily po záloze. Heslo ve správci hesel a na papíře; kopie append-only chrání před smazáním útočníkem.
Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.
Doporučujeme k přečtení
- Záložní strategie: pravidlo 3-2-1 pro Vaši vlastní firmu
- Dokumentace restic, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- Dokumentace restic, Removing backup snapshots (forget a prune): https://restic.readthedocs.io/en/stable/060_forget.html
- Dokumentace restic, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
