From aeb82a6a7037b9e840b677fb13d117449f665dcf Mon Sep 17 00:00:00 2001 From: vitya Date: Fri, 12 Jun 2026 11:01:05 +0300 Subject: [PATCH] feat(books-backup): cover bookva-* tenant (db/mongo/minio) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bookva tenant (bookva-db/mongo/es/minio) поднят 26.05 при cutover-prep, а books-vds backup написан 25.05 — до bookva. Покрытие не расширили; gap висел wiki-follow-up #2 ~2.5 недели. Тот же класс, что MSSQL: новый stateful, бэкап отстал, повешен как заметка. Добавлено в scripts/books-vds-backup-daily-kreknin/run.sh (deploy == repo, бэкап .bak-pre-bookva): - bookva-db: mariadb-dump (тот же BOOKS_DB_ROOT_PASSWORD, стек клонирован) - bookva-mongo: mongodump --archive (no-auth) - bookva-minio: raw rsync named volume bookva-minio-data (immutable objects) Каждая команда протестирована изолированно ДО внесения в скрипт. Verified зелёным прогоном: BOOKS-VDS backup OK 10m42s, артефакты на kreknin (bookva-mariadb 257M, bookva-mongo 3.2M, bookva-minio 1.4G). bookva-es отложен (path.repo не сконфигурирован, нужен ES restart через Portainer) -> .tasks/bookva-es-snapshot-repo.md. Покрыт по факту: индексы epz/products идентичны slovo ES, который снапшотится. - .wiki/entities/books-vds.md: Backup-секция + follow-up #2 частично закрыт - .wiki/concepts/backup-inventory-2026-06.md: bookva row -> done - .tasks/bookva-es-snapshot-repo.md: backlog для ES-снапшота Co-Authored-By: Claude Opus 4.8 (1M context) --- .tasks/STATUS.md | 1 + .tasks/bookva-es-snapshot-repo.md | 24 +++++++++++++++++++ .wiki/concepts/backup-inventory-2026-06.md | 2 +- .wiki/entities/books-vds.md | 13 ++++++---- scripts/books-vds-backup-daily-kreknin/run.sh | 17 +++++++++++-- 5 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 .tasks/bookva-es-snapshot-repo.md diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 6476845..b70b5bc 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,5 @@ # Admin Task Board +_Updated: 2026-06-12 (2) — 🟢 **bookva-* backup gap закрыт.** bookva tenant (db/mongo/es/minio, поднят 26.05) не бэкапился — books-скрипт написан 25.05 до bookva, покрытие не расширили (висело wiki-follow-up #2). Добавлены bookva-db (тот же root pw), bookva-mongo (no-auth), bookva-minio (raw volume) в `books-vds-backup-daily-kreknin/run.sh`; деплой == репо (`.bak-pre-bookva`). Verified green: `BOOKS-VDS backup OK 10m42s`, артефакты на kreknin (bookva-mariadb 257M, bookva-mongo 3.2M, bookva-minio 1.4G). bookva-es отложен → `bookva-es-snapshot-repo` (покрыт slovo-снапшотом, индексы идентичны). Правило в память: новый stateful → бэкап в том же коммите._ _Updated: 2026-06-12 — 🔴→🟢 **MSSQL backup incident + estate backup audit.** VDS daily backup падал с 12.06 (line 108, exit 1): mssql-блок (added 11.06) использовал `WITH ... INIT` → упирался в компрессованный media-header майских `.bak` (Express не пишет COMPRESSION) → молча падал первым cron-запуском. **5 боевых CMS-баз 3 недели без offsite-копии.** Fix: `INIT`→`FORMAT`, прогон verified (MoreThenCms 910M/StayerCalculator 528M/StayerPrice 39M/TireService 4.5M/stostayer 990M на kreknin). Репо-копия `run.sh` синхронизирована (mssql-блока не было). Concept: `.wiki/concepts/mssql-on-vds.md` gotcha#2. **Estate backup-аудит** → `.wiki/concepts/backup-inventory-2026-06.md`: ✅ openwrt UCI backup настроен (cron 03:30 → kreknin, restricted forced-command key); ⚪ заведена `kreknin-self-backup` (#1 SPOF, на потом); nl-vds x-ui.db — user: не нужен; windows-host stale script — user: забыть._ _Updated: 2026-06-08 — 🟢 ad-hoc fix `maljarka.tandemmebel.ru` (iis-migration follow-up): домен переехал на RUVDS корректно (DNS/TLS/IIS ок), но отдавал 502 **только на HTTPS**. Root cause не в миграции: у тенанта maljarka `dbo.Sites.SettingsData=NULL` (нет блока `httpSecure`) → MoreThenCms `SnollaMiddleware` бросает KeyNotFound на HTTPS-ветке → 502; по HTTP 200. Fix: `UPDATE dbo.Sites SET SettingsData='{httpSecure:enableHttps=true,…}' WHERE SiteId=a2476738… AND SettingsData IS NULL` + `Restart-WebAppPool snolla`. Verified maljarka:443→200 (server-local + external по 80.64.31.36), kupimknigi не задет. Audit: maljarka — единственный NULL-сайт с :443-биндингом из 25. rimiz degraded по др. причине. Concept: `.wiki/concepts/morethencms-null-settingsdata-https-502.md`._ _Updated: 2026-06-05 (вечер) — 🟡 `fix-nl-vds-reality-pq-dest`: по команде user применён server-side fix + ротация кредов. Reality dest intel→microsoft (x-ui.db + restart), сквозной тоннель через реальный :443 = HTTP 204; 32030 жив. Креды ротированы (root SSH / panel user+pass / panel secret-JWT — светились в плейнтексте; новые в `pass nl-vds-3xui/full-env`, старые отклоняются, БД-бэкап на сервере). Остался client-side: user меняет SNI в v2rayN (`pqmkayaxo2`→microsoft) + подтверждает → close._ diff --git a/.tasks/bookva-es-snapshot-repo.md b/.tasks/bookva-es-snapshot-repo.md new file mode 100644 index 0000000..87323a3 --- /dev/null +++ b/.tasks/bookva-es-snapshot-repo.md @@ -0,0 +1,24 @@ +# bookva-es-snapshot-repo — отдельный ES-снапшот для bookva tenant + +**Status:** ⚪ backlog — заведена 2026-06-12 при добавлении bookva в backup. +**Priority:** низкий (данные покрыты по факту — см. ниже). + +## Контекст + +`bookva-es` (отдельный ES 7.10 контейнер на [[../.wiki/entities/books-vds]]) **не снапшотится**: `path.repo` не сконфигурирован → REST `_snapshot` PUT невозможен (`repos={}`). bookva-db/mongo/minio уже в daily-бэкапе с 2026-06-12, bookva-es — нет. + +**Почему не горит:** индексы bookva-es (`epz` 820604, `products` 105922) **идентичны slovo ES** (те же counts), который снапшотится daily в repo `kreknin`. То есть данные de-facto есть в бэкапе через slovo-снапшот. Плюс ES — derivative index, реконструируем reindex'ом из БД. Это покрытие-по-проксе, не source-of-truth дыра. + +## Что сделать (когда дойдут руки) + +1. Через **Portainer** (`portainer.kzntsv.site`, books-vds management plane — НЕ ssh+compose) отредактировать stack bookva-es: + - добавить bind-mount под snapshot repo (напр. `/usr/docker/bookva-es/snapshots:/snapshots`), + - добавить env `path.repo=/snapshots`, + - recreate (ES restart ~30 сек). +2. Зарегистрировать repo: `curl -X PUT localhost:9200/_snapshot/kreknin -d '{"type":"fs","settings":{"location":"/snapshots"}}'`. +3. В `/opt/stacks/backup/run.sh` (и репо-копию) добавить второй ES-snapshot блок для bookva-es + rsync `bookva-es/snapshots`. +4. Прогнать вручную, проверить green + артефакт на kreknin. + +## Decisions log + +- **2026-06-12** — заведена. bookva db/mongo/minio добавлены в backup в эту сессию; es отложен (нужен disruptive ES restart через Portainer, данные покрыты slovo-снапшотом). См. commit с bookva-backup. diff --git a/.wiki/concepts/backup-inventory-2026-06.md b/.wiki/concepts/backup-inventory-2026-06.md index c34b1eb..49179ca 100644 --- a/.wiki/concepts/backup-inventory-2026-06.md +++ b/.wiki/concepts/backup-inventory-2026-06.md @@ -34,7 +34,7 @@ CMS-баз на [[../entities/vds-kzntsv]] **3 недели не имели offs |---|---|---|---| | 1 | **kreknin сам не бэкапится** — SPOF всей estate (1 том 7 ТБ, RAID не подтверждён; смерть `/volume1` = одновременная потеря offsite-копий ВСЕХ машин) | «задача, но на потом» | ⚪ заведена `[[../../.tasks/kreknin-self-backup]]` (#1 по риску) | | 2 | **openwrt UCI** — единственный публичный ingress всех CMS, без копии | «можешь сделать» | ✅ **СДЕЛАНО** — см. ниже | -| 3 | **bookva-* на books-vds** (`bookva-db/mongo/es/minio`, 4.7 ГБ tenant-данных) не дампятся/не rsync'ятся | не обсуждалось | ⚠️ открыто (follow-up при активации bookva) | +| 3 | **bookva-* на books-vds** (`bookva-db/mongo/es/minio` tenant-данные) не дампятся/не rsync'ятся | «немедленно делать» | ✅ **СДЕЛАНО 2026-06-12** — db/mongo/minio в daily-backup (verified); bookva-es отложен (`[[../../.tasks/bookva-es-snapshot-repo]]`, покрыт slovo-снапшотом) | | 4 | **nl-vds-3xui `x-ui.db`** — профили + Reality-ключи только на хосте | «не нужен» | ⏸ accepted (won't-do) | | 5 | **windows-host stale script** — таргетит удалённые 08.06 ресурсы | «забыть, не актуально» | ⏸ accepted (ignore) | diff --git a/.wiki/entities/books-vds.md b/.wiki/entities/books-vds.md index 869c8b1..38b6e7e 100644 --- a/.wiki/entities/books-vds.md +++ b/.wiki/entities/books-vds.md @@ -55,7 +55,7 @@ Single root partition, нет отдельной `/data`. Docker hub data под Follow-ups: 1. **Каноничный фикс — в репо books**: legacy seller-перебирающие джобы стоит либо мигрировать в `tasks.json` со скоупом, либо вывести из эксплуатации (их функции, возможно, уже покрыты reconciler-gen). Риск mongo-only правки: если будущий релиз даст legacy-джобе реальный `schedule` в `tasks.json` без скоупа — reconciler пере-сеет её (data без idSeller) → доступ к Bookva вернётся. -2. wiki-drift — `bookva-*` stack (bookva-api/db/es/minio/mongo/scheduler/task-runner/web) + books-task-runner/scheduler не в stack-inventory ниже; нужен re-inventory. +2. ~~wiki-drift — `bookva-*` stack не в stack-inventory~~ **частично закрыто 2026-06-12**: bookva-db/mongo/es/minio засечены и (кроме es) добавлены в backup (см. § Backup). Полный stack-inventory bookva-* (api/web/scheduler/task-runner/ntfy) — всё ещё TODO. ## Стек (2026-05-25 inventory) @@ -106,13 +106,16 @@ Recreate ломает access всему остальному (traefik) или с ## Backup Daily 06:00 MSK → kreknin. См. [[../sources/books-vds-backup-daily-kreknin-2026-05-25]]. Pipeline: -- DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo -- ES snapshot via REST API (file repo `kreknin`) -- rsync bind paths + dumps + `/opt/books/` + `/etc/{ssh,hosts,cron.d}` + `/root/.ssh` → `vitya@kreknin:/volume1/NetBackup/books-vds//` +- DB dumps (slovo): books-db (mariadb), mongo (shared), books-job-scheduler-mongo +- DB dumps (bookva, added 2026-06-12): bookva-db (mariadb, тот же root pw что books-db), bookva-mongo (no-auth) +- ES snapshot via REST API (file repo `kreknin`) — **только slovo ES** +- rsync bind paths + dumps + `bookva-minio-data` (named volume, raw) + `/opt/books/` + `/etc/{ssh,hosts,cron.d}` + `/root/.ssh` → `vitya@kreknin:/volume1/NetBackup/books-vds//` - ntfy `BOOKS-VDS backup OK ` + email - Retention 7 daily snapshots -Live since 2026-05-25. +Live since 2026-05-25. **bookva tenant добавлен 2026-06-12** (db/mongo/minio verified на kreknin: bookva-mariadb 257M, bookva-mongo 3.2M, bookva-minio 1.4G). + +**bookva-es НЕ снапшотится** (отдельный ES-контейнер, `path.repo` не сконфигурирован → REST-snapshot невозможен без recreate). Покрыт по факту: индексы `epz`(820604)/`products`(105922) **идентичны slovo ES**, который снапшотится. Полноценный bookva-es snapshot — `.tasks/bookva-es-snapshot-repo.md` (нужен Portainer stack edit + ES restart). Deploy script: `/opt/stacks/backup/run.sh` (== repo `scripts/books-vds-backup-daily-kreknin/run.sh`). ## DNS diff --git a/scripts/books-vds-backup-daily-kreknin/run.sh b/scripts/books-vds-backup-daily-kreknin/run.sh index d894f85..1a07fa6 100644 --- a/scripts/books-vds-backup-daily-kreknin/run.sh +++ b/scripts/books-vds-backup-daily-kreknin/run.sh @@ -119,6 +119,17 @@ docker exec books-job-scheduler-mongo mongodump --archive --quiet 2>/dev/null \ | gzip > "$DUMP_DIR/job-scheduler-mongo.archive.gz" echo "job-scheduler-mongo: $(stat -c %s "$DUMP_DIR/job-scheduler-mongo.archive.gz") bytes" +# bookva tenant (separate cloned stack): bookva-db shares BOOKS_DB_ROOT_PASSWORD; +# bookva-mongo is no-auth. Containers are named volumes (not bind paths) → logical dumps. +docker exec bookva-db mariadb-dump -uroot -p"$BOOKS_DB_ROOT_PASSWORD" \ + --all-databases --single-transaction --quick 2>/dev/null \ + | gzip > "$DUMP_DIR/bookva-mariadb.sql.gz" +echo "bookva-db (mariadb): $(stat -c %s "$DUMP_DIR/bookva-mariadb.sql.gz") bytes" + +docker exec bookva-mongo mongodump --archive --quiet 2>/dev/null \ + | gzip > "$DUMP_DIR/bookva-mongo.archive.gz" +echo "bookva-mongo: $(stat -c %s "$DUMP_DIR/bookva-mongo.archive.gz") bytes" + # === Step 2: ES snapshot via REST === echo "--- ES snapshot daily-$TODAY in repo $ES_SNAPSHOT_REPO ---" ES_SNAP="daily-$TODAY" @@ -163,6 +174,7 @@ rsync -aHh --info=stats2 --delete $LINK_DEST_ARG \ /opt/books \ /usr/docker/elasticsearch/snapshots \ /usr/docker/minio/data \ + /var/lib/docker/volumes/bookva-minio-data \ /usr/docker/traefik/letsencrypt \ /usr/docker/traefik/data \ /etc/ssh \ @@ -206,8 +218,9 @@ Components: - /usr/docker/{minio/data, elasticsearch/snapshots, traefik/{letsencrypt,data}} - /etc/{ssh,hosts,cron.d} - /root/.ssh -- DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo -- ES snapshot: $ES_SNAP +- DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo, bookva-db (mariadb), bookva-mongo +- bookva-minio: raw volume (bookva-minio-data) +- ES snapshot (slovo): $ES_SNAP [bookva-es: derivative index == slovo, snapshot pending Portainer path.repo] Log: $LOG" email_send "[$HOST_LABEL] backup OK $TODAY" "$EMAIL_BODY"