Cloud Boxi

Правило 3-2-1 на практике: restic, внешний диск и VPS

Правило простое: три копии данных, на двух разных носителях, одна из них вне дома. Покажу, как я собрал его из restic, недорогого внешнего диска и VPS.

Зеркало на двух дисках защищает от поломки диска, снимки защищают от случайного удаления. Но пожар, кража или вирус-шифровальщик уничтожат всё сразу. Поэтому у меня три копии:

  1. Рабочие данные на зеркале в домашнем сервере.
  2. Репозиторий restic на отдельном внешнем диске.
  3. Такой же репозиторий на VPS в Германии.

Почему restic

restic шифрует данные на стороне клиента, разбивает файлы на блоки и хранит каждый блок один раз. Переименованная папка с фотографиями не займёт места второй раз. Каждый запуск создаёт полноценный снимок, хотя на диск записываются только изменения. Для моих данных ночной прирост составляет от нескольких сотен мегабайт до 5 ГБ.

Первый репозиторий

Пароль храню в файле, доступном только root, и держу бумажную копию вне дома. Без него репозиторий не откроет никто, включая меня.

sudo install -d -m 700 /etc/restic
sudo sh -c 'openssl rand -base64 32 > /etc/restic/password'
sudo chmod 600 /etc/restic/password

export RESTIC_PASSWORD_FILE=/etc/restic/password
sudo -E restic -r /mnt/backup/restic init

Что не надо копировать

Кэши и миниатюры быстро занимают гигабайты, а восстанавливать их незачем. Список лежит в restic-excludes.txt, его можно расширять под свои папки.

Ночной запуск

restic -r /mnt/backup/restic backup /srv/data /etc \
    --exclude-file=/etc/restic/excludes.txt --tag nightly

restic -r /mnt/backup/restic forget --tag nightly \
    --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune

Правило хранения простое: семь ежедневных снимков, пять еженедельных и двенадцать ежемесячных. Год истории занимает всего на 15% больше места, чем одна полная копия.

Копия вне дома

Второй репозиторий создаётся с теми же параметрами разбиения на блоки, иначе дедупликация между копиями не сработает:

restic --repository-file /etc/restic/remote-url init \
    --from-repo /mnt/backup/restic \
    --from-password-file /etc/restic/password \
    --copy-chunker-params

После этого новые снимки переносятся одной командой, а передаются только недостающие блоки:

restic --repository-file /etc/restic/remote-url copy \
    --from-repo /mnt/backup/restic \
    --from-password-file /etc/restic/password

Первая заливка 1,3 ТБ на домашнем канале заняла трое суток. Потом ночной обмен укладывается в полчаса. Как устроен приём на стороне VPS, я описал в статье про rest-server.

Таймер

Всё вместе лежит в backup.sh и запускается таймером systemd. Параметр Persistent=true запустит пропущенный бэкап, если сервер ночью был выключен.

sudo cp restic-backup.service restic-backup.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer

Настроенный бэкап ещё не значит работающий бэкап. Как я это проверяю, описано в статье про восстановление.