Commit Graph

100 Commits

Author SHA1 Message Date
2911f2b3e5 feat(deploy): pilonuxt 961a838 — content-api fixed, full re-smoke; 1 bug left (/products 404)
pilonuxt пофиксил content-api (@snollajs/data 0.9.1 + tedious traceInclude),
тег 961a838. Stack 16 перекатан. Полный re-smoke (весь меню 21 стр + viewModel
по каждому + Playwright браузер + скрин): viewModel 200 везде, страницы 200 с
реальным контентом, картинки 200 webp, консоль 0 ошибок, верстка целая.
Остался реальный баг: пункт меню «Продукция» → /products → 404. + форма не
тестилась (живой email). Cutover отложен до закрытия /products + формы.
.gitignore: smoke-артефакты (скрин, .playwright-mcp).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:59:56 +03:00
637942e914 fix(deploy): retract false-green — pilonuxt content-api 500 on all CMS pages
vitya поймал /snolla/pages/viewModel?path=/services -> 500. Перепроверил:
content-api лежит полностью (viewModel 500 на всех путях). Root:
sequelize['snolla'] undefined в content-api → @snollajs/data не
инициализирован (задвоённый stateful-инстанс в Nitro-бандле, класс как
дубль Vue). Каталог работает (app-путь), CMS-страницы нет. Задача обратно
🔵 blocked, cutover отменён. Inbox pilonuxt с диагнозом отправлен.
Урок зафиксирован: smoke = все страницы меню + data-эндпоинты, не 2 роута.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:05:52 +03:00
1725425972 feat(deploy): pilonuxt re-smoke GREEN on pilonuxt.vds.kzntsv.site (tag 3622662)
pilonuxt пофиксил дубль Vue в prod-бандле (resolutions @vue/*), тег 3622662
(36ec970 битый). Stack 16 перекатан. Smoke: / 200 SSR, /catalog 200 с
товарами из CMS, картинки imgproxy 200 webp + статика 200, внешний доступ
200 cert valid. Остаток: contacts-form email (живой, держу) + cutover
www.pilorama98.ru (решение vitya).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:59:57 +03:00
5fd1a1d68b meta(tasks): deploy-pilonuxt-vds — stack 16 up, infra green, blocked on app SSR 500
pilonuxt:36ec970 развёрнут Portainer stack 16 на pilonuxt.vds.kzntsv.site.
Инфра зелёная (cert/traefik/egress mssql+smtp/SSR-hairpin). App отдаёт 500
`Cannot read properties of null (reading 'ce')` на всех роутах вкл. server
/api/snolla → баг в data-слое snolla, не деплой. Inbox pilonuxt отправлен.
Blocked на app-фиксе. Стек оставлен поднятым для быстрой итерации тега.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:19:59 +03:00
38e84ce20b feat(deploy): add pilonuxt VDS Portainer stack compose; block on pilonuxt Dockerfile fix
pilonuxt deploy на vds-kzntsv за Traefik. Compose готов (proxy net,
websecure, certresolver letsEncrypt, Host pilonuxt.vds.kzntsv.site, :3000,
GTM погашен на smoke-поддомене). Домен согласован с vitya: temp-поддомен
для smoke, cutover www.pilorama98.ru — отдельным шагом.

Сборка диагностирована, образ НЕ собран — Dockerfile pilonuxt падает в
чистом контейнере (локально замаскировано глоб. yarnrc + сетью):
  1. .yarnrc.yml без npmAlwaysAuth:true → YN0041 anonymous (whoami=vitya).
  2. Dockerfile не копирует scripts/+src/generated до yarn install →
     postinstall Cannot find module scripts/ensure-schema.mjs (YN0009).
По решению vitya сборка отдана pilonuxt (их репо/фикс), за admin — Portainer.
Inbox victor/pilonuxt отправлен с разбором. Задача 🔵 blocked до образа.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:01:48 +03:00
2ba7b6df5c meta(tasks): create [deploy-pilonuxt-vds] in OpeItcLoc03/admin 2026-06-14 18:45:23 +00:00
82d724f108 feat(assets): migrate snolla assets originals Local-disk → S3
assets storage class = Local (RUVDS IIS App_Data\assets), never in S3 →
snolla imgproxy source s3://assets/<ownerId>/<storageFilename> = 404.
Created MinIO bucket `assets` (books-vds), rclone'd whole tree from RUVDS
verbatim: 4750 obj / 215.5 MiB, 145 owner folders. Verify count+size ==
source. Smoke: brevno.jpg → 200 image/webp; validly-signed missing obj →
404. snolla code unchanged (path A). Scope widened past pilorama98 (closes
404 class for all tenants; owner→site map non-obvious). snolla-side stub
content-api/routes/assets.js still pending (flagged in inbox).

Closes [migrate-assets-originals-to-s3].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 23:16:10 +03:00
8dc856b92d meta(tasks): create [migrate-assets-originals-to-s3] in OpeItcLoc03/admin 2026-06-13 19:31:08 +00:00
f04426617c feat(galleries): migrate pilorama98 gallery originals Local-disk → S3
snolla galleries 404 (imgproxy "Source unreachable"): legacy storageClient
"galleries" = MoreThenCms Local storage class (App_Data\galleries\<siteId>),
never in S3 — products were migrated, galleries weren't. Path A (user pick):
new bucket `galleries`, 301 pilorama98 originals (77 MiB) rclone'd from RUVDS
IIS → s3://galleries/37e6…/<guid>.jpg verbatim. snolla code unchanged
(storageClient=bucket is the working convention). imgproxy smoke from
books-vds: real obj 200 image/webp, fake guid 404. Other sites unmigrated
(scope). Inbox sent to victor/snolla.

- close [migrate-gallery-originals-to-s3] (scope pilorama98)
- NEW .wiki concept galleries-storage-class-local-not-s3
- fix stale minio-imgproxy-on-vds (pipeline on books-vds since 2026-06-08)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 14:50:16 +03:00
4c640dec65 meta(tasks): create [migrate-gallery-originals-to-s3] in OpeItcLoc03/admin 2026-06-12 11:09:50 +00:00
e001b8e331 feat(books-backup): bookva-es snapshot via Portainer path.repo
bookva-es (отдельный ES 7.10, Portainer stack 37) не снапшотился — path.repo
не сконфигурирован. Пересоздан через Portainer API (PUT /api/stacks/37) с
path.repo=/snapshots + bind /usr/docker/bookva-es/snapshots (uid 1000:0);
внешний том bookva-es-data сохранён (epz/products целы). Repo kreknin
зарегистрирован.

Добавлен Step 2b (bookva-es snapshot + prune) в run.sh.

Gotcha пойман на проверке приёмника ДО коммита: оба ES-каталога называются
`snapshots` → как отдельные rsync-источники сливаются в один dest/snapshots/
и портят оба репо (видно по двойному index-N). Fix: источник bookva-es =
родительский /usr/docker/bookva-es (basename bookva-es → dest/bookva-es/snapshots/).

Verified green: BOOKS-VDS backup OK 10m28s, на kreknin раздельно
snapshots/ (slovo, index-41, 795M) + bookva-es/snapshots/ (index-4, 801M),
по одному index-N в каждом → оба независимо рестораблельны.

Закрывает .tasks/bookva-es-snapshot-repo.md (🟢). bookva tenant полностью
покрыт (db/mongo/minio/es).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:56:19 +03:00
aeb82a6a70 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>
2026-06-12 11:01:05 +03:00
b332af66e4 fix(vds-backup): MSSQL backup INIT->FORMAT + estate backup audit
VDS daily backup пал с 12.06 (line 108, exit 1): mssql-блок (added 11.06,
commit f8ca0794) использовал `WITH ... INIT`, упирался в компрессованный
media-header майских .bak (созданы WITH COMPRESSION на Developer-источнике).
Express не пишет в compression-форматированный media set -> Msg 1844, молчаливый
провал первым же cron-запуском. 5 боевых CMS-баз 3 недели без offsite-копии.

Fix: INIT -> FORMAT (всегда новый media set, иммунно к остаткам). Прогон
verified зелёным: VDS backup OK 95m41s, все 5 .bak на kreknin
(MoreThenCms 910M, StayerCalculator 528M, StayerPrice 39M, TireService 4.5M,
stostayer 990M), speedup 22.62 (--link-dest хардлинкует).

- scripts/vds-backup-rsync-kreknin/run.sh: синхронизирован с задеплоенным
  (mssql-блока в репо не было); FORMAT
- .wiki/concepts/mssql-on-vds.md: gotcha #2 (INIT vs FORMAT) + backup-gap
- .wiki/concepts/backup-inventory-2026-06.md: новая — карта estate × что реально
  бэкапится (с доказательством); триаж дыр
- openwrt UCI backup настроен (cron 03:30 -> kreknin, restricted forced-command
  key) — документация в entity + inventory
- .tasks/kreknin-self-backup.md: backlog #1 SPOF (приёмник сам не бэкапится)
- STATUS.md: incident + audit summary

Урок: бэкап-шаг не готов, пока не предъявлен лог одного реального успеха;
прод-крон не должен быть первым тестом бэкап-пути.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 10:21:44 +03:00
f6ab02f85c meta(tasks): update [agents-task-runner-vds-deploy] in OpeItcLoc03/admin 2026-06-09 17:33:57 +00:00
054fceeae8 task(agents-task-runner-vds-deploy): guard verified; always-on HALTED pending grant
- .admin claim-guard pushed + verified: claim-gate run over real .admin board
  skips all 4 claimable .admin tasks with reason=needs-human (zero slip-through).
- Always-on bring-up started (docker mongo+reconciler) then torn down per user
  "don't start pollers without permission". Host task-runner never started — no
  claim/spawn occurred. .env/secrets.env/guard left in place, ready.
- Worker config decided: this workstation; AGENT_RUNTIME=claude-opus;
  AGENT_CAPABILITIES=needs-internet; headless claude login suffices.
- Caught a stale-claimable task (MoreThenCms cms-maljarka-https-mode-bug-fix was
   ready though the bug was fixed today) — closed it. Lesson recorded: sweep
  boards for stale-claimable before enabling always-on.
- GATE: starting pollers awaits explicit user grant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:47:05 +03:00
949724729d task(agents-task-runner-vds-deploy): take + DRY_RUN validated + .admin claim-guard
- Take task to 🔴, create per-task file (was on board w/o file).
- DRY_RUN smoke passed end-to-end on this workstation (host task-runner :3000,
  one tick via POST/GET). Real shared-board read; preview candidate
  OpeItcLoc03/MoreThenCms/cms-maljarka-https-mode-bug-fix; no claim/spawn.
- Finding: .admin had NO policy.toml; claim gate ignores consult_policy, so the
  HARD ".admin excluded from autonomous claim" guard was UNENFORCED. Add
  .tasks/policy.toml default_weight="needs-human" → every .admin task fails the
  L3 needs-human claim gate. Gates autonomous poller only; INERT until pushed
  (claim reads policy.toml via Gitea backend, not local disk).
- Build-prereq in task Next-action was a phantom: runner is plain JS (no tsc);
  only projects-meta-mcp needs build and its dist/ already exists.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:32:35 +03:00
2811b5a180 fix(iis-migration): maljarka.tandemmebel.ru 502-on-HTTPS resolved
Root cause (NOT a migration defect): MoreThenCms tenant `maljarka`
had `dbo.Sites.SettingsData = NULL` (no `httpSecure` block) -> on a
real HTTPS request SnollaMiddleware throws KeyNotFoundException ->
502. HTTP served 200 fine. DNS/TLS/IIS binding all correct.

Fix applied to shared MSSQL (mssql.kzntsv.site): UPDATE Sites set
SettingsData with httpSecure{enableHttps:true,...} + recycle snolla
pool. Verified 443->200 server-local and external via 80.64.31.36;
kupimknigi untouched. Audit: maljarka was the only NULL-settings
site with a :443 binding (of 25); rimiz degraded for another reason.

- new concept: morethencms-null-settingsdata-https-502
- entities/ruvds-iis-host: maljarka moved from Degraded -> fixed
- index.md + log.md + STATUS.md + NEXT_SESSION.md updated

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:15:12 +03:00
67fb97fbba meta(tasks): update [agents-task-runner-vds-deploy] in OpeItcLoc03/admin 2026-06-08 12:06:21 +00:00
99dba5138f meta(tasks): update [agents-task-runner-vds-deploy] in OpeItcLoc03/admin 2026-06-08 10:25:19 +00:00
a704f9d313 meta(tasks): create [agents-task-runner-vds-deploy] in OpeItcLoc03/admin 2026-06-08 10:10:17 +00:00
fc245c23c7 fix(nl-vds-3xui): apply Reality dest fix + rotate creds (server-side done)
Per user "и то и другое":
- Reality 443 dest www.intel.com -> www.microsoft.com (x-ui.db + restart),
  verified end-to-end tunnel through real :443 (SNI microsoft) -> HTTP 204.
  ML-DSA-65 kept. Plain VLESS 32030 unaffected (xray restarted, listening).
- Rotated leaked creds: root SSH password, panel username+password (bcrypt),
  panel JWT secret (kills install API token + sessions). New creds in
  pass nl-vds-3xui/full-env; old SSH pass now rejected; db backed up on server.
- Remaining client-side: user sets v2rayN profile pqmkayaxo2 SNI -> microsoft.

Task fix-nl-vds-reality-pq-dest -> 🟡 (awaiting client-side + confirm).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 11:45:44 +03:00
5116abae07 tasks(fix-nl-vds-reality-pq-dest): open — Reality 443 PQ×dest diagnosed, fix awaits user
Read-only diagnosis complete, server untouched. Root cause: ML-DSA-65 (PQ)
incompatible with dest www.intel.com (Akamai). Fix (intel->microsoft) staged
on board, not applied. Plain VLESS 32030 works.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 11:27:10 +03:00
c588326c28 tasks(vehicles-loader-progress-deploy): close 🟢 — verify ok + email-recipient fix
Live-verify прогона Sun 31.05 06:21→07:53 MSK прошёл: progress-logging
показал движение по всем фазам, НЕ тишина. exit 0, importRun id=4 ok.

Попутно найден+починен email-баг: STOSTAYER_MAIL_TO=site@stostayer.ru
(отчёт слался сам себе) → vitya.kuznetsov@gmail.com в host env
(бэкап .bak.20260531). Доставка на gmail подтверждена тест-письмом.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 09:31:17 +03:00
b8a07fee85 tasks(vehicles-loader-progress-deploy): 0.4.0 deployed, verify pending 06:21
Build здесь → push docker.stostayer.ru/vehicles-loader:0.4.0 → на хосте
клиента pull + re-tag :latest=0.4.0 (0.3.0 retained для rollback).
Acceptance #1 закрыт. Verify journalctl ждёт natural-прогона
Sun 2026-05-31 06:21 MSK (user выбрал natural-окно, без baseline-reset).
Open Q #1 снят: a74ef73 уже в origin/master.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 09:03:13 +03:00
7ec6200901 tasks(vehicles-loader-progress-deploy): new task — deploy 0.4.0 + live-verify journalctl
Handoff from stostayer.new (code task vehicles-loader-progress-logging closed
by-inspection, commit a74ef73). Ops follow-up: rebuild image 0.4.0 on the same
channel (build here -> push docker.stostayer.ru -> host pull + re-tag) and
capture journalctl from a live run to verify phase/batch/delete-sweep progress.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 08:51:41 +03:00
129b75a018 @
tasks(vehicles-loader-image-distribution): first prod run + email/DNS fix

First scheduled run (2026-05-30 06:20) synced OK (importRun id=3) but failed on
the email step: container DNS cannot resolve mail.stostayer.ru (rewritten
resolv.conf + firewalled :53; --add-host ignored under --network host). Data
landed fine. Fixed by mounting a custom /etc/hosts; verified via
nodemailer.verify() = SMTP_VERIFY_OK. stostayer.new 8e5997c. Logging task filed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
2026-05-30 07:54:21 +03:00
76c261cc4f @
tasks(vehicles-loader-image-distribution): prod deploy done + MariaDB IPv6 gotcha

vehicles-loader deployed live on new.stostayer.ru: image 0.3.0 in client
registry, env-file placed, systemd timer enabled (next 06:20 MSK). Records the
MariaDB-IPv4 / host-net /etc/hosts ::1 gotcha hit during the dry-run (fixed via
STOSTAYER_DB_HOST=127.0.0.1 + --network host), now in stostayer.new wiki.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
2026-05-29 23:36:30 +03:00
2cf0b536de @
tasks(vehicles-loader-image-distribution): closed — client-registry + build-here + no-Portainer

Decision channel resolved: maintainers build locally, push to the client's
own registry docker.stostayer.ru, host pulls + re-tags :latest. No Portainer
for the oneshot run. Deploy docs finalized in stostayer.new e55cfba.
Actual prod deploy on new.stostayer.ru:20435 is a follow-up pending grant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
2026-05-29 22:42:38 +03:00
91fac7014a docs(tasks): vehicles-loader-image-distribution — B requires verdaccio access; A build-proven; CMD finalized
Из stostayer.new session 29.05: lite core зашипан, Dockerfile CMD финализирован
(блокер сузился до канала поставки + README distribution-секции). Дописано:
B (build-from-git) требует verdaccio-доступ у клиента (.yarn/cache не коммитится),
что усиливает рекомендацию A. A технически подтверждён (docker build + run --help ок).
2026-05-29 20:43:30 +03:00
2a153d573c meta(tasks): create [vehicles-loader-image-distribution] in OpeItcLoc03/admin 2026-05-29 10:17:30 +00:00
063910e265 incident(books-vds-es): true RCA — ransom-бот через открытый :9200, не оператор
Рецидив вчерашнего ES-инцидента вскрыл истинную причину. Вчерашняя
гипотеза «оператор в cutover попал на canonical» опровергнута.

Root cause: ES (stack 33) публиковал 0.0.0.0:9200 мимо traefik. Free-ES
7.10 без auth → порт открыт всему интернету. Ransom-бот сносил индексы
by-name (мимо Control #1 destructive_requires_name), оставлял read_me с
BTC-выкупом. accessLog (Control #2) пуст — бот шёл прямо в порт, не через
traefik. firewalld бесполезен (docker-publish обходит INPUT-зоны).

Fix (Control #3): убрана публикация host-порта из stack 33 (Portainer
PUT), дыра закрыта; re-restore epz/products/artmone из daily-2026-05-25.

Отдельный баг: epz-поиск падал у ОБОИХ тенантов — getTenantIdSeller(
config.get("tenant")) через node-config, а tenant не задан ни в
default.json, ни в env-маппинге (TENANT env = мёртвый груз). Добавлен
tenant в overlay default.json (slovo/bookva). products работал —
отдельный код-путь.

accessLog откатан (сторожил не ту дверь).

- wiki concept: correction-блок + секция «Рецидив 2026-05-29» + exposure-audit
- tasks: restore-es reopened+reclosed; new  harden-books-vds-exposed-ports
- NEXT_SESSION handoff

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 09:31:25 +03:00
48a5cf397e tasks(restore-es-indices-books-vds): closed — snapshot restore + 2 preventive controls
snapshot restore из kreknin:daily-2026-05-25 за 46 сек (epz=820604,
products=105922, artmone=2621, counts == source).

RCA: 5 индексов (включая system .tasks) удалены через ES API DELETE _all
за 1 сек на 2026-05-26 10:21 UTC — 1ч 11мин после создания bookva-es в
cutover-prep. Каноничный endpoint elasticsearch.kzntsv.site попал под
команду которая предназначалась bookva-es:9200 (internal-only, без
traefik route). Caller identity unrecoverable: ES audit = X-Pack платный,
traefik accessLog был выключен, Portainer CE без audit.

Preventive controls applied + verified:
1. ES env action.destructive_requires_name=true (stack 33) — DELETE _all
   и wildcard теперь 400 BadRequest; by-name DELETE работает (нужно для
   reindex). Pattern удаления что случился физически невозможен.
2. Traefik JSON accessLog в /letsencrypt/access.log — будущие DELETE
   оставят forensic след с IP/user/method/path.

Wiki concept: .wiki/concepts/es-destructive-delete-incident-2026-05-26.md
с recovery runbook + preventive controls + cross-refs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:11:07 +03:00
e9b0a9edbc docs(tasks): restore-elasticsearch-indices-books-vds — books VDS ES stack 33 пуст
Prod incident в репо books: slovo поиск товаров+EPZ лежит. `elasticsearch.kzntsv.site`
отвечает 200 на _cluster/health (green, 0 active shards, 0 docs); source
`elasticold.kzntsv.site` (Windows rollback) — полный набор: epz 820604 /
products 105922 / artmone 2621. Окно поломки 27.05 10:24 → 28.05 13:59, в нём
шла bookva-tenant-cutover-prep (bookva-es stack 37 создавался) — возможный
конфликт.

Playbook в task-файле: forensics (Portainer stack 33 audit + docker volume
inspect) → snapshot restore из kreknin repo если post-25.05 snapshot с
непустыми индексами → иначе reindex повторно по migrate-elasticsearch-to-books-vds
procedure (730MB ~5-10 мин). После — restart 4 consumer'ов.

NEXT_SESSION.md перезаписан, restore поставлен как приоритет 1, carried
items (registry GC, netplan artifacts, board-viewer-build) сохранены.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:50:13 +03:00
11554d45ac wiki(ingest): vds-kzntsv network-stack mismatch RCA + ifupdown anti-pattern
Incident 2026-05-28 ~05:45–13:52 MSK на vds-kzntsv. ~2.5ч активного outage
+ ~5.5ч на эфемерной статике до окончательного fix хостером.

Revised RCA: наш netplan+systemd-networkd конфликтовал с provider's expected
ifupdown stack. Их start/ipadd procedure ожидает чистый ifupdown и не может
auto-recover когда networkd «держит» eth0. 8 дней работало потому что
networkd сам тянул DHCP. Когда что-то на стороне Rusonyx разорвало
DHCP-binding — auto-recovery не сработала.

Fix: systemctl mask netplan + systemd-networkd* (на running system без stop —
IP и SSH сохранились), Rusonyx ребутнул VM и положил чистый
/etc/network/interfaces.d/ifcfg-eth0 через свой start/ipadd. Netmask /18,
gw 89.253.192.1, чистый ifupdown.

Wiki:
- NEW concepts/vds-kzntsv-dhcp-outage-2026-05-28 — full RCA + recovery
  runbook (эфемерная статика + permanent-fix via ifupdown) + diagnostic
  dot-graph + revised lessons-learned + anti-pattern
- NEW sources/vds-kzntsv-incident-2026-05-28 — timeline 05:25 backup OK →
  08:43 statics → 13:52 final reset; provider's ifcfg-eth0 content; ticket
  text reference
- UPDATE entities/vds-kzntsv — mask /18, ifupdown stack, kernel cmdline
  net.ifnames=0 объясняет eth0 naming, hypervisor hw80, pass-store путь,
  Known issues §
- UPDATE concepts/rusonyx-vps-onboarding-quirks — quirk #9 переписан про
  /18 layout + canonical ifcfg, quirk #10 NEW про ifupdown vs netplan
  stack choice + bootstrap mask commands
- UPDATE index.md + log.md

Tasks:
- STATUS header: incident RESOLVED summary
- NEXT_SESSION: следующая сессия — cleanup netplan-artifacts (optional),
  registry GC (~20G pending), board-viewer-build unhealthy разбор

Memory (out-of-repo): vds-kzntsv-rusonyx-network-recovery переписан с
revised RCA — canonical bootstrap step «mask netplan/networkd» для всех
Rusonyx Ubuntu VDS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:12:14 +03:00
c895cf52e6 tasks(modulair-rag-vds-redeploy): 🟢 closed — 4-container stack live on VDS
Deployed modulair-rag (Portainer stack 15) on VDS 89.253.255.94, acceptance 6/6.
Pre-flight verify found the task was filed on stale premises; corrected in-flight:
- registry images absent (registry reinstalled 2026-05-20) → rebuilt all 3 ON the
  VDS (3.36GB tier1 layer 499'd pushing through traefik from home; local push works)
- MINIO_ENDPOINT=minio.vds.kzntsv.site (minio.kzntsv.site is books VDS)
- traefik entrypoint https→websecure (NAS-era label) fixed in live stack
- created DB modulair_rag, minio bucket + scoped svcacct, ROUTERAI key to pass
- DNS modulair-mcp.kzntsv.site→VDS (user)

Follow-ups (consumer repo modulair-rag): compose.yml entrypoint commit,
portainer-stack.md rewrite, lightrag embedding binding=ollama/model=None check.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 09:28:48 +03:00
8238ef46a8 tasks: ops-mcp-multi-tenant activated same session
Stack 26 (books-ops-mcp) PUT с pullImage:true + добавлен BOOKVA_MARIADB_PASSWORD
env (= MARIADB_PASSWORD, bookva-db ops_ro password identical после cp-a).
Container books-ops-mcp@master-f5f295b running.

Smoke:
- ops.mariadb.query tenant=slovo → АФО2/Главная26/НК11 (slovo warehouses)
- ops.mariadb.query tenant=bookva → Главная26/Ира/НК11 (bookva warehouses)
  (Ира появилась в bookva post-cutover, нет в slovo — данные genuinely разные)
- ops.mongo.count tenant=bookva collection=agendaJobs → 2818

Один host-level ops-mcp видит обе tenant DBs через per-tenant pool maps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 18:40:33 +03:00
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
10e80dc036 tasks(books-ops-mcp-host-promote): 🟢 closed + host-stacks compose canonical
Stack 26 (books-ops-mcp) in-place PUT в host-level compose без container churn.
Stack 43 (bookva-ops-mcp) deleted. 2 Gitea secrets revoked.

New canonical: `host-stacks/books-vds/ops-mcp.compose.yml` (management-plane,
manual Portainer updates как traefik/portainer).

Design locks: location=.admin/host-stacks, deploy=manual Portainer,
MariaDB scope=slovo's only (Option A), config path unchanged.

Companion commits: `victor/books ae3ab14`, `victor/bookva-overlay 50f5bbb`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 14:04:15 +03:00
e82b9a905f tasks(books-ops-mcp-host-promote): завести ready + handoff refresh
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) <noreply@anthropic.com>
2026-05-26 13:55:05 +03:00
744c384bec tasks(bookva-tenant-cutover-prep): post-closure — bookva-minio + external
Extension в той же сессии после 6/7 closure:
- bookva-minio container (stack 49) — отдельный MinIO instance вместо
  bucket-split в shared. minio:RELEASE.2020-07-13 (parity books-minio),
  bookva-minio-data (1.2G cp -a books bucket), endpoint http://bookva-minio:9000
  для internal apps, port-bind 9001 для external.
- bookva-db PUT — добавлен port 33306:3306 для external MySQL access.
- bookva-overlay templates: s3.endpoint → http://bookva-minio:9000,
  bucket=books (no override).
- Step 6 descoped — PWA redirect modal для одного user.id=1 = overhead
  vs manual heads-up учредителю.

External access verified:
- mysql -h 89.253.255.133 -P 33306 -uroot -p... (MariaDB 10.6.26 handshake)
- http://89.253.255.133:9001 (S3 API, 403 anon = service alive)

Traefik HTTPS labels для bookva-minio.kzntsv.site добавлены (activate когда
DNS A-record → 89.253.255.133 в reg.ru).

7/7 done (Step 6 descoped) + bookva-minio extension. Cutover task будет
re-start 6 stopped stacks + Mongo agenda cleanup + ES snapshot/restore +
books-api shutdown.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 11:57:42 +03:00
f91e51d937 tasks(bookva-tenant-cutover-prep): 🟢 closed 6/7 (Step 6 delayed by design)
Все ops-шаги VDS-side выполнены в одну сессию:
- 7 Gitea secrets (incl. BOOKVA_OVERLAY_TOKEN scope=read:repository)
- 9/10 Portainer stacks (ozon-mcp deferred — image отсутствует в registry)
- 6 volumes created, 4 populated; bookva-db-data (4.7G) + bookva-mongo-data
  (517M) через cp -a (downtimes 59s + 5s)
- bookva-db login-gate (3 users scrambled), books-db verified untouched
- DNS уже резолвилось (closed by inspection)
- books-web embed-api live (Portainer stack 24 + books deploy/web.compose.yml)

User-facing bookva stacks stopped post-create (Status=2) —
bookseller.kzntsv.site = 000 pre-cutover state. db/mongo/es оставлены
running (internal, useful для testing).

Cross-repo: bookva-overlay 6 commits (templates aligned, mariadb:10.6,
mongo:4.2, api internal-only, depends_on removed, .env.example v3
hostnames). books 2 commits (secret rename + web.compose embed-api refs).

Handoff to `bookva-tenant-cutover` micro-task when user скажет «поднимаем
Bookva»: re-start 6 stopped stacks + MinIO mc cp + ES snapshot/restore +
books-api stop после 24-48ч soak.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 10:58:29 +03:00
ce8bf8a646 tasks(bookva-tenant-cutover-prep): 🟡 progress 4/7 — Steps 1+3-partial+5+7
Session 2026-05-26 закрыто: Steps 1+5+7 done, Step 3 partial (6 volumes
+ 4 populated из corrected templates).

Cross-repo work этой сессии:
- victor/books `2f7b539` — deploy.yml secret rename (`GITEA_TOKEN` → `BOOKVA_OVERLAY_TOKEN`,
  т.к. Gitea резервирует `GITEA_*` prefix для repo secrets).
- victor/books `75ea320` — deploy/web.compose.yml embed-api refs
  (NUXT_AUTH_TOKEN + NUXT_JWT_SECRET_KEY вместо NUXT_PUBLIC_BOOKS_API_KEY).
  Portainer stack 24 уже PUT'нут (env+compose atomic), container recreated,
  smoke green.
- victor/bookva-overlay `5b173de` — config-templates aligned to prod shape
  (jobs[], jobs-new[], docker, mailSettings, ntfy) + design v3 hostname
  (bookseller.kzntsv.site). task-runner template added (был missing).

Pass entry added: `gitea/victor-books-ci-bookva-overlay` (PAT scope=read:repository,
для BOOKVA_OVERLAY_TOKEN secret в victor/books).

Maintenance-window items deferred: Step 2 stacks, Step 3 stateful
(Mongo/MariaDB/MinIO), Step 4 login-gate. Step 6 delayed по spec (1-2 нед).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 10:08:00 +03:00
4f1a4cf436 tasks(bookva-tenant-cutover-prep): create — 7-step VDS prep после tenant-split dev-side closed
Gitea secrets для PORTAINER_STACK_ID_BOOKVA_* + GITEA_TOKEN, создание
Portainer stacks для bookva-{api,web,scheduler,task-runner,ozon-mcp,
ops-mcp,db,mongo,es,ntfy}, volume create+copy (Mongo/ES/MinIO/configs),
bookva-db login-gate password-replace, DNS bookseller.kzntsv.site,
PWA redirect env в books-web, books-web embedded-api env (pending
step из embed-api handoff).

Dev-side done в victor/books master:
- 5e28fd1 embed-api + zod^4 (root cause: zod 3.x в web shadowed
  root zod 4.x, @nuxt/ui v4.5 silent broke without zod 4 API)
- 4a9cafc ES endpoint per-tenant via custom-environment-variables.json
- c1e58cf PWA redirect banner (user.id=1 modal)
- 88df172 deploy.yml per-tenant (tenant input + per-tenant stack IDs)

Overlay-repos обновлены: bookva-overlay 58d4295 (+ ES env + ntfy
full config), slovo-overlay bca6bbc (+ ES env + ntfy full config).
2026-05-26 08:36:08 +03:00
2eba1c5c01 tasks(iis-migration-to-ruvds): 🟢 closed Phase 1 per user decision
9/24 hostnames live на RUVDS 80.64.31.36 (kupimknigi.spb.ru, emspb±www,
pilorama98±www, labtools.pro±www, rimiz±www). 25 HTTPS SNI bindings ready
(LE R13 expire 2026-07-22). Source IIS:8089 + traefik routes оставлены —
rollback path для 9 + serving path для 16 ещё-не-swapped.

Не закрыто, descoped в Closure note (не tracker tasks): 14 plan-to-migrate +
2 tandemmebel scope-exception DNS swaps; source IIS decommission post-soak;
LE renewal pipeline (~57d до cert expiry); temp SSH key / FW rule cleanup;
2 wiki concept updates. Resolution = user pace.
2026-05-25 12:54:02 +03:00
3246dabbb5 tasks(migrate-elasticsearch-to-books-vds): 🟢 closed — 3 indices Windows→books VDS
928616 docs (artmone 2621 / epz 820604 / products 105922) migrated via
reindex-from-remote. Pre-migration snapshot к kreknin repo, target stack 33
получил `reindex.remote.whitelist=elasticold.kzntsv.site:443` через Portainer
API. Consumer configs (books-api + books-task-runner + books-job-scheduler)
sed'd elasticold→elasticsearch.kzntsv.site, 3 containers restarted.
Per-doc byte-match verified, internal smoke от books-api → новый ES 200 OK.
Source ES оставлен running per user (rollback ready).
2026-05-25 11:33:17 +03:00
86c44c3db9 tasks(books-vds-stacks-to-portainer): close 🟢 — 6 stacks migrated SSH-compose → Portainer
Phase 2 ladder executed 2026-05-25 (~10min end-to-end, lowest → highest blast radius):
  proxy-chain (id 28) → imgproxy (29) → minio (30) → mongo (31) → books-db (32) → elasticsearch (33)

All 6 smoked green. books-api + books-task-runner reconnected transparently through
mongo + books-db recreate windows. ES snapshot repo `kreknin` preserved through bind.

Phase 3:
- created .wiki/concepts/portainer-stack-management-books-vds.md (pattern application + diffs from vds-kzntsv)
- entity books-vds.md: 6 stacks flipped SSH-managed → Portainer-managed
- index.md: new concept entry

Pre-flight quirks documented (CentOS 7 yum dead, no jq, no docker login).

Acceptance: 4/5 verified, backup pipeline (#5) verified by inspection (bind paths
preserved) — full pipeline run pending next 06:00 MSK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 10:27:23 +03:00
bfb942cd1d tasks(books-vds-stacks-to-portainer): Phase 0 probe complete, +imgproxy scope
Phase 0 findings:
- 6 target stacks (5 original + imgproxy discovered on /usr/docker/imgproxy/)
- All bind-only, no env_file, no surprise named volumes
- Portainer PAT works via X-API-Key; endpoint 1 = books VDS, endpoint 6 = stostayer (not ours, user-confirmed)
- mongo container lost image tag (digest only) — fresh mongo:4.2 pull at recreate acceptable
- Q1 (endpoint 6) + Q2 (volume preservation) closed

Updated entity books-vds: imgproxy added to SSH-managed inventory (was missing).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 10:12:55 +03:00
439da3cef6 tasks: add books-vds-stacks-to-portainer
Follow-up after books-vds-backup-daily-kreknin 🟢. User-requested:
migrate SSH-compose стеки (ES/mongo/minio/books-db/proxy-chain) под
Portainer-managed. Pattern reuse VDS-infra retro-migration script
(.wiki/concepts/portainer-stack-management-vds.md). Skip traefik + portainer
(management plane).

Also: STATUS.md note phone-side ntfy + email verified ✓ by user 2026-05-25.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:48:26 +03:00
fe41ee4422 backup(books-vds): daily 06:00 MSK pipeline to kreknin live 🟢
- scripts/books-vds-backup-daily-kreknin/ — run.sh + .env.example + README
- ES path.repo bootstrap (one-time stack edit, snapshot repo 'kreknin' registered)
- curl smtps://yandex:465 email (CRLF + Date headers, no msmtp dep on CentOS 7)
- StrictHostKeyChecking=yes + pre-populated known_hosts (CentOS 7 no accept-new)
- cron /etc/cron.d/books-vds-backup live, initial sync 4.87 GB in 13m28s, ntfy push sent
- wiki: entities/books-vds.md + sources/books-vds-backup-daily-kreknin-2026-05-25.md created
- wiki: concepts/books-ssh-access → vds-kzntsv-ssh-access (was lying about books on vds-kzntsv)
- .tasks/books-vds-backup-daily-kreknin.md closed 🟢 pending phone-side verify

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:37:16 +03:00
1eefb4d45a tasks: add stateful-split-volume-copy (moved from victor/books)
Ops-таска Фазы 1 tenant-split дизайна. Scope сужен на input юзера
«просто поднимем 2 БД»: только MariaDB volume copy + up 2 containers
через Portainer. Mongo/MinIO/DELETE/app-стеки — отдельными ops-тасками потом.

Design canon — victor/books .wiki/concepts/tenant-split.md (не дублируем здесь).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:53:27 +03:00