Системный журнал — практичная база знаний по VPS и Linux
Системный журнал Системный журнал
Backup • Linux • VPS • Восстановление • restic

Проверка и восстановление backup Linux VPS: практическая тренировка

7 мин чтения Урок 5 из 6

Успешное сообщение «backup completed» доказывает только запись данных. Оно не подтверждает наличие нужных файлов, правильность дампа базы, сохранность ключа шифрования и способность команды вернуть сервис в работу. Резервная копия становится надёжной только после регулярной проверки и восстановления в изолированную среду.

Определите критерии успеха

До теста запишите:

  • какие сайты, базы и службы должны восстановиться;
  • целевой RPO — насколько свежей должна быть точка;
  • целевой RTO — сколько времени есть до запуска;
  • какие внешние зависимости нужны: DNS, object storage, SMTP, API-ключи;
  • кто принимает решение о переключении трафика.

Без критериев тест превращается в проверку нескольких случайных файлов.

Проверьте доступ к репозиторию и ключу

Для restic:

sudo sh -c '. /etc/restic/vps.env; restic snapshots'
sudo sh -c '. /etc/restic/vps.env; restic check'

Тест выполняйте тем же способом, который будет доступен при аварии. Если пароль существует только в файле на исходном VPS, удаление сервера сделает удалённый репозиторий бесполезным.

Отдельно подтвердите наличие:

  • пароля или ключа шифрования в защищённом хранилище;
  • учётных данных SFTP/S3;
  • инструкции установки restic совместимой версии;
  • данных MFA и аварийных кодов.

Проверьте структуру и данные restic

restic check проверяет внутреннюю согласованность репозитория. Для периодической глубокой проверки используйте доступные в вашей версии параметры чтения данных, учитывая стоимость трафика и объём:

sudo sh -c '. /etc/restic/vps.env; restic check --read-data-subset=10%'

Раз в более длительный период полезно прочитать все данные, если объём и backend позволяют. Проверка должна выполняться не одновременно с тяжёлой нагрузкой без оценки влияния на диск и сеть.

Восстановите снимок в отдельный каталог

Никогда не начинайте тест с перезаписи рабочего /etc или /var/www.

sudo install -d -m 700 /srv/restore-test
sudo sh -c '. /etc/restic/vps.env; restic restore latest \
  --target /srv/restore-test'

Посмотрите восстановленную структуру:

sudo find /srv/restore-test -maxdepth 3 -type d | sort | head -100
sudo du -sh /srv/restore-test
sudo find /srv/restore-test -xdev -type f | wc -l

Сверьте критичные файлы

Сравнение конфигурации:

sudo diff -ruN \
  /etc/nginx \
  /srv/restore-test/etc/nginx | less

Контрольные суммы отдельного файла:

sudo sha256sum \
  /etc/nginx/nginx.conf \
  /srv/restore-test/etc/nginx/nginx.conf

Различие не всегда ошибка: backup может быть старше текущей конфигурации. Важно понимать, какой снимок выбран и какие изменения после него будут потеряны.

Проверьте права и владельцев

sudo stat \
  /srv/restore-test/etc/ssh/sshd_config \
  /srv/restore-test/var/www \
  /srv/restore-test/root

Некоторые способы копирования не сохраняют ACL, extended attributes, capabilities или sparse-файлы. Для сервисов проверьте:

sudo getfacl -p /srv/restore-test/var/www 2>/dev/null | head
sudo getcap -r /srv/restore-test 2>/dev/null | head
sudo getfattr -R -d /srv/restore-test/etc 2>/dev/null | head

Проверьте конфигурации без запуска

Не все программы умеют тестировать конфигурацию с альтернативным корнем, но основные файлы можно скопировать во временную VM или контейнер. На отдельном тестовом VPS:

sudo nginx -t
sudo sshd -t
sudo php-fpm8.5 -t 2>/dev/null || true
sudo systemd-analyze verify \
  /etc/systemd/system/*.service 2>/dev/null

Для Docker Compose:

docker compose -f /srv/app/compose.yml config --quiet

Проверка синтаксиса не доказывает доступность секретов, DNS и внешних API, но быстро выявляет неполную копию.

Тест восстановления MariaDB

Создайте отдельную тестовую базу. Не импортируйте дамп поверх production.

sudo mariadb -e \
"DROP DATABASE IF EXISTS restore_test;
 CREATE DATABASE restore_test CHARACTER SET utf8mb4;"

Если дамп содержит одну базу без CREATE DATABASE:

zcat /srv/restore-test/var/backups/vps/databases/appdb.sql.gz \
  | sudo mariadb restore_test

Для полного дампа восстановление лучше выполнять на отдельном тестовом экземпляре MariaDB или новой VM, поскольку он может содержать системные базы, пользователей и события.

Проверка:

sudo mariadb restore_test -e 'SHOW TABLES;'
sudo mariadb restore_test -e \
"SELECT table_name, table_rows
 FROM information_schema.tables
 WHERE table_schema='restore_test'
 ORDER BY table_name;"

Выполните прикладную проверку: найдите известную запись, создайте тестовую транзакцию, запустите миграции в режиме проверки.

Тест восстановления PostgreSQL

sudo -u postgres dropdb --if-exists restore_test
sudo -u postgres createdb restore_test
sudo -u postgres pg_restore \
  --exit-on-error \
  --no-owner \
  --dbname=restore_test \
  /srv/restore-test/var/backups/vps/databases/postgresql-appdb.dump

Проверка:

sudo -u postgres psql restore_test -c '\dt'
sudo -u postgres psql restore_test -c \
"SELECT schemaname, relname, n_live_tup
 FROM pg_stat_user_tables
 ORDER BY relname;"

Custom dump может содержать код, созданный владельцем исходной базы. Восстанавливайте данные только из доверенного источника и в изолированном окружении.

Проверьте приложение, а не только таблицы

Для тестового сайта:

  1. Создайте временное доменное имя или запись в локальном hosts.
  2. Запустите копию приложения с восстановленной базой.
  3. Отключите реальную отправку почты, платежи и внешние webhooks.
  4. Проверьте вход, чтение и запись данных, загрузку файлов и фоновые задания.
  5. Сравните число ключевых объектов с production.

Именно прикладной тест выявляет отсутствующий volume, секрет, ключ шифрования или отдельную таблицу.

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

Не реже нескольких раз в год проведите полный сценарий:

  1. Создайте чистый VPS у того же или другого провайдера.
  2. Установите поддерживаемую ОС и минимальные пакеты.
  3. Получите доступ к удалённому backup без исходного сервера.
  4. Восстановите конфигурацию, файлы и базы.
  5. Исправьте сетевые адреса и секреты окружения.
  6. Проверьте конфигурации до запуска.
  7. Запустите службы в правильном порядке.
  8. Выполните внешний health-check.
  9. Зафиксируйте реальное время восстановления.

Не переключайте публичный DNS во время учебного теста. Используйте временное имя, локальный hosts или закрытую сеть.

Порядок запуска служб

Типовая последовательность:

  1. Сеть, DNS и точное время.
  2. Хранилища и volumes.
  3. MariaDB/PostgreSQL.
  4. Очереди и cache.
  5. Приложение и фоновые workers.
  6. Nginx/reverse proxy.
  7. Timers, cron и мониторинг.

Не включайте все cron-задачи до проверки базы: они могут отправить письма, удалить данные по retention или повторно обработать старую очередь.

Проверка сертификатов и DNS

В backup могут находиться старые ACME-сертификаты. На тестовом сервере не запускайте массовое получение сертификатов для production-доменов. Сначала проверьте конфигурацию с временным сертификатом или staging ACME.

Перед реальным переключением:

dig A example.net +short
dig AAAA example.net +short
curl -I --resolve example.net:443:NEW_IP \
  https://example.net/

--resolve позволяет проверить новый сервер до изменения DNS.

Сформируйте отчёт теста

После каждой тренировки сохраните:

  • ID и дату восстановленного snapshot;
  • контрольные суммы и результат repository check;
  • время каждого этапа;
  • отсутствующие файлы и секреты;
  • ошибки дампов и миграций;
  • фактический RPO/RTO;
  • изменения в инструкции и backup-скриптах;
  • дату следующего теста.

Безопасная очистка теста

Восстановленная копия содержит production-данные и секреты. После проверки:

sudo rm -rf --one-file-system /srv/restore-test
sudo -u postgres dropdb --if-exists restore_test
sudo mariadb -e 'DROP DATABASE IF EXISTS restore_test;'

Удалите временные VPS, object-storage credentials, DNS-записи и локальные копии дампов. Если данные персональные, соблюдайте внутреннюю политику доступа и уничтожения.

Рекомендуемая периодичность

  • После каждого backup — контроль кода завершения и появления snapshot.
  • Еженедельно — просмотр снимков и журналов.
  • Ежемесячно — restic check и восстановление выборочных файлов.
  • Ежеквартально — восстановление базы и тест приложения.
  • Несколько раз в год — полное восстановление на чистом VPS.
  • После смены архитектуры, СУБД или хранилища — внеплановая тренировка.

Итоговый критерий

Backup считается рабочим, если независимый администратор может получить к нему доступ без исходного сервера, восстановить выбранную точку, запустить приложение и уложиться в заявленные RPO/RTO. Всё остальное — лишь предположение о наличии резервной копии.