From e82b9a905fb4b6958955f4acd3455dd590b4effd Mon Sep 17 00:00:00 2001 From: vitya Date: Tue, 26 May 2026 13:55:05 +0300 Subject: [PATCH] =?UTF-8?q?tasks(books-ops-mcp-host-promote):=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D1=81=D1=82=D0=B8=20=E2=9A=AA=20ready=20+=20?= =?UTF-8?q?handoff=20refresh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Trigger: deploy run#437/439 валился на bookva-ops-mcp restart-loop. Hot-fix `bookva-overlay 437d024` (idle-stub command) выкачен как interim — deploy run#440 зелёный. User ideology clarification: books VDS = наш host, slovo/bookva = клиентские стэки, ops-mcp host-level (один экземпляр на VDS, не per-tenant). Tracker capture'ит 10-step playbook + 5 design Qs (где жить host compose, deploy mechanism, MARIADB_PASSWORD scope, config volume path, audit прочих host-level кандидатов). hot-fix temporary до promote. Co-Authored-By: Claude Opus 4.7 (1M context) --- .tasks/NEXT_SESSION.md | 8 +++- .tasks/STATUS.md | 19 ++++++++ .tasks/books-ops-mcp-host-promote.md | 70 ++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 .tasks/books-ops-mcp-host-promote.md diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 83c57a8..79be211 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,12 +1,14 @@ --- -_last_updated_: 2026-05-26T23:30:00+03:00 -session_id: 2026-05-26-bookva-tenant-cutover-prep-LIVE +_last_updated_: 2026-05-26T23:55:00+03:00 +session_id: 2026-05-26-ops-mcp-host-promote-track --- # Next session handoff ## Recent commits +- `victor/bookva-overlay 437d024` — fix(deploy): bookva-ops-mcp idle-stub command (tail -f /dev/null) — hot-fix deploy run#437/439 restart-loop fail; interim до host-promote +- `.admin × 1` — tasks: завести `books-ops-mcp-host-promote` ⚪ + refresh handoff - `.wiki b2528fb` — wiki(concepts): ingest 3 generic ops-gotchas from bookva tenant-split (manual write, MCP commitFile bug) - `victor/books c434230` — deploy.yml: auto-deploy default tenant=slovo → all (symmetric rollout active) - `victor/bookva-overlay 2862279` — traefik labels: entrypoints=https + certresolver=letsEncrypt (books-VDS instance naming) @@ -37,6 +39,7 @@ session_id: 2026-05-26-bookva-tenant-cutover-prep-LIVE | Трек | Готовность | Entry-point | |---|---|---| +| `books-ops-mcp-host-promote` ⚪ (NEW) | promote ops-mcp+docker-proxy в host-level stack, drop bookva-ops-mcp idle-stub. Ideology: books VDS = host, slovo/bookva = tenant-стэки. 10-step playbook + 5 design Qs. | `.tasks/books-ops-mcp-host-promote.md` | | `books-api-shutdown` (NEW micro-task) | 24-48h soak ends ~2026-05-27/28. `docker stop books-api` через Portainer | TBD `.tasks/books-api-shutdown.md` | | `bookva-ozon-mcp-image-build` (NEW micro-task) | image `books-ozon-mcp:master` не в registry — нужен build pipeline в victor/books | TBD `.tasks/bookva-ozon-mcp-image-build.md` | | `bookva-tenant-cutover` task **не понадобилась** — cutover de-facto произошёл в этой сессии (Step 6 descoped по решению user'а) | n/a — manual heads-up учредителю Bookva | @@ -50,6 +53,7 @@ session_id: 2026-05-26-bookva-tenant-cutover-prep-LIVE ## Спроси user'а +- **`books-ops-mcp-host-promote`** — приоритет («ближайшее время» сказано). Когда начинать? Сначала read books/packages/ops-mcp/server.js чтобы разрешить design Q3 (MARIADB_PASSWORD scope — один tenant DB или обе). - **Manual heads-up учредителю Bookva** (Step 6 substitute) — отправить ей сообщение «Bookva теперь на `https://bookseller.kzntsv.site`, login те же». Когда? - **`books-api-shutdown`** через 24-48ч — ad-hoc через Portainer или tracker task? - **`bookva-ozon-mcp-image-build`** — нужен build в victor/books CI? Сейчас image отсутствует, bookva-ozon-mcp stack не создан. Если service не используется — skip навсегда? diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 547494f..7e817b7 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,6 @@ # Admin Task Board +_Updated: 2026-05-26 (поздний вечер) — заведена `books-ops-mcp-host-promote` ⚪ (deploy run#437/439 валился на bookva-ops-mcp restart-loop → hot-fix `bookva-overlay 437d024` idle-stub interim → user ideology «books VDS = host, slovo/bookva = клиентские стэки» → promote `books-docker-proxy-ro`+`books-ops-mcp` в host-level stack, drop bookva-ops-mcp). Deploy run#440 зелёный._ + _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._ @@ -44,6 +46,23 @@ _Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user deci --- +## ⚪ [books-ops-mcp-host-promote] — promote `books-docker-proxy-ro` + `books-ops-mcp` в host-level stack, drop `bookva-ops-mcp` + +**Идеология (user 2026-05-26):** books VDS = наш host, slovo/bookva = клиентские стэки приложений. Ops-mcp видит host-wide docker socket → один экземпляр на VDS, не per-tenant. + +**Текущее состояние:** `books-docker-proxy-ro` + `books-ops-mcp` живут в slovo's stack как legacy (когда books-* совпадало и с host, и с единственным tenant'ом). `bookva-ops-mcp` сейчас idle-stub (`bookva-overlay 437d024`, `command: tail -f /dev/null`) — deploy зелёный, MCP non-functional, interim до promote. + +**Target:** новый host-level stack `books-ops` в Portainer на books VDS (management-plane как traefik+portainer), `bookva-ops-mcp` stack/secret/compose-файл удалены, slovo's ops-mcp.compose.yml dropped. + +**Status:** ready +**Where I stopped:** not started — hot-fix bookva idle-stub выкачен interim, design recommendations sketch'нуты +**Next action:** см. [books-ops-mcp-host-promote.md](books-ops-mcp-host-promote.md) § Next action (10 шагов: read packages/ops-mcp source → design Q1–Q5 decisions → Portainer host-stack create → bookva-ops-mcp delete → secret revoke → deploy.yml service list edit → 2 compose-files rm → smoke). +**Blocker:** — +**Branch:** master + + +--- + ## ⚪ [stateful-split-volume-copy] — поднять `bookva-db` + `slovo-db` на VDS как копии `books-db` через `cp -a` volume Ops-таска для Фазы 1 дизайна `tenant-split` из victor/books. Scope сужен 2026-05-25 (user: «просто поднимем 2 БД»): только MariaDB volume copy + up 2 контейнеров. Mongo / MinIO / DELETE / app-стеки — отдельными ops-тасками потом. diff --git a/.tasks/books-ops-mcp-host-promote.md b/.tasks/books-ops-mcp-host-promote.md new file mode 100644 index 0000000..74d2d15 --- /dev/null +++ b/.tasks/books-ops-mcp-host-promote.md @@ -0,0 +1,70 @@ +# books-ops-mcp-host-promote + +Promote `books-docker-proxy-ro` + `books-ops-mcp` из slovo's stack в host-level stack на books VDS. Дропнуть idle-stub `bookva-ops-mcp`. Идеология: **books VDS = наш host, slovo/bookva = клиентские tenant-стеки**; ops-mcp видит host-wide docker socket → один экземпляр на VDS, не per-tenant. + +## Контекст / триггер + +В сессии 2026-05-26 auto-deploy `tenant=all` упал на `bookva-ops-mcp not running (state=restarting)`. Hot-fix — добавлен `command: ["tail","-f","/dev/null"]` в `bookva-overlay/deploy/ops-mcp.compose.yml` (commit `437d024`), контейнер стал idle-stub без proxy/creds → deploy зелёный, MCP non-functional у bookva tenant'а. User отверг этот long-term shape: "books VDS — наш хост, slovo и bookva — клиентские стэки приложений". + +Current legacy layout (наследие времени когда books-* совпадало и с host, и с единственным tenant'ом): +- `books/deploy/ops-mcp.compose.yml` содержит **два** сервиса: `books-docker-proxy-ro` (host-level docker socket gateway) + `books-ops-mcp` (host-wide observability MCP). Deploy'ится через CI как часть slovo-tenant pipeline. +- `bookva-overlay/deploy/ops-mcp.compose.yml` — idle-stub без функциональности, deployed via tenant=bookva pipeline. + +## Target state + +- Новый host-level stack (имя tentative — `books-ops`) с `books-docker-proxy-ro` + `books-ops-mcp`. Naming `books-*` сохраняется потому что **books = имя хоста**, не tenant. +- Stack живёт в Portainer на books VDS как management-plane (как `traefik` + `portainer` сейчас — anti-pattern по project-discipline portainer rule, но user уже сделал исключение для management plane). +- Deploy pipeline отдельный от tenant deploy (либо `deploy-host.yml` в `victor/books`, либо manual через Portainer как traefik/portainer). +- `bookva-ops-mcp` stack удалён из Portainer + secret `PORTAINER_STACK_ID_BOOKVA_OPS_MCP` отозван из Gitea + `bookva-overlay/deploy/ops-mcp.compose.yml` удалён + `ops-mcp` убран из tenant=bookva service list в `books/.gitea/workflows/deploy.yml`. +- Slovo's `books/deploy/ops-mcp.compose.yml` либо удалён, либо превращён в pointer на host-level (slovo больше не owns эти контейнеры). + +## Open design questions + +1. **Где жить host-level compose?** + - (a) `.admin/host-stacks/books-vds/ops-mcp.compose.yml` (private ops-репо, единая точка для host-level VDS configs). + - (b) Новый `victor/books-vds-host` репо. + - (c) `victor/books/deploy/host/ops-mcp.compose.yml` (рядом, но другой sub-pipeline). + - Recommendation: **(a)** — `.admin/` уже private + ops-flavored, host configs естественно ложатся рядом с `.tasks/` и `.wiki/concepts/portainer-stack-management-vds.md`. + +2. **Как deploy'ить?** + - Через CI: новый `deploy-host.yml` workflow в `.admin/` (или в books). Trigger: workflow_dispatch + push на host-stacks/. + - Manual через Portainer UI: matches current `traefik`/`portainer` exception. User уже зафиксировал исключение из portainer-rule для management plane. + - Recommendation: **manual** — management plane уже исключение, не плодим CI poll специально для одного stack'а. + +3. **MARIADB_PASSWORD scope.** Сейчас slovo's books-ops-mcp получает `MARIADB_PASSWORD` (slovo's books-db root). Host-level ops-mcp должен видеть обе tenant DBs? + - Если yes: env превращается в `SLOVO_MARIADB_PASSWORD` + `BOOKVA_MARIADB_PASSWORD`, MCP lib/server.js должен поддержать обе connection strings (probably TENANT param per query). + - Если no (ops-mcp работает только с docker, без DB): drop `MARIADB_PASSWORD` env вообще, MCP не делает DB-queries. + - Check actual usage in `books-ops-mcp` package source — нужно прочитать `victor/books/packages/ops-mcp/` чтобы понять что server.js делает с MARIADB_PASSWORD. + +4. **Config volume.** Сейчас mount `/opt/books/books-ops-mcp/config/default.json` → MCP config. Host-level — тот же path или `/opt/books-vds-ops/config/default.json` (если хочется убрать books- prefix как tenant-namespace)? + +5. **Какие ещё host-level контейнеры спрятаны в slovo stack?** Полезно одним проходом аудит сделать. Текущие host-level (по моему знанию): `traefik`, `portainer`. Возможные кандидаты на промоушн: `ntfy` (push.kzntsv.site — single endpoint per VDS), backup-cron'ы. См. [infra-inventory.md](infra-inventory.md) — частично пересекается. + +## Acceptance + +- Новый stack (`books-ops` или similar) running на books VDS, contains `books-docker-proxy-ro` + `books-ops-mcp`, healthy. +- `bookva-ops-mcp` stack удалён из Portainer, secret отозван, compose-файл удалён из bookva-overlay. +- `ops-mcp` service исключён из tenant=bookva pipeline в `books/.gitea/workflows/deploy.yml` (либо tenant-loop, либо service-list). +- Slovo's `books/deploy/ops-mcp.compose.yml` либо удалён, либо ясно помечен как deprecated pointer. Slovo deploy pipeline больше не trying to deploy ops-mcp. +- `ssh + docker exec -i books-ops-mcp node lib/server.js` продолжает работать (slovo's caller path не сломан, имя контейнера `books-ops-mcp` сохранено). +- Smoke: MCP tool calls (например `mcp__books-ops__ops_docker_ps`) видят все tenant containers (`books-db`, `bookva-db`, `slovo-db` etc). + +## Status + +**Status:** ready +**Where I stopped:** not started — hot-fix `bookva-overlay 437d024` (idle-stub bookva-ops-mcp) выкачен как interim, user явно подтвердил это temporary +**Next action:** +1. Прочитать `victor/books/packages/ops-mcp/` источник — понять что MCP реально делает с `MARIADB_PASSWORD` (resolves design Q3). +2. Принять design decisions Q1–Q5 (recommendation drafts выше). +3. Создать host-level compose в выбранном месте. +4. В Portainer: создать новый stack `books-ops` (manual upload compose) → start → verify `docker exec books-ops-mcp` works. +5. В Portainer: stop + delete `bookva-ops-mcp` stack. +6. В Gitea secrets: отозвать `PORTAINER_STACK_ID_BOOKVA_OPS_MCP`. +7. В `victor/books/.gitea/workflows/deploy.yml`: убрать `ops-mcp` из tenant=bookva service list (или из `services="api web job-scheduler ops-mcp"` глобально + добавить host-level deploy в отдельный workflow). +8. В `victor/bookva-overlay`: `rm deploy/ops-mcp.compose.yml`. +9. В `victor/books`: `rm deploy/ops-mcp.compose.yml` (или превратить в README pointer). +10. Manual smoke: `mcp__books-ops__ops_docker_ps` видит bookva-* containers. + +**Blocker:** — +**Branch:** master +