feat(books-backup): cover bookva-* tenant (db/mongo/minio)
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) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
# Admin Task Board
|
# 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-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-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._
|
_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._
|
||||||
|
|||||||
24
.tasks/bookva-es-snapshot-repo.md
Normal file
24
.tasks/bookva-es-snapshot-repo.md
Normal file
@@ -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.
|
||||||
@@ -34,7 +34,7 @@ CMS-баз на [[../entities/vds-kzntsv]] **3 недели не имели offs
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 1 | **kreknin сам не бэкапится** — SPOF всей estate (1 том 7 ТБ, RAID не подтверждён; смерть `/volume1` = одновременная потеря offsite-копий ВСЕХ машин) | «задача, но на потом» | ⚪ заведена `[[../../.tasks/kreknin-self-backup]]` (#1 по риску) |
|
| 1 | **kreknin сам не бэкапится** — SPOF всей estate (1 том 7 ТБ, RAID не подтверждён; смерть `/volume1` = одновременная потеря offsite-копий ВСЕХ машин) | «задача, но на потом» | ⚪ заведена `[[../../.tasks/kreknin-self-backup]]` (#1 по риску) |
|
||||||
| 2 | **openwrt UCI** — единственный публичный ingress всех CMS, без копии | «можешь сделать» | ✅ **СДЕЛАНО** — см. ниже |
|
| 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) |
|
| 4 | **nl-vds-3xui `x-ui.db`** — профили + Reality-ключи только на хосте | «не нужен» | ⏸ accepted (won't-do) |
|
||||||
| 5 | **windows-host stale script** — таргетит удалённые 08.06 ресурсы | «забыть, не актуально» | ⏸ accepted (ignore) |
|
| 5 | **windows-host stale script** — таргетит удалённые 08.06 ресурсы | «забыть, не актуально» | ⏸ accepted (ignore) |
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ Single root partition, нет отдельной `/data`. Docker hub data под
|
|||||||
|
|
||||||
Follow-ups:
|
Follow-ups:
|
||||||
1. **Каноничный фикс — в репо books**: legacy seller-перебирающие джобы стоит либо мигрировать в `tasks.json` со скоупом, либо вывести из эксплуатации (их функции, возможно, уже покрыты reconciler-gen). Риск mongo-only правки: если будущий релиз даст legacy-джобе реальный `schedule` в `tasks.json` без скоупа — reconciler пере-сеет её (data без idSeller) → доступ к Bookva вернётся.
|
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)
|
## Стек (2026-05-25 inventory)
|
||||||
|
|
||||||
@@ -106,13 +106,16 @@ Recreate ломает access всему остальному (traefik) или с
|
|||||||
## Backup
|
## Backup
|
||||||
|
|
||||||
Daily 06:00 MSK → kreknin. См. [[../sources/books-vds-backup-daily-kreknin-2026-05-25]]. Pipeline:
|
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
|
- DB dumps (slovo): books-db (mariadb), mongo (shared), books-job-scheduler-mongo
|
||||||
- ES snapshot via REST API (file repo `kreknin`)
|
- DB dumps (bookva, added 2026-06-12): bookva-db (mariadb, тот же root pw что books-db), bookva-mongo (no-auth)
|
||||||
- rsync bind paths + dumps + `/opt/books/` + `/etc/{ssh,hosts,cron.d}` + `/root/.ssh` → `vitya@kreknin:/volume1/NetBackup/books-vds/<date>/`
|
- 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/<date>/`
|
||||||
- ntfy `BOOKS-VDS backup OK <date>` + email
|
- ntfy `BOOKS-VDS backup OK <date>` + email
|
||||||
- Retention 7 daily snapshots
|
- 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
|
## DNS
|
||||||
|
|
||||||
|
|||||||
@@ -119,6 +119,17 @@ docker exec books-job-scheduler-mongo mongodump --archive --quiet 2>/dev/null \
|
|||||||
| gzip > "$DUMP_DIR/job-scheduler-mongo.archive.gz"
|
| gzip > "$DUMP_DIR/job-scheduler-mongo.archive.gz"
|
||||||
echo "job-scheduler-mongo: $(stat -c %s "$DUMP_DIR/job-scheduler-mongo.archive.gz") bytes"
|
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 ===
|
# === Step 2: ES snapshot via REST ===
|
||||||
echo "--- ES snapshot daily-$TODAY in repo $ES_SNAPSHOT_REPO ---"
|
echo "--- ES snapshot daily-$TODAY in repo $ES_SNAPSHOT_REPO ---"
|
||||||
ES_SNAP="daily-$TODAY"
|
ES_SNAP="daily-$TODAY"
|
||||||
@@ -163,6 +174,7 @@ rsync -aHh --info=stats2 --delete $LINK_DEST_ARG \
|
|||||||
/opt/books \
|
/opt/books \
|
||||||
/usr/docker/elasticsearch/snapshots \
|
/usr/docker/elasticsearch/snapshots \
|
||||||
/usr/docker/minio/data \
|
/usr/docker/minio/data \
|
||||||
|
/var/lib/docker/volumes/bookva-minio-data \
|
||||||
/usr/docker/traefik/letsencrypt \
|
/usr/docker/traefik/letsencrypt \
|
||||||
/usr/docker/traefik/data \
|
/usr/docker/traefik/data \
|
||||||
/etc/ssh \
|
/etc/ssh \
|
||||||
@@ -206,8 +218,9 @@ Components:
|
|||||||
- /usr/docker/{minio/data, elasticsearch/snapshots, traefik/{letsencrypt,data}}
|
- /usr/docker/{minio/data, elasticsearch/snapshots, traefik/{letsencrypt,data}}
|
||||||
- /etc/{ssh,hosts,cron.d}
|
- /etc/{ssh,hosts,cron.d}
|
||||||
- /root/.ssh
|
- /root/.ssh
|
||||||
- DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo
|
- DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo, bookva-db (mariadb), bookva-mongo
|
||||||
- ES snapshot: $ES_SNAP
|
- bookva-minio: raw volume (bookva-minio-data)
|
||||||
|
- ES snapshot (slovo): $ES_SNAP [bookva-es: derivative index == slovo, snapshot pending Portainer path.repo]
|
||||||
|
|
||||||
Log: $LOG"
|
Log: $LOG"
|
||||||
email_send "[$HOST_LABEL] backup OK $TODAY" "$EMAIL_BODY"
|
email_send "[$HOST_LABEL] backup OK $TODAY" "$EMAIL_BODY"
|
||||||
|
|||||||
Reference in New Issue
Block a user