Към съдържанието

Настройки за бисквитки

Изберете кои видове бисквитки разрешавате. Можете да промените избора си по всяко време чрез „Настройки за бисквитки“ в долната част на всяка страница. Декларация за поверителност

Необходими

Винаги включени

Нужни са за вход, за запазване на количката и на Вашите избори. Те са винаги включени.

Кои бисквитки?
  • weboke_sessie, weboke_klant, weboke_remember: Вашата сесия и оставането в акаунта
  • weboke_basket: Вашата количка
  • wkBtwIncl: показване на цените с или без ДДС
  • wok_cookies: Вашият избор за бисквитките, 12 месеца

Измерват коя реклама води до посещение или поръчка, за да не плащаме за реклами без резултат.

Кои бисквитки?
  • Google Ads чрез Google Tag Manager (_gcl_au, _gcl_aw), до 90 дни
  • OpenAI Ads, реклами в ChatGPT
  • wok_aff: кой партньор Ви е препратил към нас (партньорска програма), 60 дни

4,6

Държава и език

Всяка държава има собствен сайт, с цените и ДДС на тази държава.

Преглед

Резервни копия с 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
gelijk

latest е най-новият 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)

1. Какво се случва, ако изпълните restic forget --keep-daily 7 без --prune?



2. Паролата на Вашето restic repository се намира само в /root/.restic-wachtwoord на сървъра. Сървърът е загубен. Какво сега?



3. Защо възстановявате резервно копие в /tmp/terug, а не директно на първоначалното място?



4. Какво добавя restic check --read-data-subset=5% към обикновения restic check?



5. Нападател, който превземе Вашия уеб сървър, може чрез скрипта за резервни копия да изпълни и restic forget --prune. Какво защитава от това?



Задача

Задача Z8.2: Какво остава след forget? В примерния файл restic-snapshots.txt има списък със snapshots и схема за съхранение. Определете кои snapshots остават след restic forget с тази схема. Програмата сравнява с фиксирания ключ.

Задача Z8.2: Какво остава след forget?

Файл към тази задача: restic-snapshots.txt





Това, което въвеждате, и резултатите от проверката не се съхраняват. Браузърът Ви запомня отговорите и дали сте изпълнили задачата. Ако сте влезли, запазваме само дали задачата е била (почти) правилна в Моите курсове; и там можете да го изтриете.

Задача O8.2: Тест за възстановяване. Създайте на Вашия собствен сървър restic repository извън сървъра, направете резервно копие на /etc и Вашите данни и възстановете една папка в /tmp/terug. Сравнете с diff, запишете колко време е отнело и отговорете къде извън сървъра се съхраняват Вашата парола и данните за достъп до хранилището.

Задача O8.2: Тест за възстановяване

Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.




Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.

Още за четене

Моля, изчакайте…

Настройте домейните си

За всеки домейн настройте сървърите за имена, връзката с хостинга и кой ще бъде собственикът.

Домейните Ви се зареждат…