Modul 8 · 8.2
Varnostne kopije z orodjem restic
Modul 8: Varnostne kopije in nadzor · Čas branja: 12 minut
Učni cilj: Po tej lekciji boste z orodjem restic znali ustvarjati šifrirane varnostne kopije v shrambo zunaj svojega strežnika, počistiti stare različice po načrtu hranjenja, preveriti varnostno kopijo in obnoviti datoteke ter vse skupaj nastaviti tako, da teče samodejno.
Ključni pojmi: restic, repozitorij, init, geslo (datoteka z geslom), zaledje (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplikacija, append-only, časovnik systemd
Zakaj restic?
Programov za varnostno kopiranje je veliko. restic je dobra izbira za lasten strežnik, ker:
- vse šifrira, preden podatki zapustijo strežnik; shramba vidi le neberljive bloke;
- izvaja deduplikacijo: datoteka, ki se ni spremenila, se ne shrani znova, zato dnevne varnostne kopije zasedejo malo prostora;
- podpira veliko vrst shrambe: mapo, drug strežnik prek SFTP, shrambo, združljivo s S3, lasten rest-server;
- je en sam program, ki je na voljo v skladišču paketov Debiana in Ubuntuja (
apt install restic).
Alternativa s podobnimi lastnostmi je BorgBackup. Načela iz te lekcije veljajo tudi zanj.
Pojmi
- Repozitorij: mesto, kamor restic shranjuje varnostne kopije. Vedno zunaj strežnika, ki ga varnostno kopirate.
- Posnetek (snapshot): ena varnostna kopija v enem trenutku. (Pozor: to ni isto kot posnetek pri Vašem ponudniku iz lekcije 8.1.)
- Geslo: vsak repozitorij ima geslo, s katerim se vse šifrira. Dokumentacija orodja restic je glede tega jasna: kdor izgubi geslo, je podatke nepreklicno izgubil.
Ustvarjanje repozitorija
Recimo, da imate strežnik za shrambo backup.example.net, do katerega lahko dostopate prek SFTP s ključem kot uporabnik web1. Najprej na strežniku ustvarite datoteko z geslom (isto geslo shranite tudi v svoj upravitelj gesel, lekcija 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.Z okoljskima spremenljivkama RESTIC_REPOSITORY in RESTIC_PASSWORD_FILE Vam možnosti -r in --password-file ni treba vsakič vnašati.
Ustvarjanje varnostne kopije
Najprej izvoz podatkovne baze (lekcija 8.1), nato varnostna kopija:
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 savedNaslednji dan je postopek veliko hitrejši: prenese se le tisto, kar se je spremenilo.
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Čiščenje: forget in prune
Vsak dan en posnetek več pomeni po enem letu 365 posnetkov. Z ukazom forget določite, katere obdržite, in sicer z načrtom hranjenja:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneNačrt deluje takole:
--keep-daily 7: poglej zadnjih sedem dni, ko obstaja posnetek, in za vsak dan obdrži najnovejšega;--keep-weekly 4: enako za zadnje štiri tedne (od ponedeljka do vključno nedelje);--keep-monthly 6: enako za zadnjih šest mesecev.
Posnetek ostane, če ustreza vsaj enemu od pravil. Vse, kar ne ustreza nobenemu pravilu, se pozabi. Nov načrt najprej preizkusite z --dry-run: tako vidite, kaj bi bilo odstranjeno, ne da bi se karkoli spremenilo.
Pomembna razlika: forget odstrani le sklic na posnetek. Podatki ostanejo v repozitoriju, dokler prune ne počisti blokov, ki jih ne uporablja več noben posnetek. Možnost --prune pri forget naredi oboje naenkrat. Prune traja nekaj časa in zaklene repozitorij, zato ga ne načrtujte hkrati z varnostnim kopiranjem.
Preverjanje: check
Varnostno kopijo, ki se tiho poškoduje, opazite šele ob obnovi. Naj restic redno preverja repozitorij:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Navaden check preveri strukturo. Z --read-data-subset tudi dejansko prebere del podatkov in preveri vsebino. To naredite na primer tedensko z nekaj odstotki; tako je čez čas vse vsaj enkrat prebrano.
Obnova: restore in mount
Obnavljajte v ločeno mapo, nikoli neposredno čez izvirnik:
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 najnovejši posnetek; uporabite lahko tudi ID (restic restore 3c7e91d4 ...). Z restic mount /mnt/restic (zahteva FUSE) vidite vse posnetke kot mape, po katerih lahko brskate in kopirate posamezne datoteke. Ustavite s Ctrl+C.
Podatkovno bazo obnovite tako, da pridobite izvoz in ga uvozite, na primer gunzip < alles.sql.gz | mariadb.
Samodejno, vsako noč
Ustvarite skript in časovnik systemd (lekcija 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 --pruneDatoteka .service z Type=oneshot in ExecStart=/usr/local/sbin/backup.sh ter datoteka .timer z OnCalendar=*-*-* 03:10:00 in Persistent=true. set -eu poskrbi, da se skript ustavi ob prvi napaki, tako da systemd zagon vidi kot neuspešen. Povežite ga z obvestilom (lekcija 8.3), sicer neuspešne varnostne kopije ne boste opazili.
Proti izsiljevalski programski opremi: append-only
V zgornjem skriptu lahko strežnik sam tudi izbriše varnostno kopijo (forget in prune). Če napadalec prevzame strežnik, lahko to stori tudi on. Dva načina, kako to preprečite:
- rest-server v načinu append-only: na strežniku za shrambo poganjate lasten rest-server orodja restic z možnostjo
--append-only. Spletni strežnik lahko nato varnostne kopije dodaja, ne more pa ničesar izbrisati. Čiščenje (forget --prune) izvajate z drugega, dobro zavarovanega računalnika s polnimi pravicami. - Shramba z upravljanjem različic ali zaklepanjem objektov pri ponudniku S3, tako da je izbrisane objekte še nekaj časa mogoče pridobiti nazaj.
Pazite na subtilno past, ki jo omenja dokumentacija orodja restic: napadalec, ki doda lažne posnetke, lahko načrt, kot je --keep-weekly, zavede, da pozabi prave posnetke. Z --keep-within (na primer --keep-within 30d) ostane vse iz tega obdobja, lažno ali pravo.
Povzetek
- restic šifrira, izvaja deduplikacijo in lahko shranjuje v veliko vrst shrambe zunaj Vašega strežnika; izgubljeno geslo pomeni, da je izgubljeno vse.
initustvari repozitorij,backupposnetek,snapshotsjih prikaže.forgetz--keep-*določi, kaj obdržite; šeleprune(ali--prune) podatke zares počisti. Preizkusite z--dry-run.check(z--read-data-subset) preverja,restore --targetobnovi v ločeno mapo,mountVam omogoča brskanje.- Avtomatizirajte s časovnikom in obvestilom ter imejte vsaj en repozitorij zunaj dosega strežnika (append-only).
Kviz
Naloga
Naloga Z8.2: Kaj ostane po ukazu forget? V primeru datoteke restic-snapshots.txt sta seznam posnetkov in načrt hranjenja. Določite, kateri posnetki ostanejo po restic forget s tem načrtom. Program primerja z ustaljenim ključem.
Naloga O8.2: Preizkus obnovitve. Na svojem strežniku ustvarite repozitorij restic zunaj strežnika, naredite varnostno kopijo /etc in svojih podatkov ter obnovite eno mapo v /tmp/terug. Primerjajte z diff, zapišite, koliko časa je trajalo, in odgovorite, kje zunaj strežnika sta shranjena Vaše geslo in Vaši podatki za dostop do shrambe.
Naloga O8.2: Preizkus obnovitve
To nalogo opravite sami; nihče je ne pregleda. Odkljukajte, kar ste naredili, in nalogo označite kot opravljeno.
Repozitorij je pri drugem ponudniku kot strežnik. diff ne pokaže razlik ali samo datoteke, ki so se spremenile po varnostni kopiji. Geslo v upravitelju gesel in na papirju; kopija append-only ščiti pred izbrisom s strani vsiljivca.
Vaše kljukice in zapiski ostanejo samo v tem brskalniku, nikamor jih ne pošiljamo. Če ste prijavljeni, v Moji tečaji shranimo samo podatek, da ste nalogo opravili.
Za nadaljnje branje
- Strategija varnostnega kopiranja: pravilo 3-2-1 za Vaše lastno podjetje
- Dokumentacija restic, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- Dokumentacija restic, Removing backup snapshots (forget in prune): https://restic.readthedocs.io/en/stable/060_forget.html
- Dokumentacija restic, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
- Posnetki in varnostne kopije Vašega VPS
- VPS: od prve prijave do varnega strežnika 8.1: Varnostne kopije z restic na drugo lokacijo
- VPS: od prve prijave do varnega strežnika 8.2: Pravilno varnostno kopiranje podatkovnih zbirk in nosilcev Docker
