Модул 8 · 8.2
Резервни копия с restic
Модул 8: Резервни копия и наблюдение · Време за четене: 12 минути
Цел на урока: След този урок ще можете с restic да правите криптирани резервни копия към хранилище извън Вашия сървър, да изтривате стари версии според схема за съхранение, да проверявате резервното копие и да възстановявате файлове, както и да настроите всичко да работи автоматично.
Основни понятия: restic, repository, init, парола (файл с парола), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, дедупликация, append-only, systemd таймер
Защо restic?
Съществуват много програми за резервни копия. restic е добър избор за собствен сървър, защото:
- криптира всичко, преди то да напусне сървъра; хранилището вижда само нечетими блокове;
- прави дедупликация: файл, който не е променен, не се записва отново, така че ежедневните резервни копия заемат малко място;
- поддържа много видове хранилища: папка, друг сървър чрез SFTP, S3-съвместимо хранилище, собствен rest-server;
- е една-единствена програма, налична в хранилището с пакети на Debian и Ubuntu (
apt install restic).
Алтернатива с подобни възможности е BorgBackup. Принципите от този урок важат и за нея.
Понятията
- Repository: мястото, където restic съхранява резервните копия. Винаги извън сървъра, който архивирате.
- Snapshot: едно резервно копие в един момент. (Внимание: това е различно нещо от snapshot на Вашия доставчик от урок 8.1.)
- Парола: всяко repository има парола, с която се криптира всичко. Документацията на restic е категорична: който загуби паролата, губи данните безвъзвратно.
Създаване на repository
Да предположим, че имате сървър за съхранение backup.example.net, до който имате достъп чрез SFTP с ключ, като потребител web1. Първо създайте файл с паролата на сървъра (и запазете същата парола във Вашия мениджър на пароли, урок 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.С променливите на средата RESTIC_REPOSITORY и RESTIC_PASSWORD_FILE не е нужно всеки път да въвеждате опциите -r и --password-file.
Създаване на резервно копие
Първо дъмпът на базата данни (урок 8.1), след това резервното копие:
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 savedНа следващия ден то е много по-бързо: включва се само това, което се е променило.
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Почистване: forget и prune
Всеки ден по един нов snapshot означава 365 snapshots след една година. С forget определяте кои да запазите, чрез схема за съхранение:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneЕто как работи схемата:
--keep-daily 7: разглеждат се последните седем дни, в които има snapshot, и за всеки ден се запазва най-новият;--keep-weekly 4: същото за последните четири седмици (от понеделник до неделя включително);--keep-monthly 6: същото за последните шест месеца.
Един snapshot остава, ако отговаря на поне едно от правилата. Всичко, което не отговаря на нито едно правило, се забравя. Изпробвайте новата схема първо с --dry-run: така ще видите какво би се изтрило, без нищо да се промени.
Важна разлика: forget премахва само препратката към даден snapshot. Данните остават в repository, докато prune не изчисти блоковете, които вече не се използват от нито един snapshot. Опцията --prune към forget прави това наведнъж. Prune отнема време и заключва repository; затова не го планирайте едновременно с резервното копие.
Проверка: check
Резервно копие, което тихо се повреди, ще забележите едва при възстановяване. Нека restic редовно проверява repository:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Само check проверява структурата. С --read-data-subset той действително прочита обратно част от данните и проверява съдържанието. Правете това например ежеседмично с няколко процента; така с времето всичко ще бъде прочетено поне веднъж.
Възстановяване: restore и mount
Възстановявайте в отделна папка, никога директно върху оригинала:
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 е най-новият snapshot; можете да използвате и ID (restic restore 3c7e91d4 ...). С restic mount /mnt/restic (изисква FUSE) виждате всички snapshots като папки и можете да ги разглеждате и да копирате отделни файлове. Спиране с Ctrl+C.
Базата данни възстановявате, като извлечете дъмпа и го импортирате, например gunzip < alles.sql.gz | mariadb.
Автоматично, всяка нощ
Създайте скрипт и systemd таймер (урок 6.3). Скриптът:
#!/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 с Type=oneshot и ExecStart=/usr/local/sbin/backup.sh, и един .timer с OnCalendar=*-*-* 03:10:00 и Persistent=true. set -eu гарантира, че скриптът спира при първата грешка, така че systemd отчита изпълнението като неуспешно. Свържете към него известяване (урок 8.3), иначе няма да забележите неуспешно резервно копие.
Срещу ransomware: append-only
В скрипта по-горе самият сървър може и да изтрие резервното копие (forget и prune). Ако нападател превземе сървъра, значи и той може да го направи. Два начина да предотвратите това:
- rest-server в режим append-only: на сървъра за съхранение стартирате собствения rest-server на restic с опцията
--append-only. Тогава уеб сървърът може да добавя резервни копия, но не може да изтрива нищо. Почистването (forget --prune) извършвате от друга, добре защитена машина с пълни права. - Хранилище с версии или заключване на обекти при S3 доставчик, така че изтритите обекти да могат да бъдат възстановени още известно време.
Обърнете внимание на един коварен капан, който документацията на restic сама споменава: нападател, който добавя фалшиви snapshots, може да накара схема като --keep-weekly да забрави истински snapshots. С --keep-within (например --keep-within 30d) всичко от този период остава, фалшиво или истинско.
Обобщение
- restic криптира, прави дедупликация и може да записва в много видове хранилища извън Вашия сървър; загубена парола означава загубено всичко.
initсъздава repository,backupсъздава snapshot,snapshotsги показва.forgetс--keep-*определя какво запазвате; едваprune(или--prune) наистина изчиства данните. Изпробвайте с--dry-run.check(с--read-data-subset) проверява,restore --targetвъзстановява в отделна папка,mountВи позволява да разглеждате.- Автоматизирайте с таймер и известяване и дръжте поне едно repository извън обсега на сървъра (append-only).
Тест (quiz)
Задача
Задача Z8.2: Какво остава след forget? В примерния файл restic-snapshots.txt има списък със snapshots и схема за съхранение. Определете кои snapshots остават след restic forget с тази схема. Програмата сравнява с фиксирания ключ.
Задача O8.2: Тест за възстановяване. Създайте на Вашия собствен сървър restic repository извън сървъра, направете резервно копие на /etc и Вашите данни и възстановете една папка в /tmp/terug. Сравнете с diff, запишете колко време е отнело и отговорете къде извън сървъра се съхраняват Вашата парола и данните за достъп до хранилището.
Задача O8.2: Тест за възстановяване
Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.
Repository се намира при друг доставчик, различен от този на сървъра. diff не показва разлики или само файлове, които са се променили след резервното копие. Паролата е в мениджъра на пароли и на хартия; append-only копие предпазва от изтриване от нарушител.
Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.
Още за четене
- Стратегия за резервно копиране: правилото 3-2-1 за Вашата собствена фирма
- Документация на restic, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- Документация на restic, Removing backup snapshots (forget и prune): https://restic.readthedocs.io/en/stable/060_forget.html
- Документация на restic, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
