Бэкапы VPS: снапшоты, копии в S3 и restic — что выбрать и как настроить

Чем снапшот отличается от копии в S3 и от restic, как настроить резервное копирование каталогов и баз на VPS, проверить восстановление и не потерять данные при падении сервера.

Команда EGN 8 мин чтения
Бэкапы VPS: снапшоты, копии в S3 и restic — что выбрать и как настроить
Содержание 20
  1. Коротко
  2. Три слоя защиты
  3. Как это выглядит в кабинете EGN
  4. Настройка restic с S3
  5. Резервная копия каталогов
  6. Срок хранения и очистка
  7. Расписание через cron
  8. Проверка восстановления
  9. Симптом → причина → решение
  10. Примеры
  11. Что будет при переустановке
  12. Что копировать и как часто
  13. Симптом → причина → решение (восстановление)
  14. Частые ошибки
  15. Итог
  16. Вопросы и ответы
  17. Снапшот — это то же самое, что бэкап?
  18. Сколько хранить копий?
  19. Можно ли обойтись без restic?
  20. Как часто делать копии?

Самая дорогая ошибка на VPS — отсутствие копий. Сервер можно случайно удалить, испортить обновлением или потерять вместе с машиной, на которой он работает. Поэтому бэкап — не опция, а часть настройки. Вопрос только в том, какой вариант выбрать и как проверить, что он работает.

Коротко

Снапшот — это быстрый откат всего диска на момент снимка, но он хранится на той же ноде и может пропасть вместе с ней. Копия в отдельном хранилище S3 переживает падение сервера. restic создаёт зашифрованные версии каталогов в S3 или на другом диске и управляет сроком хранения. Для надёжности комбинируйте: снапшот перед обновлением и restic по расписанию.

Три слоя защиты

Каждый вариант отвечает на свой вопрос. Снапшот отвечает на вопрос «как откатиться за минуту»: перед обновлением ядра или большой правкой конфигов вы снимаете снапшот и при ошибке возвращаете диск. Копия в S3 отвечает на вопрос «что делать, если сервер пропал»: данные лежат в другом месте, и их можно развернуть на новом VPS. restic отвечает на вопрос «какая версия файла была неделю назад» и даёт шифрование, дедупликацию и проверку целостности.

Три слоя: снапшот на ноде, копия в S3 и версии restic
Три слоя: снапшот на ноде, копия в S3 и версии restic

Важное различие: снапшот не заменяет копию. В кабинете EGN это прямо сказано в описании вкладки «Бэкапы»: копия диска хранится в отдельном хранилище S3, вне сервера и его ноды, и переживает потерю сервера. Снапшоты при этом лежат на локальном хранилище ноды.

Как это выглядит в кабинете EGN

В карточке VPS есть две вкладки: «Снапшоты» и «Бэкапы». Первая нужна для быстрых откатов, вторая — для копий в S3. На вкладке «Бэкапы» доступны две категории: «Горячее» с быстрым восстановлением и «Холодное», которое дешевле, но восстанавливается медленнее. Кнопка «Сделать копию сейчас» запускает копию вручную, а блок «Копии по расписанию» задаёт автоматику. Снапшоты оплачиваются по фактическому размеру снимка, списание идёт ежедневно, и у сервера есть лимит числа снапшотов, поэтому ненужные удаляйте. Актуальные цены и лимиты показаны в самой карточке.

Вкладка «Бэкапы» в карточке VPS
Вкладка «Бэкапы» в карточке VPS

Порядок действий в панели:

  1. Откройте карточку сервера в разделе «Облачные серверы».
  2. Перейдите на вкладку «Бэкапы» и выберите тип хранения: горячее для часто меняющихся данных, холодное для архивов.
  3. Нажмите «Сделать копию сейчас» перед важной операцией и дождитесь статуса готовности.
  4. Настройте расписание, если копии нужны регулярно. Если расписание выключено, копии делаются только вручную, и про них легко забыть.
  5. На вкладке «Снапшоты» создавайте снимок перед обновлением системы и удаляйте его, когда убедились, что всё работает.

Настройка restic с S3

restic — программа для резервного копирования, которая хранит данные в зашифрованном репозитории. Установите её и создайте репозиторий в S3. Пример для S3-совместимого хранилища:

Терминал
sudo apt install -y restic
export RESTIC_REPOSITORY=s3:https://s3.example.com/vps-backups
export RESTIC_PASSWORD_FILE=/root/.restic-pass
export AWS_ACCESS_KEY_ID=ваш-ключ
export AWS_SECRET_ACCESS_KEY=ваш-секрет
restic init

Эти же четыре строки удобно положить в файл /root/.restic-env (права 600) и подключать командой source /root/.restic-env.

Пароль репозитория сохраните в файл /root/.restic-pass с правами 600. Потерять пароль нельзя: восстановить данные без него невозможно. Ключи доступа к S3 держите в отдельном файле с правами 600 (ниже /root/.restic-env), а не в скриптах, которые попадают в git.

Для локального теста можно создать репозиторий на другом диске:

Терминал
restic -r /srv/restic-test init

Резервная копия каталогов

Копируйте не всё подряд, а то, что нельзя восстановить заново: конфиги, данные приложений, дампы баз, а не системные каталоги. Пример для сайта и настроек nginx:

Терминал
restic backup /var/www /etc/nginx /root/backups
restic snapshots

Команда restic snapshots выводит список версий с идентификаторами и датами. Каждая новая копия хранит только изменившиеся блоки, поэтому повторные запуски занимают мало места.

Срок хранения и очистка

Без политики хранения репозиторий растёт бесконечно. Команда forget удаляет старые версии по правилам, а --prune освобождает место:

Терминал
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

Эта команда оставляет семь последних дневных копий, четыре недельные и шесть месячных. Перед первым запуском посмотрите, что будет удалено, добавив --dry-run.

Расписание через cron

Запускайте резервное копирование по расписанию. Скрипт /root/restic-backup.sh подключает файл с переменными, выполняет backup и forget. Затем добавьте его в cron:

Терминал
#!/bin/bash
set -e
source /root/.restic-env
restic backup /var/www /etc/nginx /root/backups
restic forget --keep-daily 7 --keep-weekly 4 --prune
Терминал
sudo chmod 700 /root/restic-backup.sh
sudo crontab -e

Строка для cron, которая запускает скрипт каждый день в 3:15:

Терминал
15 3 * * * /root/restic-backup.sh >> /var/log/restic-backup.log 2>&1

Лог поможет понять, что пошло не так, если копия перестала создаваться.

Проверка восстановления

Копия, которую не восстанавливали, не считается. Раз в месяц проверяйте восстановление на отдельном каталоге:

Терминал
restic check
restic restore latest --target /root/restore-test --include /etc/nginx
ls /root/restore-test/etc/nginx

restic check проверяет целостность репозитория, а восстановление в тестовый каталог показывает, что файлы действительно извлекаются. После проверки удалите каталог /root/restore-test.

Симптом → причина → решение

Симптом Частая причина Что сделать
Fatal: wrong password Пароль в файле не совпадает с репозиторием Проверьте RESTIC_PASSWORD_FILE, пароль нельзя восстановить
Fatal: unable to open config file Неверный адрес или ключи S3 Проверьте RESTIC_REPOSITORY и ключи доступа
Копия растёт слишком быстро Бэкапят кеши, логи и временные файлы Исключите их через --exclude
Старые версии не удаляются forget запускали без --prune Добавьте --prune или запустите restic prune
Cron не создаёт копии Скрипт не выполняется или нет переменных Смотрите /var/log/restic-backup.log и запускайте скрипт вручную
После отката снапшота пропали свежие изменения Откат возвращает диск на момент снимка, всё позднее теряется Снимайте снапшот непосредственно перед операцией, а данные, изменённые после него, сохраняйте отдельно

Примеры

Обновление ядра. Снимите снапшот, выполните обновление, перезагрузите сервер. Если система не поднялась, откатитесь на снапшот. Сразу после успешной проверки снапшот можно удалить.

Переезд сайта на другой VPS. Сделайте restic-копию каталогов и дамп базы, разверните их на новом сервере командой restic restore latest --target /, восстановите базу по дампу. Этот сценарий отрабатывает раз, когда вы переносите сервис.

Удалили файл по ошибке. Найдите версию командой restic snapshots, затем восстановите конкретный файл: restic restore <id> --target /root/restore-test --include /var/www/index.html.

Что будет при переустановке

Переустановка ОС на VPS удаляет файлы, базы и настройки на диске. Снапшоты и резервные копии при этом остаются, и к ним можно вернуться (так сказано в окне подтверждения переустановки в кабинете). Копии restic во внешнем S3 тоже не затрагиваются: после переустановки поставьте restic и выполните restic restore.

Что копировать и как часто

Разные данные меняются с разной скоростью, поэтому и копировать их нужно по-разному:

Что Как часто Куда Срок хранения
Дамп базы раз в сутки S3 через restic 7 дней, 4 недели, 6 месяцев
Каталог сайта и загрузки раз в сутки S3 через restic 7 дней, 4 недели
Конфиги nginx, cron, systemd раз в неделю и перед правкой S3 через restic 4 недели
Снапшот VPS перед обновлением ядра или крупной правкой в кабинете до проверки результата
Миры и файлы игрового сервера по расписанию игры или раз в сутки S3 или снапшот 7 дней и 4 недели

Таблица не универсальная: сверяйтесь с тем, сколько данных вы готовы потерять. Если сайт меняется каждый час, копируйте чаще.

Симптом → причина → решение (восстановление)

Симптом Причина Решение
restic restore завершился, но файлов нет Указан неверный --target или --include Выведите список restic ls latest, проверьте пути
Восстановленная база не поднимается Дамп снят с другой версии PostgreSQL Восстанавливайте на ту же версию или выполните миграцию
Права файлов после восстановления неверные restic сохраняет владельца, но не всегда в новой системе Проверьте chown для каталогов приложения после восстановления

Частые ошибки

  • Снапшот принимают за бэкап. Снапшот на той же ноде не спасёт при её потере. Нужна отдельная копия.
  • Пароль restic хранят в скрипте. Файл с паролем должен иметь права 600 и не попадать в git.
  • Копируют всё подряд. Системные каталоги проще восстановить переустановкой, а конфиги и данные нужно сохранить.
  • Не проверяют восстановление. Через полгода выясняется, что копии пустые или повреждены.
  • Дампы баз не делают отдельно. Копия каталога с работающей базой может быть несогласованной, поэтому используйте дамп, как описано в статье База данных на VPS: MySQL или PostgreSQL без утечек в интернет.
  • Не следят за местом. Растущий репозиторий без forget в какой-то момент упрётся в лимит.

Итог

Работающая схема бэкапов VPS состоит из трёх частей: снапшот для быстрого отката, копия в S3 на случай потери сервера и restic с расписанием и политикой хранения. Проверяйте восстановление раз в месяц. Если сервер ставится под игры, посмотрите статью Игровой сервер на VPS или хостинг игр, там разобрано, когда копии делает панель, а когда вам.

Вопросы и ответы

Снапшот — это то же самое, что бэкап?

Нет. Снапшот хранится на той же ноде и откатывает диск, а копия в S3 лежит отдельно и переживает падение сервера.

Сколько хранить копий?

Для большинства проектов хватает семи ежедневных, четырёх недельных и шести месячных. Для важных данных добавьте ещё годовые.

Можно ли обойтись без restic?

Да, если вы копируете один каталог и вам достаточно архива через tar. restic нужен, когда важны версии, шифрование и проверка целостности.

Как часто делать копии?

Для данных, которые меняются каждый час, ежечасно или чаще. Для сайта и конфигов обычно хватает раза в сутки.

Сервер под игры за пару минут — egnetwork.ru

Читать далее

Вся рубрика →