8 modulis · 8.2
Atsarginės kopijos su restic
8 modulis: Atsarginės kopijos ir stebėsena · Skaitymo laikas: 12 min.
Mokymosi tikslas: Po šios pamokos galėsite su restic kurti šifruotas atsargines kopijas į saugyklą už Jūsų serverio ribų, šalinti senas versijas pagal saugojimo schemą, tikrinti atsarginę kopiją, atkurti failus ir visa tai paleisti automatiškai.
Pagrindinės sąvokos: restic, saugykla (repository), init, slaptažodis (slaptažodžio failas), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplikacija, append-only, systemd laikmatis
Kodėl restic?
Atsarginių kopijų programų yra daug. restic yra geras pasirinkimas nuosavam serveriui, nes ji:
- viską užšifruoja prieš duomenims paliekant serverį; saugykla mato tik neperskaitomus blokus;
- deduplikuoja: nepasikeitęs failas pakartotinai neišsaugomas, todėl kasdienės atsarginės kopijos užima mažai vietos;
- palaiko daug saugyklų tipų: aplanką, kitą serverį per SFTP, su S3 suderinamą saugyklą, nuosavą rest-server;
- yra viena programa, esanti Debian ir Ubuntu paketų saugykloje (
apt install restic).
Panašių savybių turinti alternatyva yra BorgBackup. Šios pamokos principai galioja ir jai.
Sąvokos
- Saugykla (repository): vieta, kurioje restic saugo atsargines kopijas. Visada už serverio, kurio kopiją darote, ribų.
- Momentinė kopija (snapshot): viena atsarginė kopija vienu metu. (Atkreipkite dėmesį: tai kas kita nei Jūsų paslaugų teikėjo momentinė kopija iš 8.1 pamokos.)
- Slaptažodis: kiekviena saugykla turi slaptažodį, kuriuo viskas užšifruojama. restic dokumentacija tai sako aiškiai: praradus slaptažodį, duomenys prarandami negrįžtamai.
Saugyklos sukūrimas
Tarkime, turite saugojimo serverį backup.example.net, prie kurio galite prisijungti per SFTP su raktu kaip naudotojas web1. Pirmiausia serveryje sukurkite slaptažodžio failą (o tą patį slaptažodį išsaugokite ir savo slaptažodžių tvarkyklėje, 8.1 pamoka):
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.Naudodami aplinkos kintamuosius RESTIC_REPOSITORY ir RESTIC_PASSWORD_FILE, Jums nereikės kaskart rašyti parinkčių -r ir --password-file.
Atsarginės kopijos sukūrimas
Pirmiausia duomenų bazės iškeltis (8.1 pamoka), tada atsarginė 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 savedKitą dieną tai vyksta kur kas greičiau: įtraukiama tik tai, kas pasikeitė.
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 snapshotsValymas: forget ir prune
Kasdien pridedant po momentinę kopiją, po metų jų bus 365. Su forget nustatote, kurias išsaugoti, naudodami saugojimo schemą:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneSchema veikia taip:
--keep-daily 7: žiūrima į paskutines septynias dienas, kuriomis yra momentinė kopija, ir kiekvienai dienai paliekama naujausia;--keep-weekly 4: tas pats paskutinėms keturioms savaitėms (nuo pirmadienio iki sekmadienio);--keep-monthly 6: tas pats paskutiniams šešiems mėnesiams.
Momentinė kopija paliekama, jei atitinka bent vieną iš taisyklių. Viskas, kas neatitinka nė vienos taisyklės, pamirštama. Naują schemą pirmiausia išbandykite su --dry-run: pamatysite, kas būtų pašalinta, nieko nepakeitę.
Svarbus skirtumas: forget pašalina tik nuorodą į momentinę kopiją. Duomenys lieka saugykloje, kol prune išvalo blokus, kurių nebenaudoja nė viena momentinė kopija. Parinktis --prune prie forget tai atlieka iš karto. Prune užtrunka ir užrakina saugyklą, todėl neplanuokite jo tuo pačiu metu kaip atsarginės kopijos.
Tikrinimas: check
Tyliai sugadintą atsarginę kopiją pastebėsite tik atkurdami. Leiskite restic reguliariai tikrinti saugyklą:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Paprastas check tikrina struktūrą. Su --read-data-subset programa taip pat iš tikrųjų nuskaito dalį duomenų ir patikrina turinį. Darykite tai, pavyzdžiui, kas savaitę su keliais procentais; taip po kurio laiko visi duomenys bus bent kartą nuskaityti.
Atkūrimas: restore ir mount
Atkurkite į atskirą aplanką, niekada iš karto ant originalo:
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 yra naujausia momentinė kopija; taip pat galite naudoti ID (restic restore 3c7e91d4 ...). Su restic mount /mnt/restic (reikia FUSE) visas momentines kopijas matote kaip aplankus, galite jas naršyti ir kopijuoti atskirus failus. Sustabdoma klavišais Ctrl+C.
Duomenų bazę atkursite atsisiuntę iškeltį ir ją importavę, pavyzdžiui, gunzip < alles.sql.gz | mariadb.
Automatiškai, kiekvieną naktį
Sukurkite scenarijų ir systemd laikmatį (6.3 pamoka). Scenarijus:
#!/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 --prune.service su Type=oneshot ir ExecStart=/usr/local/sbin/backup.sh, ir .timer su OnCalendar=*-*-* 03:10:00 ir Persistent=true. set -eu užtikrina, kad scenarijus sustotų ties pirmąja klaida, todėl systemd paleidimą laiko nepavykusiu. Prijunkite pranešimą (8.3 pamoka), kitaip nepavykusios atsarginės kopijos nepastebėsite.
Nuo išpirkos reikalaujančių programų: append-only
Aukščiau pateiktame scenarijuje pats serveris gali ir ištrinti atsarginę kopiją (forget ir prune). Jei serverį perima užpuolikas, jis taip pat gali tai padaryti. Du būdai to išvengti:
- rest-server append-only režimu: saugojimo serveryje paleidžiate paties restic rest-server su parinktimi
--append-only. Tada žiniatinklio serveris gali pridėti atsargines kopijas, bet nieko ištrinti negali. Valymą (forget --prune) atliekate iš kito, gerai apsaugoto kompiuterio su visomis teisėmis. - Saugykla su versijų valdymu arba objektų užrakinimu pas S3 paslaugų teikėją, kad ištrintus objektus dar kurį laiką būtų galima susigrąžinti.
Atkreipkite dėmesį į subtilius spąstus, kuriuos mini pati restic dokumentacija: užpuolikas, pridedantis netikras momentines kopijas, gali priversti tokią schemą kaip --keep-weekly pamiršti tikras momentines kopijas. Su --keep-within (pavyzdžiui, --keep-within 30d) visos to laikotarpio kopijos lieka, netikros ar tikros.
Santrauka
- restic šifruoja, deduplikuoja ir gali saugoti duomenis daugelio tipų saugyklose už Jūsų serverio ribų; praradus slaptažodį, prarandama viskas.
initsukuria saugyklą,backupsukuria momentinę kopiją,snapshotsjas parodo.forgetsu--keep-*nustato, ką saugote; tikprune(arba--prune) iš tikrųjų išvalo duomenis. Išbandykite su--dry-run.check(su--read-data-subset) tikrina,restore --targetatkuria į atskirą aplanką,mountleidžia naršyti.- Automatizuokite su laikmačiu ir pranešimu, o bent vieną saugyklą laikykite serveriui nepasiekiamą (append-only).
Testas (quiz)
Užduotis
Užduotis Z8.2: Kas lieka po forget? Pavyzdiniame faile restic-snapshots.txt yra momentinių kopijų sąrašas ir saugojimo schema. Nustatykite, kurios momentinės kopijos liks po restic forget su šia schema. Programa palygins su nustatytu atsakymų raktu.
Užduotis O8.2: Atkūrimo bandymas. Savo serveryje sukurkite restic saugyklą už serverio ribų, padarykite /etc ir savo duomenų atsarginę kopiją ir atkurkite vieną aplanką į /tmp/terug. Palyginkite su diff, užsirašykite, kiek laiko tai užtruko, ir atsakykite, kur už serverio ribų saugomi Jūsų slaptažodis ir saugyklos prisijungimo duomenys.
Užduotis O8.2: Atkūrimo bandymas
Šią užduotį atliekate patys; niekas jos netikrina. Pažymėkite, ką atlikote, ir pažymėkite užduotį kaip atliktą.
Saugykla (repository) yra pas kitą teikėją nei serveris. diff nerodo jokių skirtumų arba rodo tik failus, kurie pasikeitė po atsarginės kopijos. Slaptažodis laikomas slaptažodžių tvarkyklėje ir ant popieriaus; append-only kopija apsaugo nuo ištrynimo, jei į sistemą įsibrautų pašalinis asmuo.
Jūsų pažymėti varneliai ir pastabos lieka tik šioje naršyklėje; niekur jų nesiunčiame. Jei esate prisijungę, skiltyje Mano kursai išsaugome tik tai, kad užduotį atlikote.
Skaitykite daugiau
- Atsarginių kopijų strategija: 3-2-1 taisyklė Jūsų įmonei
- restic dokumentacija, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- restic dokumentacija, Removing backup snapshots (forget ir prune): https://restic.readthedocs.io/en/stable/060_forget.html
- restic dokumentacija, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
- Jūsų VPS momentinės kopijos ir atsarginės kopijos
- VPS: nuo pirmojo prisijungimo iki saugaus serverio 8.1: Atsarginės kopijos su restic kitoje vietoje
- VPS: nuo pirmojo prisijungimo iki saugaus serverio 8.2: Kaip tinkamai sukurti duomenų bazių ir Docker tomų atsargines kopijas
