Пара 24: Backup, восстановление и стабилизация

90 минут · 3 курс, ML.

Содержание и результат

Сделать проверяемую копию учебного volume и восстановить данные в новый том.

План занятия

0–10: контекст и исходная задача. 10–40: устройство и механизмы. 40–55: демонстрация команд. 55–80: лабораторная работа. 80–90: разбор результата и фиксация исправлений.

Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.

RPO и RTO

Решаем, сколько данных и времени можем потерять.

RPO — допустимый интервал потери данных, RTO — целевое время восстановления. Это цели, а не измеренные факты до проверки. Для append-only учебного events.jsonl холодная копия после остановки app проще согласованного online-backup. Для базы данных одного tar работающего volume может быть недостаточно: нужен штатный механизм и консистентность. Для курсового проекта определяем учебную цель и измеряем реальное восстановление. Наличие архива не доказывает, что он читается, содержит нужные данные и подходит версии приложения.

Аналогия: запасной ключ полезен, если он подходит к текущему замку.

Независимая копия

Volume защищает от пересоздания, backup — от потери состояния.

Скрипт backup.sh останавливает только app, копирует events.jsonl через docker compose cp в отдельную папку и считает SHA-256. Затем вновь запускает app. Учебная копия на том же ноутбуке нужна для практики, но не защищает от отказа самого диска или кражи. Для реального проекта нужна независимая копия с подходящим доступом и политикой хранения. Не называем общую папку Windows независимым backup только потому, что у неё другой путь. Проверка checksum обнаруживает изменение байтов, но не гарантирует бизнес-корректность всех данных.

Аналогия: копия документов в другом ящике того же сгоревшего шкафа не спасает.

Восстанавливаем отдельно

Не уничтожаем исходное состояние ради доказательства backup.

Скрипт restore-check.sh поднимает временный контейнер с новым volume, копирует архивные данные, запускает приложение на другом localhost-порту и проверяет healthz и строки. Исходный учебный volume не удаляется. Для восстановления проверяем формат JSON, checksum и контракт приложения. Затем фиксируем время и результат. После опыта временный контейнер и только его том удаляются. Это безопаснее упражнения «удали всё и надеясь восстанови». Стабилизация включает документированный запуск, ограничения, мониторинг, проверенный откат и восстановление, а не только бесконечные рестарты.

Аналогия: аварийную копию сначала проверяют на запасном приборе.

Команды и наблюдения

Окружение: Ubuntu / Bash, lab.

bash scripts/backup.sh
# Use the exact backup path printed by the script
bash scripts/restore-check.sh backups/EXACT_DIRECTORY
# Review checksum, JSON validity, row count and health response

EXACT_DIRECTORY — обозначение, замените реально выведенным именем. Не запускайте эту строку буквально. Скрипты работают только с текущим учебным compose.

Ожидаемый результат: Созданы events.jsonl и SHA256SUMS; отдельный восстановленный сервис отвечает и читает сохранённые строки.

Вариант для macOS

Скрипты комплекта выбирают sha256sum в Linux и shasum -a 256 в macOS автоматически. Все данные извлекаются через Docker, не через закрытые папки Desktop. Backup на том же Mac остаётся учебной копией.

bash scripts/backup.sh
# Replace EXACT_DIRECTORY with the printed backup path
bash scripts/restore-check.sh backups/EXACT_DIRECTORY

Практика: Проверить, а не просто скопировать

  1. Создайте минимум три события и сделайте cold backup.
  2. Запишите исходное число строк и checksum.
  3. Восстановите в отдельный временный volume, проверьте JSON и здоровье приложения.
  4. Запишите фактическое время; объясните, какие угрозы копия на том же ноутбуке не закрывает.

Результат: Архив, checksum и restore-report.md с измеренным результатом.

Проверка: Основной том сохранён; восстановление действительно проверено; RPO/RTO не выдаются за достигнутые без измерения.

Неисправность для разбора: Архив оказался пустым или относится к другому Compose project.

Решение и диагностика

Выполняйте backup после наличия событий. Скрипт прекращает операцию при пустом/невалидном файле и восстанавливает запуск app через trap. Для restore нужен локальный образ studypulse:v1; получите его через docker build -t studypulse:v1 . заранее. Проверка использует новый именованный том и порт 8002, не трогая основной app. Документируйте любое несовпадение количества строк и не стирайте оригинал.

Основные выводы

Самостоятельная работа

Дополнить runbook восстановлением и планом независимого хранения для настоящего проекта.

Источники