From 1fdcc04af67bf78f17923fccf390ff787f52ad67 Mon Sep 17 00:00:00 2001 From: viktot14-ai Date: Fri, 25 Sep 2026 10:08:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D0=B8=20B23-=D0=B1=D1=8D?= =?UTF-8?q?=D0=BA=D0=B0=D0=BF:=20SETUP=5FGUIDE=20=C2=A715=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20backup/restore,=20?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=B1=D0=BB=D1=8F=20pg=5Fwrapper=20PG18,=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D0=B9=20=D0=B2=D0=BD=D0=B5=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0,=20=D1=87=D0=B5=D0=BA-=D0=BB=D0=B8?= =?UTF-8?q?=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SETUP_GUIDE.md | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) 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) ---