Аудитория: суперадминистратор, инженер эксплуатации. Закрывает вопрос: «как восстановить данные после потери диска/порчи — с учётом того, что ПДн-связки лежат в ОТДЕЛЬНОМ инстансе Сейфа (F4-db)?». Связано: 08 — Эксплуатация и бэкап, 19-backup-restore (портал).
После выноса Сейфа (F4-db) контур держит две раздельные БД:
| Инстанс | Том | Что внутри | Бэкап-скрипт |
|---|---|---|---|
| db (портал) | pgdata | реестр ПО, лицензии, контракты, факты, аудит ФЗ-152 — обезличенные `user_id` | deploy/backup.sh |
| vaultdb (Сейф) | vaultdata | связка user_id ↔ ФИО/табельный, журнал раскрытий — ПДн | deploy/backup-vault.sh |
Бэкапы Сейфа хранятся отдельно от портальных (не в одном каталоге/хранилище) — иначе ПДн вернутся в один контур и расширят область аттестации (D15). Восстанавливать тоже раздельно.
Связка между ними — детерминированный хеш user_id = HMAC(ANON_SALT, …). Поэтому критично: восстанавливать обе БД на снимках одного периода и с той же `ANON_SALT`, что была на момент снятия. Иначе раскрытие в Сейфе и факты в портале не сойдутся.
0. Свежий бэкап текущего состояния, если БД ещё доступны (даже повреждённые) — на всякий случай.
1. Остановить контур:
cd /opt/licenziar
docker compose -f docker-compose.lic.yml --env-file .env.lic down # тома НЕ трогаем пока2. Восстановить ПОРТАЛ (db):
docker volume rm licenziar_pgdata 2>/dev/null || true # только при полном восстановлении
docker compose -f docker-compose.lic.yml --env-file .env.lic up -d db
until docker compose -f docker-compose.lic.yml --env-file .env.lic exec -T db pg_isready -U postgres -d licenziar; do sleep 1; done
gunzip -c backups/licenziar-<ts>.sql.gz \
| docker compose -f docker-compose.lic.yml --env-file .env.lic exec -T db psql -U postgres -d licenziar -v ON_ERROR_STOP=13. Восстановить СЕЙФ (vaultdb) — из ОТДЕЛЬНОГО бэкапа того же периода:
docker volume rm licenziar_vaultdata 2>/dev/null || true
docker compose -f docker-compose.lic.yml --env-file .env.lic up -d vaultdb
until docker compose -f docker-compose.lic.yml --env-file .env.lic exec -T vaultdb pg_isready -U postgres -d vaultdb; do sleep 1; done
gunzip -c backups-vault/vault-<ts>.sql.gz \
| docker compose -f docker-compose.lic.yml --env-file .env.lic exec -T vaultdb psql -U postgres -d vaultdb -v ON_ERROR_STOP=14. Поднять остальное. dbinit/vault-init на непустых БД выйдут (already_seeded/аналог) и данные из дампов не тронут:
docker compose -f docker-compose.lic.yml --env-file .env.lic up -d5. Убедиться, что `ANON_SALT` в `.env` — та же, что на момент бэкапа (дампы хранят уже обезличенные user_id; менять соль при восстановлении НЕЛЬЗЯ — см. 23).
GET /api/health→{"status":"ok","db":"ok"}.GET /api/<tenant>/dashboard-kpi→ ненулевые агрегаты.- Вход оператора (
it_admin@<tenant>) проходит. - Связка цела: DPO-раскрытие в Сейфе по
user_idиз портала возвращает ФИО (значит db и
vaultdb — согласованного периода и соли).
- Нет «осиротевших» фактов: каждый
activity_facts.user_idимеет пару вmasked_users.
- Несогласованные снимки. Портал и Сейф из разных периодов → раскрытие 404 / рассинхрон.
Снимайте бэкапы обеих БД близко по времени (в идеале — одним cron-окном).
- `ANON_SALT` менять при восстановлении нельзя. Это не восстановление, а ротация (отдельная
процедура 23).
- Бэкапы не смешивать. Дампы Сейфа (ПДн) — отдельное хранилище внутри контролируемого контура.
- Том vs дамп. Быстрый откат — снимок тома; перенос между версиями Postgres — логический дамп.
Связанные: 08 — Эксплуатация и бэкап · 26 — Миграции и обновление · 17 — Топология Сейфа · 23 — Ротация соли.