Зеркало на двух дисках защищает от поломки диска, снимки защищают от случайного удаления. Но пожар, кража или вирус-шифровальщик уничтожат всё сразу. Поэтому у меня три копии:
- Рабочие данные на зеркале в домашнем сервере.
- Репозиторий restic на отдельном внешнем диске.
- Такой же репозиторий на 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
Настроенный бэкап ещё не значит работающий бэкап. Как я это проверяю, описано в статье про восстановление.