Files
admin/.tasks/NEXT_SESSION.md
vitya 12c7dc5ab9 tasks(NEXT_SESSION): session-close — bookva tenant deep-debug + 6-bug post-mortem
Multi-fix session: bookva tenant works correctly после 6 fix'ов одной природы
(incomplete cutover-prep без e2e smoke). См. NEXT_SESSION.md § "What's LIVE"
+ § "Memory updates" + shared wiki concept tenant-overlay-config-volume-mount-path-pitfall.

Changes:
- host-stacks/books-vds/ops-mcp.compose.yml: add BOOKVA_MARIADB_PASSWORD env
  declaration + multi-tenant docs note. Stack 26 ещё не пере-PUT'нут на это,
  открытая микро-таска ops-mcp-multi-tenant-stack-activate в NEXT_SESSION.
- STATUS.md: 6-bug summary в latest update line.
- NEXT_SESSION.md: full rewrite с 14 recent commits, open треками, asks к user'у,
  memory updates про agenda.db.collection / composite jobId / scheduler envs /
  bookva auth tokens.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 18:32:29 +03:00

90 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
_last_updated_: 2026-05-27T01:30:00+03:00
session_id: 2026-05-26-bookva-tenant-deep-debug
---
# Next session handoff
## Recent commits
- `victor/books 1da3093` — fix(jobs.post): bypass agenda.db.collection → MongoClient (idempotency check fix for embed-api)
- `victor/books e083b71` — fix(files): composite agenda jobId — strip :timestamp before ObjectId.isValid (display fix)
- `victor/books 60382bf` — fix(deploy): books-web-config mount (slovo embed-api Mongo endpoint was stale external)
- `victor/books fc33ea5` — fix(deploy): scheduler — job-scheduler↔scheduler naming bridge tenant-aware
- `victor/books f5f295b` — feat(ops-mcp): multi-tenant pools — MariaDB/Mongo per tenant (0.0.1 → 0.1.0)
- `victor/books ae3ab14` — feat(deploy): ops-mcp host-promote — drop tenant pipeline
- `victor/bookva-overlay 8c104f7` — fix(scheduler): add RECONCILER_ENABLED/TASK_RUNNER_URL/DOCKER_HOST envs
- `victor/bookva-overlay 60e39e5` — fix(deploy): bookva-scheduler healthcheck (mirror slovo's 58b13e0)
- `victor/bookva-overlay a9063f0` — fix(deploy): bookva mount paths /app → /usr/src/app
- `victor/bookva-overlay 4635305` — fix(deploy): bookva-api/web pass NITRO_*/NUXT_* auth env in compose
- `victor/bookva-overlay b6f9144` — fix(web): bookva-web-config volume mount — DB/Mongo/S3 leak fix
- `victor/bookva-overlay 50f5bbb` — chore(deploy): drop ops-mcp.compose.yml (host-promoted)
- `victor/bookva-overlay 437d024` — fix(deploy): bookva-ops-mcp idle-stub (obsolete после delete)
- `.admin × 2` — host-stacks/books-vds/ops-mcp.compose.yml multi-tenant env + task closure + handoff
- `~/projects/.wiki fe3ae78` — ingest concepts/tenant-overlay-config-volume-mount-path-pitfall (shared)
## What's LIVE сейчас
**Both tenants полностью изолированы (final audit pass):**
- `bookseller.kzntsv.site` → bookva-web@master-1da3093 → bookva-{db,mongo,es,minio,api,scheduler,task-runner}. Auth `2f2e96e2-25f5-4653-930d-fd307a170543`.
- `bookva.kzntsv.site` → books-web@master-1da3093 (slovo) → books-{db,job-scheduler-mongo,...}. Auth `81e123d0-8edd-...` (slovo's original, не менял).
- bookva-scheduler reconciler **registered** all handlers (`load products to warehouse` ровно processed файл 2674 в `2026-05-26 14:20:45`).
- books-web embed-api (`POST /api/jobs`) теперь без 500 — idempotency через MongoClient.
- 11 Portainer stacks LIVE на books VDS: books-{api,web,job-scheduler,task-runner,db,ntfy} (slovo) + bookva-{api,web,scheduler,task-runner,db,mongo,es,minio,ntfy} + books-ops-mcp host-level + books-docker-proxy{,-ro} + traefik/portainer/registry/mongo/minio/imgproxy и т.д.
## Open треки
| Трек | Готовность | Entry-point |
|---|---|---|
| **`ops-mcp-multi-tenant-stack-activate`** ⚪ NEW micro-task — image `books-ops-mcp:master` уже rebuilt (master-1da3093) с multi-tenant code + VDS host config `/opt/books/books-ops-mcp/config/default.json` уже на новой schema. **TODO:** PUT Portainer stack 26 с pullImage:true + добавить `BOOKVA_MARIADB_PASSWORD` env (same value as `MARIADB_PASSWORD` — bookva-db = cp -a of books-db, ops_ro password identical). Compose `.admin/host-stacks/books-vds/ops-mcp.compose.yml` уже declared в этом session'е. | TBD `.tasks/ops-mcp-multi-tenant-stack-activate.md` (или inline в session) |
| `books-api-shutdown` (ранее заведённая micro-task) | 24-48h soak with bookva LIVE — нужно проверить если still applicable (books-api всё ещё нужен для slovo на bookva.kzntsv.site fallback пути?). | TBD |
| `bookva-ozon-mcp-image-build` | image отсутствует в registry, bookva-ozon-mcp stack не создан. Если service не используется — skip навсегда. | TBD |
| `bookva-mongo-cleanup` ⚪ (user-deferred) | 2817 agendaJobs в bookva-mongo from cp-a — user сказал «8 не трогай не стирай». Когда будет готов rotate — отдельная таска. | TBD |
| `bookva-ozon-credentials-audit` ⚪ (user-deferred) | bookva ozonSeller.clientId=50542+94191 = slovo's. Финансовый риск. User сказал «сам подумаю об утечках». | TBD |
| `stateful-split-volume-copy` ⚪ | bookva-side done; slovo-side scope deferred. | `.tasks/stateful-split-volume-copy.md` |
| `infra-inventory` ⚪ | books VDS теперь 14+ stacks — момент удачный для ingest factsheet. | `.tasks/infra-inventory.md` |
| `books-bookva-user-whitelist-gathering` ⚪ | login-gate уже applied — таска только для verification списка post-cutover. | `.tasks/books-bookva-user-whitelist-gathering.md` |
| `books-vds-bookva-bootstrap` 🔵 blocked on Phase 4 (Rusonyx или другой VDS для Bookva billing) | long-term — bookva сейчас на shared books VDS. | `.tasks/books-vds-bookva-bootstrap.md` |
| `books-dns-cutover-bookva` 🔵 blocked on books-vds-bookva-bootstrap | | `.tasks/books-dns-cutover-bookva.md` |
## Спроси user'а
- **`ops-mcp-multi-tenant-stack-activate`** — finish сейчас (PUT stack 26 + add env) или взять отдельной таской?
- **Manual heads-up учредителю Bookva** — Bookva теперь на `https://bookseller.kzntsv.site`, login те же. Когда отправляешь?
- **`books-api-shutdown`** — поверка: books-api всё ещё нужен для legacy paths fallback на bookva.kzntsv.site? Если нет — shutdown candidate.
- **slovo-overlay parity audit** — slovo's compose файлы (book/deploy/) могут страдать от тех же багов что были у bookva (mount path, RECONCILER_ENABLED). Сейчас работает только потому что slovo's mount был через `/opt/...` bind (не named volume), который случайно совпал с правильным WORKDIR. Audit перед follow-up cutover?
- **bookva-minio creds rotation** — сейчас AKIA same as books-minio. Rotate в отдельную task'у когда стабилизируется?
## Не делать (preemptive guards)
- **Не trust деплой "успех" без end-to-end smoke** — этот session показал 6 багов одной природы которые passed CI но broke runtime. После любого tenant infra изменения: login + write + verify tenant DB + processing-job + UI status.
- **Не stop bookva-{db,mongo,es,minio,api,web,scheduler,task-runner,ntfy}** — LIVE на bookseller.kzntsv.site, любой stop = production outage.
- **Не editing config volumes через alpine напрямую** — source of truth = `bookva-overlay/config-templates/` (для api/scheduler/task-runner) + host-mounted (для web). Edit → commit → push → re-populate.
- **Не stop books-api** до явного soak end + user sign-off.
- **Не push без grant в next session** — auto-push grant был session-only. Этот session был grant'нут.
- **`ops_ro` password в обоих tenant'ах identical** (cp -a). Если будут rotate'ить — оба MariaDB одновременно.
- **bookva-mongo.agendaJobs 2817 docs from slovo cp-a НЕ ТРОГАТЬ** — user explicit "8 не трогай не стирай".
## Memory updates / wiki ingests
Ingested в shared wiki `~/projects/.wiki/concepts/`:
- `tenant-overlay-config-volume-mount-path-pitfall` — 6-bug post-mortem из этого session'а. Includes audit checklist + Lesson о mandatory end-to-end smoke.
Local memory updates (books-specific, не ingested):
- `agenda.db.collection` populated только после `await agenda.start()`. В web/api контейнерах start не вызывается (worker logic в scheduler) → idempotency findOne fails. Используй отдельный MongoClient.
- `composite agenda jobId` (`<bare>:<dispatch_ts>`) пишется через `job-scheduler/lib/handlers/http.js`. ObjectId.isValid возвращает false на 38-char composite — fix: split на `:` перед `.isValid`.
- bookva-scheduler нужны 3 envs для full operation: `RECONCILER_ENABLED=true`, `TASK_RUNNER_URL=http://bookva-task-runner:3000`, `DOCKER_HOST=tcp://books-docker-proxy:2375`.
- bookva auth: NITRO_AUTH_TOKEN/NUXT_AUTH_TOKEN/NITRO_JWT_SECRET_KEY/NUXT_JWT_SECRET_KEY = `2f2e96e2-25f5-4653-930d-fd307a170543` / `5e5ef0460549f36d9ab276882b490b2b77a266e41dc8a6478415869768c1ee36`. Stored in Portainer stack 45 (api) + 46 (web) Env. **Slovo's auth не трогали** (81e123d0/505172e5).
- `_loadFiles` cron в config.jobs больше **нигде не handle'ится** (deprecated после tasksConfig.json migration). File uploads requires manual trigger "Запустить обработку" UI button → POST /api/jobs.
- mongo-shell command на bookva-mongo container — image `mongo:4.2`, use `docker exec bookva-mongo mongo --quiet --eval '...'` (legacy mongo client, NOT mongosh).
- books-db root password в pass `books-vds/full-env` как `BOOKS_DB_ROOT_PASSWORD`. Same для bookva-db (cp-a).
## Pass / Reference
- pass `books-vds/full-env` — VDS root SSH key path (`~/.ssh/id_ed25519_books_ops`), Portainer URL+API key, books-db root password.
- pass `gitea/victor-books-ci-bookva-overlay` — PAT (read:repository) backup для BOOKVA_OVERLAY_TOKEN secret.
- Backups на books VDS — `/backups/books-{db,mongo}-pre-split-20260526-*.tar.gz` (auto-cleanup post 7 дней).
- Shared wiki concept ingested this session: [tenant-overlay-config-volume-mount-path-pitfall](~/projects/.wiki/concepts/tenant-overlay-config-volume-mount-path-pitfall.md).
- **Reference task:** [[books-ops-mcp-host-promote]] (closed) — все 5 design Qs locked + 10-step playbook executed.