Резервное копирование
Стратегия и порядок бэкапа развёрнутой платформы DataHUB. Описывает что бэкапить, как часто, куда складывать и как восстанавливать. Конкретные инструменты — pg_dump, rabbitmqctl export_definitions, tar — стандартные, подходят для любой Linux-инфраструктуры.
Что подлежит бэкапу
| Объект | Критичность | Источник истины |
|---|---|---|
База PostgreSQL (DataHUB) |
критичный | postgres:/var/lib/postgresql/data |
| Определения RabbitMQ (exchange/queue/binding/user) | важный | Management API → JSON |
Конфигурации /etc/datahub/ |
важный | хост-файловая система |
| TLS-сертификаты | важный | /etc/datahub/nginx/certs/ (входит в архив /etc/datahub/) |
| Секреты Сервера DataHUB (pepper, JWT, service token) | критичный | /etc/datahub/backend/certs/ (входит в архив /etc/datahub/) |
| Сообщения в очередях RabbitMQ | НЕ бэкапим | эфемерные, гарантии — через повторную обработку |
Логи (/etc/datahub/nginx/log/, docker logs) |
опционально | ротация средствами logrotate и Docker |
База PostgreSQL — самый критичный артефакт: в ней хранится конфигурация обмена, пользователи, маршруты, состояние всех клиентских систем. Потеря БД без бэкапа = переинсталляция и ручная перенастройка всей конфигурации обмена.
Секреты Сервера DataHUB (pepper.txt, private_key.pem, public_key.pem, service_token.jwt) критичны не сами по себе, а тем, что без них все ранее выпущенные пароли и токены становятся невалидными. Потеря этих файлов = переинициализация всех пользовательских паролей и пересоздание service token'а.
Рекомендуемое расписание
| Что | Частота | Срок хранения |
|---|---|---|
| Полный дамп PostgreSQL | ежедневно | 30 дней |
rabbitmqctl export_definitions |
еженедельно | 8 недель |
Архив /etc/datahub/ |
еженедельно | 12 недель |
| Дополнительный «контрольный» дамп PostgreSQL | перед каждым обновлением платформы | до следующего успешного обновления |
Точные значения настраиваются под регламент заказчика. Если есть требование к точке восстановления (RPO) меньше суток — переходить к continuous archiving PostgreSQL (pg_basebackup + WAL-archiving), это выходит за рамки штатной поставки.
Куда складывать бэкапы
Каталог хранения — на отдельной файловой системе или хотя бы на отдельном диске от /etc/datahub/. Рекомендуемая локация — /var/backups/datahub/. Структура:
/var/backups/datahub/
├── postgres/
│ ├── datahub-2026-01-15.dump
│ ├── datahub-2026-01-16.dump
│ └── ...
├── rabbitmq/
│ ├── definitions-2026-W02.json
│ └── ...
└── etc/
├── etc-datahub-2026-W02.tar.gz
└── ...
Дополнительно — копия в удалённое/географически разнесённое хранилище (S3, FTP, дублирующий сервер, лента). Бэкап, лежащий на том же сервере, что и продуктив, защищает только от ошибок оператора, но не от физической потери сервера.
PostgreSQL — резервное копирование
Один полный логический дамп:
sudo docker exec -t postgres pg_dump -U "$POSTGRES_USER" -d DataHUB -F c -f /tmp/datahub-$(date +%F).dump
Извлечение из контейнера на хост:
Удаление дампа из контейнера, чтобы не занимать data/:
Скрипт-обёртка для cron, который делает дамп и удаляет старые файлы старше 30 дней:
sudo tee /usr/local/bin/datahub-pg-backup.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR=/var/backups/datahub/postgres
DATE=$(date +%F)
DUMP=datahub-${DATE}.dump
mkdir -p "$BACKUP_DIR"
docker exec -t postgres pg_dump -U "$(grep ^POSTGRES_USER /etc/datahub/postgres/.env | cut -d= -f2)" \
-d DataHUB -F c -f "/tmp/$DUMP"
docker cp "postgres:/tmp/$DUMP" "$BACKUP_DIR/"
docker exec postgres rm "/tmp/$DUMP"
find "$BACKUP_DIR" -name 'datahub-*.dump' -mtime +30 -delete
EOF
sudo chmod +x /usr/local/bin/datahub-pg-backup.sh
Расписание в cron:
PostgreSQL — восстановление
Восстановление в существующую базу (с очисткой):
sudo docker cp /var/backups/datahub/postgres/datahub-YYYY-MM-DD.dump postgres:/tmp/restore.dump
sudo docker exec -i postgres pg_restore -U "$POSTGRES_USER" -d DataHUB --clean --if-exists /tmp/restore.dump
sudo docker exec postgres rm /tmp/restore.dump
Восстановление в чистый стенд (после переинсталляции):
- Развернуть платформу по Быстрому старту до момента запуска
flyway— БД создана, схема пуста. - НЕ запускать
flyway— схема уже зашита в дампе. - Положить дамп в контейнер и выполнить
pg_restore(см. выше). - Продолжить с шага запуска
backend.
После любого восстановления — проверить, что версия миграций в БД соответствует версии backend'а (SELECT * FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 5;).
RabbitMQ — экспорт определений
Экспорт всех exchange/queue/binding/user в JSON:
sudo docker exec rabbitmq rabbitmqctl export_definitions /var/lib/rabbitmq/definitions.json
sudo docker cp rabbitmq:/var/lib/rabbitmq/definitions.json /var/backups/datahub/rabbitmq/definitions-$(date +%G-W%V).json
sudo docker exec rabbitmq rm /var/lib/rabbitmq/definitions.json
Расписание в cron (раз в неделю):
RabbitMQ — восстановление определений
Импорт обратно (после переинсталляции, при потере mnesia):
sudo docker cp /var/backups/datahub/rabbitmq/definitions-YYYY-WNN.json rabbitmq:/var/lib/rabbitmq/definitions.json
sudo docker exec rabbitmq rabbitmqctl import_definitions /var/lib/rabbitmq/definitions.json
sudo docker exec rabbitmq rm /var/lib/rabbitmq/definitions.json
После импорта Сервер DataHUB при следующем цикле синхронизации (раз в 60 секунд) сверит топологию с конфигурацией в БД и при необходимости донастроит недостающие очереди — rabbitmqctl import нужен скорее как опорная точка, чтобы быстро восстановить пользователей и vhost.
/etc/datahub/ — архив конфигов
Архив всех конфигов, секретов и сертификатов одной командой:
Расписание в cron (раз в неделю):
0 4 * * 0 sudo tar -czf /var/backups/datahub/etc/etc-datahub-$(date +%G-W%V).tar.gz -C /etc datahub >> /var/log/datahub-backup.log 2>&1
Восстановление (на чистом сервере при переинсталляции):
После — поправить права на каталоги данных (PostgreSQL и т.п. требуют корректного владельца).
Архив /etc/datahub/ содержит секреты
Внутри — .env со всеми паролями и приватные ключи. Хранить с правами 0600, шифровать при отправке в удалённое хранилище.
Восстановление после полной потери сервера
Сценарий: физическая потеря сервера или повреждение /etc/datahub/ без возможности восстановления in-place.
- На новом сервере выполнить Быстрый старт до момента создания
/etc/datahub/, не запуская блоки. - Удалить пустой
/etc/datahub/и восстановить из архива:
- Запустить
devops-core→rabbitmq→postgres(но не flyway и не backend):
cd /etc/datahub/devops-core && sudo docker compose up -d
cd /etc/datahub/rabbitmq && sudo docker compose up -d
cd /etc/datahub/postgres && sudo docker compose up -d
- Восстановить БД из дампа в
postgres(см. выше). - Восстановить определения RabbitMQ (см. выше).
- Запустить остальные блоки в стандартном порядке (
pg-agmin→backend→frontend→nginx), пропустивflyway— схема уже в БД. - Проверить healthcheck'и, ключевые сценарии, журналы.
После успешного восстановления — обязательно сделать новый полный бэкап.
Тестирование восстановления
Бэкап, который ни разу не разворачивался, нельзя считать работоспособным. Регулярно (минимум раз в квартал) — выполнять тестовое восстановление в отдельное окружение:
- Поднять на тестовом сервере чистый стенд по Быстрому старту.
- Применить процедуру восстановления PostgreSQL и
/etc/datahub/. - Войти в личный кабинет, проверить наличие конфигурации обмена, отправить тестовое сообщение.
- Зафиксировать факт успешного восстановления в журнале администрирования.
При первом тестовом восстановлении обычно вылезают мелкие проблемы (отсутствующие переменные, забытые шаги ротации секретов) — это и есть смысл регулярного теста.
Что НЕ делать
- Не бэкапить
/etc/datahub/postgres/data/файлами на работающем postgres. Это не атомарный снапшот — данные вdata/могут оказаться в несогласованном состоянии. Только черезpg_dumpили предварительную остановку контейнера. - Не делать
docker commitконтейнеров. Это не бэкап — это снапшот файловой системы контейнера, который смешивает образ и данные. Используйте штатные инструменты резервного копирования. - Не хранить единственную копию бэкапа на той же машине, что и продуктив. Минимум — копия на отдельной файловой системе, оптимально — географически разнесённое хранилище.
- Не пропускать тестовое восстановление. Бэкап без проверенного восстановления — лотерея.
Что дальше
- Обновление платформы — где бэкап обязателен перед каждым обновлением.
- PostgreSQL — детали работы с дампами и форматами.
- RabbitMQ — детали экспорта определений.
- Production настройка — общий чек-лист готовности.