Резервная копия, которую можно восстановить, — это разница между неприятным днём и потерей проекта. Идея изложена в базовом руководстве по резервному копированию VPS. Здесь мы идём дальше с restic и BorgBackup: двумя инструментами, которые делают зашифрованные резервные копии с дедупликацией на второй сервер или в объектное хранилище.
Почему restic или borg, а не простое копирование
- Дедупликация. Сохраняются только изменённые данные, поэтому ежедневные снимки остаются небольшими.
- Шифрование. Данные шифруются до того, как покинут ваш сервер.
- Снимки. Можно восстановить состояние на любой из прошедших дней.
- Проверка. Оба инструмента умеют проверять целостность репозитория.
Выберите что-то одно. Restic прост и работает со многими типами хранилищ, включая SFTP и S3-совместимые. Borg очень эффективен и работает по SSH с сервером, на котором установлен borg.
Куда отправлять копии
Никогда не храните единственную резервную копию на том же сервере. Используйте второй VPS в другой локации, S3-совместимое хранилище или storage box. Небольшой VPS с большим диском — недорогой вариант для резервных копий. См. тарифы VPS.
Restic: настройка
sudo apt install -y restic
export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic/myserver"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic init
Создайте файл с паролем, используя длинный случайный пароль, и храните его копию офлайн. Без этого пароля копии не восстановить.
restic backup /etc /home /var/www --exclude-caches
restic snapshots
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic check
Borg: настройка
sudo apt install -y borgbackup
export BORG_REPO="ssh://backup@backup.example.com/srv/borg/myserver"
borg init --encryption=repokey-blake2
borg create --stats --compression zstd ::'{hostname}-{now:%Y-%m-%d}' /etc /home /var/www
borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 6
borg check
Экспортируйте и сохраните ключ репозитория с помощью borg key export.
Базы данных требуют осторожности
Не копируйте файлы работающей базы данных. Сначала сделайте дамп и копируйте его:
mysqldump --single-transaction --all-databases | gzip > /var/backups/db.sql.gz
sudo -u postgres pg_dumpall | gzip > /var/backups/pg.sql.gz
Настройте расписание
Запускайте резервное копирование через таймер systemd или cron. Простая строка cron:
15 3 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Настройте оповещение о сбое, например пинг мониторинга в конце скрипта.
Проверьте восстановление
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls /tmp/restore-test
Время от времени проверяйте настоящее восстановление на запасной машине. Резервная копия, которую вы ни разу не проверяли, — это всего лишь надежда.