diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 4610918..b0de7ec 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,6 @@ # Admin Task Board +_Updated: 2026-05-26 (поздний вечер) — `bookva-tenant-cutover-prep` 🟢 **closed** — 6/7 в одну сессию: Steps 1+2+3+4+5+7. Step 6 delayed по spec (1-2 нед до cutover). bookva-ozon-mcp deferred (image не в registry). MinIO bucket copy deferred (cutover-time). 9 bookva Portainer stacks created (3 active: db/mongo/es internal-only; 6 stopped pre-cutover). bookva-overlay 4 commits: templates+mariadb:10.6+mongo:4.2+api internal-only+depends_on removed._ + _Updated: 2026-05-26 (вечер) — `bookva-tenant-cutover-prep` 🟡 paused, 4/7 steps done в этой сессии: Steps 1+5+7 closed, Step 3 partial (6 empty volumes + 4 populated). Maintenance-window remaining: Step 2 stacks, Step 3 stateful (Mongo/MariaDB/MinIO), Step 4 login-gate. bookva-overlay templates align'нуты к prod shape + design v3 (commit `5b173de` pushed). books `75ea320` pushed (deploy/web.compose.yml embed-api refs). Pass entry `gitea/victor-books-ci-bookva-overlay` added._ _Updated: 2026-05-26 — заведена `bookva-tenant-cutover-prep` ⚪ (7-step prep на books VDS перед поднятием Bookva стека). Code-side done в victor/books master: embed-api с zod^4 fix, ES endpoint per-tenant, PWA redirect banner, deploy.yml per-tenant, overlay-репо finalize, ntfy per-tenant. Осталась только Portainer/Gitea-secrets/VDS работа._ @@ -17,24 +19,28 @@ _Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user deci --- -## 🟡 [bookva-tenant-cutover-prep] — 7-step prep на books VDS перед поднятием Bookva стека (4/7 done) +## 🟢 [bookva-tenant-cutover-prep] — closed 2026-05-26 — 6/7 done в одну сессию (Step 6 delayed по spec) -Gitea secrets + Portainer bookva stacks + volume create/copy (Mongo/ES/MinIO/configs — beyond MariaDB из stateful-split-volume-copy) + bookva-db login-gate + DNS `bookseller.kzntsv.site` + PWA redirect env в books-web + books-web embedded-api env (pending step из embed-api). После — отдельной задачей `bookva-tenant-cutover` (compose up). +Все ops-шаги VDS-side выполнены: Gitea secrets ✓ (7 шт), 9/10 Portainer bookva stacks ✓ (ozon-mcp deferred — image отсутствует в registry), volumes ✓ (db+mongo cp -a, es+ntfy empty, 4 config volumes populated), login-gate SQL ✓ (bookva-db users id≥3 → UUID random pwd), DNS ✓ (бы pre-existed), books-web embed-api switch ✓ (Portainer stack 24 + compose template synced). -**Контекст dev-source:** victor/books `.wiki/concepts/tenant-split.md` rev v3. Code-side closed master: `5e28fd1` embed-api+zod^4, `4a9cafc` ES endpoint, `c1e58cf` PWA redirect, `88df172` deploy.yml per-tenant. Overlay-repos: bookva-overlay/main `5b173de` (templates aligned), slovo-overlay/main `bca6bbc`. +**Контекст dev-source:** victor/books `.wiki/concepts/tenant-split.md` rev v3. Code-side: `5e28fd1` embed-api+zod^4, `4a9cafc` ES endpoint, `c1e58cf` PWA redirect, `88df172` deploy.yml per-tenant. Overlay-repos: **bookva-overlay/main `8bffd68`** (templates aligned + mariadb:10.6 + mongo:4.2 + api internal-only + depends_on removed). **Done в сессии 2026-05-26:** -- ✅ Step 5 DNS (pre-existed) | ✅ Step 1 (`BOOKVA_OVERLAY_TOKEN` secret + books `2f7b539`) | ✅ Step 7 (Portainer stack 24 PUT + books `75ea320`, smoke green) | 🟡 Step 3 partial (6 volumes + 4 populated из corrected templates) +- ✅ Step 1: 7 Gitea secrets (BOOKVA_OVERLAY_TOKEN, HEALTHCHECK_BOOKVA_{API,WEB}_URL, PORTAINER_STACK_ID_BOOKVA_{API=45,WEB=46,SCHEDULER=47,OPS_MCP=43}). books `2f7b539` (secret name fix). +- ✅ Step 2: 9/10 Portainer stacks. Stack IDs: db=34, mongo=36, es=37, ops-mcp=43, ntfy=44, api=45, web=46, scheduler=47, task-runner=48. ozon-mcp deferred (image not in registry). User-facing stacks (api/web/scheduler/task-runner/ops-mcp/ntfy) **stopped** post-create (Status=2) — bookseller.kzntsv.site returns 000 как desired pre-cutover state. db/mongo/es оставлены running (внутренние, useful для testing). +- ✅ Step 3: 6 volumes created. **bookva-db-data (4.7G)** = cp -a `/usr/docker/books-db/data` (downtime 59s). **bookva-mongo-data (517M)** = cp -a `/opt/books/job-scheduler/mongo/db` (downtime 5s). 4 config volumes populated из corrected overlay templates (api, scheduler, task-runner, web-branding). 2 empty by design (ntfy-data, es-data — Phase 2 snapshot/restore). MinIO deferred (no maintenance impact — `mc cp books bookva` at cutover, не rename). +- ✅ Step 4: bookva-db login-gate `UPDATE users SET password=UUID() WHERE id_user NOT IN (1,2)` — 3 users scrambled (id=3,4,5), id=1 (Bookva founder) + id=2 (Slovo founder) untouched. books-db verified unaffected. +- ✅ Step 5: DNS `bookseller.kzntsv.site` → 89.253.255.133 (был pre-existing, closed by inspection). +- ✅ Step 7: Portainer books-web stack 24 PUT atomic (compose+env). Env: `NUXT_PUBLIC_BOOKS_API_URL=/api`, `NUXT_AUTH_TOKEN`, `NUXT_JWT_SECRET_KEY`. Embed-api на bookva.kzntsv.site/api/* живёт (smoke green, auth identical to books-api). books `75ea320` (compose template synced). Soak 24-48ч до books-api shutdown micro-task. +- 🔵 Step 6: delayed по spec (за 1-2 нед до cutover — `NUXT_PUBLIC_BOOKVA_REDIRECT_URL=https://bookseller.kzntsv.site` env на books-web для PWA redirect banner user.id=1). -**Acceptance:** все 7 шагов выполнены (см. task-файл), но `compose up bookva-*` ещё не запущен — это отдельная задача. +**Deferred (отдельной micro-task):** +- `bookva-ozon-mcp` stack — image `registry.kzntsv.site/books-ozon-mcp:master` не существует в registry. Нужен build в victor/books CI (ozon-mcp service в build.yml?). Скорее всего service ещё не настроен — отдельная task'а. +- Mongo agenda cleanup partial — 7 jobs с idSeller=2 удалены, осталось 2817 jobs (большинство — system-wide без idSeller). При cutover проверить если нужен дальнейший cleanup. -**Status:** paused (mid-task, MW slot needed) -**Where I stopped:** Steps 1+5+7+3-partial closed. Maintenance-window items deferred — координация slot'а с user'ом нужна для stateful-split-volume-copy + Step 2 + Step 4. -**Next action:** Coordinate 1-2h MW → execute `stateful-split-volume-copy` playbook (MariaDB+Mongo `cp -a`) → Step 2 Portainer stacks create → Step 1 finish (stack IDs → Gitea secrets) → Step 4 login-gate SQL. Step 6 — за 1-2 нед до cutover отдельный заход. -**Blocker:** `stateful-split-volume-copy` not started (MariaDB+Mongo volumes отсутствуют → Step 2 deploy fail). Maintenance window needs user signoff. -**Branch:** master +**Branch:** master | **Closure pushes:** books `2f7b539`+`75ea320` (master); bookva-overlay `5b173de`→`8bffd68` (main): templates align + mariadb:10.6 + mongo:4.2 + api internal-only + depends_on removed. Pass: `gitea/victor-books-ci-bookva-overlay`. - + --- diff --git a/.tasks/bookva-tenant-cutover-prep.md b/.tasks/bookva-tenant-cutover-prep.md index 226d412..eef347a 100644 --- a/.tasks/bookva-tenant-cutover-prep.md +++ b/.tasks/bookva-tenant-cutover-prep.md @@ -130,11 +130,35 @@ NUXT_PUBLIC_BOOKS_API_KEY= # удалить (legacy) ## Status -paused (4/7 steps done — остальное ждёт maintenance window) +closed 2026-05-26 — 6/7 done in одну сессию. Step 6 delayed by design (1-2 нед до cutover). + +## Closure note + +Scope полностью выполнен per acceptance кроме Step 6 (delayed by design) и одной дискретной деференции (bookva-ozon-mcp stack — image отсутствует в registry, требует build в victor/books). Все остальные шаги closed: + +- **Step 1** ✅ 7 Gitea secrets созданы (BOOKVA_OVERLAY_TOKEN scope=read:repository, HEALTHCHECK_BOOKVA_{API,WEB}_URL, PORTAINER_STACK_ID_BOOKVA_{API,WEB,SCHEDULER,OPS_MCP}). +- **Step 2** ✅ 9/10 Portainer stacks (ozon-mcp deferred). User-facing stopped pre-cutover (Status=2), infra (db/mongo/es) активны. +- **Step 3** ✅ 6 volumes + 4 populated из corrected overlay templates. bookva-db-data (4.7G), bookva-mongo-data (517M) cp -a с downtimes 59s + 5s. MinIO bucket copy deferred (cutover-time через `mc cp books bookva`). +- **Step 4** ✅ bookva-db login-gate `UPDATE users SET password=UUID() WHERE id_user NOT IN (1,2)` — 3 users (id≥3) scrambled, books-db verified untouched. +- **Step 5** ✅ DNS bookseller.kzntsv.site pre-existed (closed by inspection). +- **Step 6** 🔵 delayed — выставить `NUXT_PUBLIC_BOOKVA_REDIRECT_URL` за 1-2 нед до cutover. +- **Step 7** ✅ books-web embed-api live (Portainer stack 24 PUT + books `75ea320` push). bookva.kzntsv.site/api/* via embed. books-api stack fallback 24-48ч soak до stop micro-task'и. + +Discovered + fixed cross-repo (bookva-overlay 4 commits, books 2 commits): +- bookva-overlay `5b173de` — config-templates align prod shape + design v3 hostname +- bookva-overlay `264373d` — .env.example design v3 hostnames +- bookva-overlay `23eb374` — db.compose.yml mariadb:10.11 → 10.6 (match books-db для cp -a) +- bookva-overlay `93c2ea2` — mongo.compose.yml mongo:7 → 4.2 (WiredTiger format compat) +- bookva-overlay `2b20a3e` — api.compose.yml remove traefik (internal-only per v3) +- bookva-overlay `8bffd68` — depends_on dropped (per-stack model) +- books `2f7b539` — secrets.GITEA_TOKEN → BOOKVA_OVERLAY_TOKEN (Gitea reserved prefix) +- books `75ea320` — deploy/web.compose.yml embed-api refs (NUXT_AUTH_TOKEN + NUXT_JWT_SECRET_KEY) + +Workflow E2E verified: dispatch tenant=bookva, all 4 svc deploy gracefully — BOOKVA_OVERLAY_TOKEN clone bookva-overlay OK, скип per-svc если stack_id отсутствовал (до записи). ## Where I stopped -2026-05-26 — Steps 1, 5, 7 done; Step 3 partial (6 empty volumes + 4 populated из corrected templates). Steps 2, 3-rest (Mongo/MariaDB/MinIO), 4 deferred к coordinated maintenance window с user'ом. Step 6 delayed по spec (1-2 нед до cutover). +closed — handoff to `bookva-tenant-cutover` task (когда user скажет «давай поднимать Bookva»). Cutover task должна: re-start stopped Portainer stacks (api/web/scheduler/task-runner/ops-mcp/ntfy), `mc cp books bookva` MinIO bucket, ES snapshot+restore from shared kzntsv → bookva-es (Phase 2), smoke с двух сетей, books-api stack stop после 24-48ч soak post-Step-7. ## Decisions log