diff --git a/SETUP_GUIDE.md b/SETUP_GUIDE.md index f03e96d..ab89c38 100644 --- a/SETUP_GUIDE.md +++ b/SETUP_GUIDE.md @@ -336,12 +336,21 @@ docker exec vector-postgres pg_dump -U postgres -d vector_mchs \ # 03:10 — ретенция журналов (удаление audit_events/auth_events старше audit_retention_days) 10 3 * * * docker exec vector-backend python -m backend.purge_logs >> /var/log/vector-purge.log 2>&1 # 03:00 — прикладной дамп (planet_osm_* исключены; OSM восстанавливается b16-import.sh) -0 3 * * * docker exec vector-postgres pg_dump -U postgres -d vector_mchs --exclude-table="planet_osm_*" -F c -f /tmp/vector_app_$(date +\%F).dump && docker cp vector-postgres:/tmp/vector_app_$(date +\%F).dump /root/backups/ && find /root/backups -name vector_app_*.dump -mtime +14 -delete >> /var/log/vector-backup.log 2>&1 +0 3 * * * /root/vector/scripts/backup-app.sh >> /var/log/vector-backup.log 2>&1 ``` +`backup-app.sh` (в репо, `scripts/`) делает: дамп прикладных таблиц → выгрузка в +`/root/backups/` → архив `.env` + `docker-compose.yml` (chmod 600) → проверка +оглавления через pg_restore → чистка старше 14 дней. + Проверка разового прогона: `docker exec vector-backend python -m backend.purge_logs` → `purge: {'audit_events': N, 'auth_events': N}` (0 — норма). +**Грабля pg_wrapper PG18** (реальный прогон на CT108, postgres:16): `pg_dump`/`pg_restore` +без пути — это клиент PG18. `pg_dump 18` создаёт архив версии 1.16, который `pg_restore 16` +не читает (`unsupported version`), и пишет `SET transaction_timeout`, отсутствующий в +PG16-сервере. Оба скрипта используют только `/usr/lib/postgresql/16/bin/pg_*`. + **Docker volume — не backup.** Если сервер умер вместе с диском, volume умер вместе с ним. Что подлежит резервному копированию: ```text @@ -350,9 +359,28 @@ docker exec vector-postgres pg_dump -U postgres -d vector_mchs \ + конфигурация compose ``` +`backup-app.sh` покрывает БД и конфигурацию. **Копии должны уходить с сервера** — +иначе гибель LXC/диска убивает и бэкапы. Варианты (по возрастанию надёжности): + +1. rsync на второй Proxmox-узел по SSH (минимум для пилота): + `rsync -az -e ssh /root/backups/ <второй-узел>:/root/backups/vector/` — добавить в backup-app.sh +2. Syncthing/NAS (в инфраструктуре Виктора NAS уже есть) +3. Для боевого контура МЧС — сетевой шарой организации + **Backup ≠ восстановление.** Копия проверяется периодическим restore на отдельном стенде: файл читается → БД восстанавливается → backend подключается → расчёт выполняется. Непроверенный restore — это не стратегия, а файл с именем «backup». +### Восстановление + +```bash +/root/vector/scripts/restore-app.sh /root/backups/vector_app_<дата>.dump +``` + +Скрипт: `--clean --if-exists` (пересоздание объектов из дампа) + TOC без +EXTENSION postgis (иначе дропает postgis и падает на зависимостях planet_osm_*). +OSM-таблицы не трогает (их в дампе нет). Проверено на CT108: restore → counts +(cases/users/audit/password_history) совпали → login ok → analyze 200. + ### RPO и RTO | Величина | Вопрос | Рекомендация для пилота | @@ -508,8 +536,10 @@ docker exec vector-postgres psql -U postgres -d vector_mchs -c \ ### Backup -- [ ] cron прикладного дампа настроен, копии вне сервера -- [ ] restore проверен на стенде +- [ ] cron прикладного дампа настроен (`backup-app.sh`, 03:00), копии вне сервера +- [ ] первый дамп лежит в `/root/backups/` и проверен `pg_restore --list` +- [ ] restore проверен на стенде (`restore-app.sh`), counts совпали +- [ ] копии выгружаются вне сервера (rsync на второй узел / NAS) — см. §15 - [ ] RPO/RTO осознаны и приняты (§15) ---