8. modulis · 8.2
Rezerves kopijas ar restic
8. modulis: Rezerves kopijas un uzraudzība · Lasīšanas laiks: 12 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs ar restic varēsiet veidot šifrētas rezerves kopijas krātuvē ārpus sava servera, tīrīt vecās versijas pēc glabāšanas grafika, pārbaudīt rezerves kopiju un atjaunot failus, kā arī panākt, ka viss darbojas automātiski.
Pamatjēdzieni: restic, repozitorijs, init, parole (paroles fails), aizmugursistēma jeb backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplikācija, append-only, systemd taimeris
Kāpēc restic?
Rezerves kopēšanas programmu ir daudz. restic ir laba izvēle savam serverim, jo tā:
- visu šifrē, pirms dati pamet serveri; krātuve redz tikai nesalasāmus blokus;
- deduplicē: fails, kas nav mainījies, netiek saglabāts vēlreiz, tāpēc ikdienas rezerves kopijas aizņem maz vietas;
- pazīst daudzus krātuves veidus: mapi, citu serveri caur SFTP, ar S3 saderīgu krātuvi, savu rest-server;
- ir viena programma, kas pieejama Debian un Ubuntu pakotņu avotā (
apt install restic).
Alternatīva ar līdzīgām īpašībām ir BorgBackup. Šīs nodarbības principi attiecas arī uz to.
Jēdzieni
- Repozitorijs: vieta, kur restic glabā rezerves kopijas. Vienmēr ārpus servera, kura rezerves kopiju Jūs veidojat.
- Momentuzņēmums (snapshot): viena rezerves kopija vienā brīdī. (Ievērojiet: tas nav tas pats, kas Jūsu pakalpojumu sniedzēja momentuzņēmums no nodarbības 8.1.)
- Parole: katram repozitorijam ir parole, ar kuru tiek šifrēts viss saturs. restic dokumentācija par to ir skaidra: kas pazaudē paroli, neatgriezeniski pazaudē datus.
Repozitorija izveide
Pieņemsim, ka Jums ir krātuves serveris backup.example.net, kuram varat piekļūt caur SFTP ar atslēgu kā lietotājs web1. Vispirms izveidojiet serverī paroles failu (un to pašu paroli saglabājiet savā paroļu pārvaldniekā, nodarbība 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.Ar vides mainīgajiem RESTIC_REPOSITORY un RESTIC_PASSWORD_FILE Jums nav katru reizi jāraksta opcijas -r un --password-file.
Rezerves kopijas izveide
Vispirms datubāzes izmete (nodarbība 8.1), tad rezerves 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 savedNākamajā dienā tas notiek daudz ātrāk: tiek pievienots tikai tas, kas mainījies.
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 snapshotsTīrīšana: forget un prune
Ja katru dienu pievienojas viens momentuzņēmums, pēc gada to ir 365. Ar forget Jūs nosakāt, kurus paturēt, izmantojot glabāšanas grafiku:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneGrafiks darbojas šādi:
--keep-daily 7: aplūko pēdējās septiņas dienas, kurās ir momentuzņēmums, un no katras dienas patur jaunāko;--keep-weekly 4: tas pats pēdējām četrām nedēļām (no pirmdienas līdz svētdienai);--keep-monthly 6: tas pats pēdējiem sešiem mēnešiem.
Momentuzņēmums paliek, ja tas atbilst vismaz vienam no noteikumiem. Viss, kas neatbilst nevienam noteikumam, tiek aizmirsts. Jaunu grafiku vispirms izmēģiniet ar --dry-run: tad redzēsiet, kas tiktu dzēsts, bet nekas netiks mainīts.
Svarīga atšķirība: forget noņem tikai atsauci uz momentuzņēmumu. Dati paliek repozitorijā, līdz prune iztīra blokus, kurus vairs neizmanto neviens momentuzņēmums. Opcija --prune pie forget to izdara vienā reizē. Prune prasa laiku un bloķē repozitoriju, tāpēc neplānojiet to vienlaikus ar rezerves kopēšanu.
Pārbaude: check
Rezerves kopiju, kas klusi sabojājusies, Jūs pamanīsiet tikai atjaunošanas brīdī. Ļaujiet restic regulāri pārbaudīt repozitoriju:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Vienkāršs check pārbauda struktūru. Ar --read-data-subset tas arī patiešām nolasa daļu datu un pārbauda saturu. Dariet to, piemēram, reizi nedēļā ar dažiem procentiem; tā pēc kāda laika viss būs vienreiz nolasīts.
Atjaunošana: restore un mount
Atjaunojiet uz atsevišķu mapi, nekad uzreiz pāri oriģinālam:
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 ir jaunākais momentuzņēmums; varat izmantot arī ID (restic restore 3c7e91d4 ...). Ar restic mount /mnt/restic (nepieciešams FUSE) Jūs redzat visus momentuzņēmumus kā mapes un varat tajos pārlūkot un kopēt atsevišķus failus. Apturēt var ar Ctrl+C.
Datubāzi atjauno, atgūstot izmeti un to importējot, piemēram, gunzip < alles.sql.gz | mariadb.
Automātiski, katru nakti
Izveidojiet skriptu un systemd taimeri (nodarbība 6.3). Skripts:
#!/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 --pruneVajadzīgs .service ar Type=oneshot un ExecStart=/usr/local/sbin/backup.sh, kā arī .timer ar OnCalendar=*-*-* 03:10:00 un Persistent=true. set -eu nodrošina, ka skripts apstājas pie pirmās kļūdas, lai systemd izpildi uzskatītu par neveiksmīgu. Piesaistiet tam paziņojumu (nodarbība 8.3), citādi neveiksmīgu rezerves kopēšanu Jūs nepamanīsiet.
Pret izspiedējvīrusiem: append-only
Iepriekš redzamajā skriptā serveris pats var arī dzēst rezerves kopiju (forget un prune). Ja serveri pārņem uzbrucējs, arī viņš to var izdarīt. Ir divi veidi, kā to novērst:
- rest-server append-only režīmā: krātuves serverī Jūs darbināt paša restic rest-server ar opciju
--append-only. Tad tīmekļa serveris var pievienot rezerves kopijas, bet neko nevar dzēst. Tīrīšanu (forget --prune) Jūs veicat no citas, labi aizsargātas iekārtas ar pilnām tiesībām. - Krātuve ar versiju kontroli vai objektu bloķēšanu pie S3 pakalpojumu sniedzēja, lai dzēstos objektus vēl kādu laiku varētu atgūt.
Ievērojiet smalku slazdu, ko min pati restic dokumentācija: uzbrucējs, kas pievieno viltotus momentuzņēmumus, var panākt, ka grafiks, piemēram, --keep-weekly, aizmirst īstos momentuzņēmumus. Ar --keep-within (piemēram, --keep-within 30d) paliek viss no šī perioda, gan viltotais, gan īstais.
Kopsavilkums
- restic šifrē, deduplicē un var glabāt datus daudzu veidu krātuvēs ārpus Jūsu servera; pazaudēta parole nozīmē, ka pazaudēts viss.
initizveido repozitoriju,backupizveido momentuzņēmumu,snapshotstos parāda.forgetar--keep-*nosaka, ko paturēt; tikaiprune(vai--prune) patiešām iztīra datus. Izmēģiniet ar--dry-run.check(ar--read-data-subset) pārbauda,restore --targetatjauno uz atsevišķu mapi,mountļauj pārlūkot.- Automatizējiet ar taimeri un paziņojumu, un vismaz vienu repozitoriju turiet servera nesasniedzamu (append-only).
Tests (quiz)
Uzdevums
Uzdevums Z8.2: Kas paliek pēc forget? Parauga failā restic-snapshots.txt ir momentuzņēmumu saraksts un glabāšanas grafiks. Nosakiet, kuri momentuzņēmumi paliek pēc restic forget ar šo grafiku. Programma salīdzina ar fiksēto atslēgu.
Uzdevums O8.2: Atjaunošanas tests. Savā serverī izveidojiet restic repozitoriju ārpus servera, izveidojiet rezerves kopiju no /etc un saviem datiem un atjaunojiet vienu mapi uz /tmp/terug. Salīdziniet ar diff, pierakstiet, cik ilgi tas aizņēma, un atbildiet, kur ārpus servera glabājas Jūsu parole un krātuves piekļuves dati.
Uzdevums O8.2: Atjaunošanas tests
Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.
Repozitorijs atrodas pie cita pakalpojumu sniedzēja, nevis tur, kur serveris. diff nerāda atšķirības vai rāda tikai failus, kas mainījās pēc rezerves kopijas izveides. Parole ir paroļu pārvaldniekā un uz papīra; append-only kopija aizsargā pret izdzēšanu, ko veic ielauzies uzbrucējs.
Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.
Vairāk lasīt
- Dublēšanas stratēģija: 3-2-1 noteikums Jūsu uzņēmumam
- restic dokumentācija, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- restic dokumentācija, Removing backup snapshots (forget un prune): https://restic.readthedocs.io/en/stable/060_forget.html
- restic dokumentācija, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
- Jūsu VPS momentuzņēmumi un rezerves kopijas
- VPS: no pirmās pieteikšanās līdz drošam serverim 8.1: Rezerves kopijas ar restic uz citu vietu
- VPS: no pirmās pieteikšanās līdz drošam serverim 8.2: Pareizi iekļaut datubāzes un Docker sējumus dublējumā
