Бэкапы домашнего сервера с restic
Долгое время бэкап у меня был rsync на соседний диск. Это не бэкап, а зеркало: удалённый по ошибке файл аккуратно удаляется и в копии. Перешёл на restic — он делает снапшоты с дедупликацией и шифрованием, а хранить их можно где угодно, от второго диска до S3.
Репозиторий
Храню на NAS по SFTP. Пароль от репозитория — в файле, доступном только root:
install -m 600 /dev/null /etc/restic/password
# записать туда длинный случайный пароль
export RESTIC_REPOSITORY=sftp:backup@nas:/srv/restic/home
export RESTIC_PASSWORD_FILE=/etc/restic/password
restic init
Пароль от репозитория надо сохранить где-то ещё, кроме самого сервера. Без него снапшоты — это просто шум, восстановить их не получится никак.
Что и как копировать
restic backup /etc /home /srv \
--exclude-file=/etc/restic/excludes \
--one-file-system
В excludes — всё, что восстанавливается само или не нужно вовсе:
/home/*/.cache
/srv/*/tmp
*.iso
node_modules
Базы данных копировать как файлы на лету бессмысленно — перед бэкапом делаю дамп (pg_dump, sqlite3 .backup) в /srv/dumps, а копируется уже он.
Сколько хранить
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Неделя ежедневных, месяц еженедельных, полгода ежемесячных. --prune сразу освобождает место; на медленном хранилище его можно запускать реже, например раз в неделю.
Проверка — обязательно
Бэкап, из которого ни разу не восстанавливали, — это надежда, а не бэкап. Раз в неделю проверяю целостность с чтением части данных:
restic check --read-data-subset=5%
Раз в пару месяцев — настоящее восстановление в отдельный каталог:
restic snapshots
restic restore latest --target /tmp/restore --include /etc/nginx
diff -r /etc/nginx /tmp/restore/etc/nginx
Расписание
Всё это завёрнуто в скрипт и запускается systemd-таймером — подробно про таймеры в отдельной заметке. Бэкап ночью, check по воскресеньям отдельным таймером, чтобы долгая проверка не задерживала основной бэкап.