Commit Graph

98 Commits

Author SHA1 Message Date
768ffe3851 chore: pilonuxt deploy — tag 6552e37 (admin-api 0.10.0 + batch-info + OpenAPI) 2026-08-07 19:48:20 +03:00
03607d0d6e meta(handoff): flat-fields wave CLOSED; session end
- 7 sites @snolla/snolla→web redeployed
- admin-api 0.4.0 (flat fields) + client 0.5.2 + schema-gen 0.2.1 published
- pilorama98 0db46e1 live: loader flat + catalog + yml/short_description
- admin-api 0.5.0 (validation) published, not deployed to pilorama98
- coordinator role active: snolla ↔ pilorama98
2026-08-07 13:03:23 +03:00
615d78932b chore: pilonuxt deploy — tag 2c069de (admin-api 0.4.0 flat fields + каталог + loader) 2026-08-07 10:51:49 +03:00
e3f2541056 chore: pilonuxt deploy — tag 782de35 (каталог: Скандинавская доска + обновлённый Половой шпунт) 2026-08-07 09:38:13 +03:00
66e1c7b718 chore: sync pilonuxt compose — add S3 endpoint/region/bucket env 2026-08-05 16:15:13 +03:00
8ebd05e4a7 chore: sync pilonuxt compose — admin-api embed env (JWT/DATABASE_URL/S3), tag 1b88cd5 2026-08-05 16:14:36 +03:00
9e2332a53c ops(labtools): bump to cad2b36 (@snolla/snolla → @snolla/web 0.43.2)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-05 15:57:18 +03:00
cd76ce8f3f feat(admin-api): деплой admin-api на vds (стек 25) — admin-api.vds.kzntsv.site
Образ registry.kzntsv.site/admin-api:ca0dfa3 (ESM-фикс). Stack 25, proxy-сеть,
env 8/8 (DATABASE_URL/JWT_SECRET/S3), mem_limit 512m, traefik + LE.
Live GREEN: /health ok, ключ pilorama98 проходит, LE-серт выдан.
Coord-таска обновлена (Number resolved, staging, deploy).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-04 18:33:52 +03:00
9fbc44c31b fix(minio-split): source-of-truth compose comments -> minio.vds.kzntsv.site (sites S3-direct читают vds minio)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-04 14:43:54 +03:00
61f6afd235 chore(labtools): compose → d263e1c (core 0.26.6 catalog linked-item provider — cylindrical hydrated)
Live smoke 2026-08-03: /products/press-forms/cylindrical 0 empty href/src, 8 cards
hydrated (round-xrf, vacuum-ir, …). Rollback = 0dc0b4e (0.43.2 v3).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-03 16:00:46 +03:00
494b101067 feat(maljarka): restore maljarka.tandemmebel.ru as 7th snolla site on VDS (stack 23)
Сайт потерян при decomm RUVDS 2026-07-21 (.NET MoreThenCms tenant, не был в v3 тираже).
Восстановлен как Node snolla-app 0.43.2 на VDS: victor/maljarka.tandemmebel.ru @7f03d67,
layout.liquid byte-identical рендеру локального .NET-admin (43730B, sha256 match),
siteId A2476738, Reversal тема из MinIO. LE issued. Live smoke GREEN.

- host-stacks/vds-kzntsv/maljarka.compose.yml (source-of-truth, stack 23)
- .wiki/concepts/maljarka-vds-deploy-runbook.md (калька on-snolla runbook)
- .tasks/STATUS.md + .wiki/index.md updated
- тираж snolla теперь 7/7: labtools(17)/emspb(18)/labtools-pro(19)/tandemmebel(20)/kupimknigi(21)/on-snolla(22)/maljarka(23)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-31 06:15:29 +03:00
69d3d0dd3f feat(tandemmebel): v3 cutover LIVE — snolla 0.42.1→0.43.2 (aws-sdk v2→v3)
6-й сайт тиража v3 (после on-snolla, kupimknigi, labtools.ru, labtools.pro, emspb).
6/6 v3 сайтов GREEN — тираж v3 ЗАВЕРШЁН.

- Bump: @snollajs/snolla 0.42.1→0.43.2 (apps/web) + resolutions verbatim labtools.ru
  (@aws-sdk/client-s3 3.1005.0 + @smithy chain 5.3.11 — optional determinism) + реген
  yarn.lock (single @smithy/signature-v4@5.3.11 deduped). Commit 9d51c09 в victor/tandemmebel.ru.
  Заодно нёс на live s3.endpoint fix f4ddce6 (→ minio.vds.kzntsv.site), был в master с 2026-07-29.
- Build на VDS: registry.kzntsv.site/tandemmebel:9d51c09, digest d14982c24dc7, 476MB (v2 583MB), EXIT=0.
- Staging :5020 parity-gate GREEN: robots md5 identical, sitemap 184=184 locs IDENTICAL,
  self-consistency 183×200 + 1×404 (/articles parity), Gotham-Pro.css 200 4436B (v3 S3-direct).
- Portainer PUT stack 20 (node in-memory, кириллица compose), env 8/8, pullImage:true, mem_limit 512m. PUT 200.
- Live smoke GREEN: / 200 45742B, /projects 200, sitemap 184, theme 200 4436B. TLS CN не тронут (LE Oct 10).
- Rollback = 8df10ee (v2, жив в registry).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 19:00:52 +03:00
fd48df6225 feat(emspb): v3 cutover LIVE — snolla 0.42.1→0.43.2 (aws-sdk v2→v3)
5-й сайт тиража v3 (5/6 GREEN). In-place bump стека 18 (DNS на VDS с
2026-07-02). Commit victor/emspb.ru 5afd8a1 (bump + resolutions + yarn.lock
реген). Build на VDS → registry.kzntsv.site/emspb:5afd8a1 digest 72bb59fc.
Staging :5082 parity-gate GREEN (29/29 routes 200, theme assets 7/7 md5
IDENTICAL — v3 S3-direct read из vds MinIO 2025). Portainer PUT stack 18
env-preserving (8/8, node in-memory put-stack), prune:false pullImage:true.
Live smoke GREEN. Rollback = 95a5c42 (v2).

- emspb.compose.yml: 95a5c42→5afd8a1
- emspb-vds-deploy-runbook: §0.43.2
- minio-split-cutover-runbook: progress-table emspb , остался tandemmebel
- NEXT_SESSION: 5/6 GREEN, остался tandemmebel (стек 20, был BLOCKED на
  sharp-staging дефекте — проверить перед бампом)

Остался 1 сайт: tandemmebel.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 17:46:19 +03:00
c3c79b996a feat(labtools.pro): v3 cutover LIVE — snolla 0.42.1→0.43.2 (aws-sdk v2→v3)
4-й сайт тиража v3 (on-snolla, kupimknigi, labtools.ru, labtools.pro — 4/6 GREEN).
Stack 19 image 0610432→a106622, env 8/8 preserved, mem_limit 512m.

Staging :5081 parity-gate GREEN: theme lato.css 200 9994B md5-identical
(v3 aws-sdk v3 S3-direct read из vds MinIO 2025), sitemap 7 детей == live,
order-parity press-forms 12 изделий, / 4-байт diff = og:url/og:image
request-host (benign). Live smoke GREEN, TLS CN=labtools.pro не тронут.
Rollback = labtools-pro:0610432 (0.42.1, жив в registry).

Compose source-of-truth + runbook v3 секция + handoff обновлены.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 17:36:36 +03:00
387560c9f8 feat(labtools): v3 cutover LIVE — snolla 0.42.1→0.43.2 (aws-sdk v2→v3)
3rd site of v3 тираж (after on-snolla + kupimknigi, 3/6 GREEN).
Bump 0dc0b4e: apps/web snolla→0.43.2 + resolutions (root). Endpoint fix
4f3314f (minio.vds.kzntsv.site) was in master but not in running v2 image
566d41c — v3 cutover also moved S3-direct read to vds minio.

Staging :5080 parity-gate GREEN (home/theme byte-identical, sitemap 38
locs == live, order-parity). Portainer PUT stack 17 env-preserving 8/8,
mem_limit 512m, prune:false pullImage:true. Live smoke GREEN, TLS untouched.
Rollback = 566d41c (v2, in registry).

Compose source-of-truth 566d41c→0dc0b4e. Runbook + handoff updated.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 17:19:26 +03:00
6f6fab1dad feat(kupimknigi): v3 cutover image bump 9608ff6→5364353 (snolla 0.43.2)
MinIO split B3-v3 cutover, stack 21. Source-of-truth compose synced with
Portainer PUT. snolla 0.42.0→0.43.2 (aws-sdk v2→v3) + @smithy resolutions.
Bundles a83e2a9 endpoint fix (minio.vds.kzntsv.site). Staging parity-gate
GREEN (byte-identical with real Host, theme asset 200 byte-identical from
vds MinIO 2025). Rollback = 9608ff6 (v2, live in registry).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 17:08:12 +03:00
f56eb2f800 feat(on-snolla): v3 cutover LIVE — snolla 0.43.2 (aws-sdk v2→v3) + runbook migration
v3 pilot on.snolla.com end-goal (user 2026-07-30): bump @snollajs/snolla
0.42.1→0.43.2 + @smithy resolutions (root package.json, on.snolla.com eb8c143).
Portainer PUT stack 22 → registry.kzntsv.site/on-snolla:eb8c143, env-preserving
8/8, mem_limit 512m. Live smoke GREEN: theme asset 200 97324 B (v3 aws-sdk v3
S3-direct read из vds MinIO 2025), sitemap+sub-sitemaps byte-identical, /c 404.
Rollback = 07db7e3 (v2, жив).

runbook migration (дисциплина): scripts/minio-split-cutover/runbook.md →
.wiki/concepts/minio-split-cutover-runbook.md (конвенция: runbook'и в .wiki/concepts/).
Creds normalized → pass show minio-vds/full-env (wiki-конвенция, не plaintext).
+ index.md, log.md, on-snolla-vds-deploy-runbook v3-секция.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 14:30:38 +03:00
443713e8b3 feat(on-snolla): MinIO split S3-direct-path cutover — stack 22 bump 473923e494db->07db7e3
Track B3 pilot (on-snolla, S3-direct reads, no imgproxy). In-place image bump
of live stack 22 by snolla-live-prod-inplace-image-bump recipe:
- build on VDS (07db7e3 = config endpoint minio.kzntsv.site -> minio.vds.kzntsv.site,
  snolla 0.42.1 v2, NO package.json bump — user decision: split without snolla version bump)
- staging :5077 from live env: robots/home/sitemap 200
- S3-direct gate: theme asset /themes/c406.../bootstrap.min.css -> 200, 97324 B == live
  (aws-sdk v2 -> vds minio 2025 — compat CONFIRMED, no @smithy pin needed, no SigV4 403)
- sitemap parity staging==live 3/3 (/, /c, /yandex); /c 404 parity
- Portainer PUT stack 22 env-preserving (8/8), prune:false pullImage:true -> 200
- live container 07db7e3 healthy, mem_limit 512m preserved
- live-smoke https://on.snolla.com: theme asset 200 97324 B, TLS cert untouched (LE YR1, Oct 18)
Rollback: PUT stack 22 back to 473923e494db (rollback tag in registry, pred endpoint
minio.kzntsv.site/books-vds, live mirror). RUVDS DECOMM 2026-07-21 — image-tag rollback only.

scripts/minio-split-cutover/runbook.md: Track B progress table (B1 mirror DONE,
B2 imgproxy DNS-flip LIVE, B3 on-snolla pilot LIVE, remaining 5 sites + Track A TODO).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-30 13:23:23 +03:00
vitya
4c4d19382b feat(on-snolla): CUTOVER DONE — on.snolla.com live on VDS (stack 22, LE cert)
DNS reg.ru on.snolla.com A -> 89.253.255.94 (operator flip, authoritative NS verified).
Traefik rule swapped staging->Host(on.snolla.com), LE cert issued (CN=on.snolla.com,
YR1, until 2026-10-18). Live-smoke GREEN, homepage byte-identical prod-HTML, sitemap
3/3 parity. RUVDS IIS untouched (rollback = revert DNS).

- compose source-of-truth updated to LIVE rule.
- runbook .wiki/concepts/on-snolla-vds-deploy-runbook.md (cutover as-built + gotchas:
  snolla robotsTxt crash on undefined app.locals.domain, no Liquid form-tag, /c dead-link
  parity, Portainer JWT re-auth before PUT).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-20 13:17:59 +03:00
vitya
9705468ef4 feat(on-snolla): Portainer stack 22 source-of-truth (staging Host, mem_limit 512m, 8 env secrets)
on.snolla.com snolla-app live behind traefik on staging Host on-snolla.vds.kzntsv.site.
Image registry.kzntsv.site/on-snolla:473923e494db (snolla 0.42.1). Pending DNS cutover
(reg.ru on.snolla.com A 80.64.31.36 -> 89.253.255.94, then PUT rule -> Host(on.snolla.com)).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-20 13:17:59 +03:00
632c843fd5 deploy(tandemmebel): 8df10ee LIVE — drop FB/Twitter/Google+ share buttons
In-place template bump на прод (stack 20): 0cd9351 → 8df10ee. fix(web) remove
FB/Twitter/Google+ share-кнопки (extremist-icon compliance РФ), keep VK+OK.
Template-only (apps/web/views/social_buttons.liquid, 1 file 12 delet), snolla pin
0.42.1 НЕ менялся.

Верификация перед сборкой поймала расхождение: tandemmebel-записка утверждала
live=ed96b18/0.42.0, фактически крутился 0cd9351/0.42.1 (in-place bump 2026-07-12).
gitea compare 0cd9351...8df10ee = total_commits:1 → фикс один коммит поверх 0.42.1
(правильная база), yarn.lock идентичен → регрессии sitemap нет.

Completeness-gate (staging :5020): sitemap NEW==PROD 184=184 identical, 0
регрессий. Live-smoke С VDS 4 share-block страницы (project-post ×2,
/furniture/bedrooms, /furniture/kitchens/classic) — vk+ok на месте, fb/tw/gp=0.
TLS-серт CN=tandemmebel.ru не дёрнут (in-place swap). Tandemmebel-сессия подтвердила.

- .tasks/STATUS.md: _Updated 2026-07-13 строка (deploy-результат + discrepancy)
- .wiki/concepts/tandemmebel-vds-deploy-runbook.md: секция In-place bump 8df10ee
  (предсборочная верификация, build→staging→gate→swap, rollback, hygiene-заметка
  про устаревшие STAGING-комменты в Portainer stack file)
- host-stacks/vds-kzntsv/tandemmebel.compose.yml: image 8df10ee + LIVE-комменты
  + история bump'ов (source-of-truth синхронен с Portainer)

Rollback: PUT стека 20 → 0cd9351 (0.42.1, {% order %} fix) / ed96b18 (0.42.0) /
b02ca18 в registry; ИЛИ revert DNS→80.64.31.36.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-13 22:50:49 +03:00
b5839bd02d feat(tandemmebel): in-place bump 0.42.0 → 0.42.1 LIVE (stack 20, order-tag fix)
Consumer bump by operator (blocker-pattern 2026-07-04 resolved without dev-source):
pin apps/web/package.json:12 + yarn install (lock 0.42.1/core 0.24.1/liquid 0.10.2/data 0.14.1)
+ commit 0cd9351 + push origin (ls-remote confirmed).

Build on VDS → registry.kzntsv.site/tandemmebel:0cd9351 (digest f29c187f).
Throwaway-staging :5020 from live env, healthy.
Completeness-gate С VDS: 184/184 parity (NEW==PROD), /articles 404 identical to
prod oracle → benign. 0.42.1 order-fix inert on blog-portfolio (no catalog).
Operator-gated PUT stack 20 (env 8/8 preserved, prune:false pullImage:true)
→ container 0cd9351+healthy ~8s. Live-smoke GREEN, TLS cert untouched.

Closes snolla 0.42.1 rollout — all 5 snolla sites now on VDS.
Rollback = tag ed96b18 (+ b02ca18) in registry.

- compose source-of-truth: tag + comment (0.42.1)
- board task: decisions log entry
- wiki: new tandemmebel-vds-deploy-runbook, bump recipe (4 sites), index, log
2026-07-12 13:26:28 +03:00
d3d0ff48ed feat(tandemmebel): cutover LIVE on VDS — last snolla site migrated
DNS reg.ru flipped, traefik Host-rule staging->prod, LE cert issued.
Live-smoke GREEN: all pages 200, sitemap 184 locs, sharp media OK.
Gotham-Pro.css latent prod bug fixed by cutover (0B->4436B).
Snolla 0.42.x tirazh now fully alive (5/5 stacks on VDS).
2026-07-12 12:48:20 +03:00
9a92ff0b87 chore(vds): mem_limit 512m всему тиражу snolla (5 стеков live + compose-копии + вики-конвенция)
Тираж snolla (labtools.ru/17, emspb/18, labtools.pro/19, tandemmebel/20,
kupimknigi/21) шёл без mem_limit → cgroup-cap = вся память хоста (12.9 GiB),
одна течь могла съесть весь бокс. Выставил 512m (baseline ~100-200M, 2.5-5x запас)
на всех 5 живых стеках через env-preserving Portainer PUT + синхронизировал
source-of-truth compose. Все healthy, limit=536870912 подтверждён, labtools.pro 200.

Конвенция «app-стек обязан нести mem_limit» закреплена в
portainer-stack-management-vds § Convention + step 6 snolla-bump-рецепта.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 14:32:55 +03:00
bcb4dc36be deploy(labtools.pro): LIVE на snolla 0.42.1 — in-place bump живого прода (стек 19)
Финал тиража 0.42.1 (3/3 live-редеплоя закрыты: labtools.ru+emspb+labtools.pro).
Оператор дал отмашку на боевой apply.

- labtools-pro:0610432 (0.28.7→0.42.1, digest 3d543fc). Acceptance С VDS на
  новом образе: 25 sitemap page-locs все 200, 0 потерь контента.
- Order-парити 3 секции MATCH (фикс liquid 0.10.2): presses=plg-20,plg-12;
  milling=milling-jars,grinding-media; press-forms=13 == прод.
- Live-smoke GREEN, TLS CN=labtools.pro не тронут. Rollback labtools-pro:7bd9fae.

Compose source-of-truth обновлён. Прог квитирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 12:04:04 +03:00
55a873731f deploy(labtools.ru+emspb): LIVE на snolla 0.42.1 — in-place bump живого прода (стеки 17/18)
Тираж 0.42.1, оператор дал отмашку на боевой apply. Оба = редеплой ЖИВОГО
прода in-place (не greenfield), acceptance на новом образе С VDS ДО swap.

- labtools.ru: labtools:566d41c (0.28.2→0.42.1). Sitemap 38 page-locs
  (0.42.1 починил дефицитный sitemap: sections 1→6, products 2→24),
  order-фикс plg-20,plg-12,plg-25,pgr-10 == прод, 0 потерь контента.
  Live-smoke GREEN, TLS не тронут. Rollback labtools:43e28ba.
- emspb.ru: emspb:95a5c42 (0.28.4→0.42.1). 29 sitemap-роутов все 200,
  0 потерь. Live-smoke GREEN. TLS SAN-серт валиден. Rollback emspb:b6e361a.

Compose source-of-truth обновлён на новые теги. Оба прога квитированы.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 11:59:08 +03:00
78f23a6561 cutover(kupimknigi): LIVE на VDS — DNS reg.ru→89.253.255.94, боевой Host в стек 21, LE-серт GREEN
Оператор флипнул DNS, подтверждён на ns1+ns2.reg.ru. Боевой Host(kupimknigi.spb.ru)
в стек 21 (staging-host убран), LE-серт CN=kupimknigi.spb.ru valid Jul5→Oct3.
Live-smoke GREEN: /→200 H1, robots/тема-css 200, callback 301. RUVDS=rollback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 10:50:35 +03:00
84f4852f7f deploy(kupimknigi): staging стек 21 (новый) → 9608ff6 (snolla 0.42.0) — smoke GREEN, паритет prod
[kupimknigi-deploy-snolla-0-42-0] 🟢 done. Собран на VDS, Portainer-стек 21 создан
(env verbatim из стека 20), контейнер healthy. Staging-smoke с VDS: / 200==prod,
H1 идентичен, тема-ассеты 200, форма+canonical паритет. Cutover=operator-gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 10:31:33 +03:00
5ef3dc1559 deploy(tandemmebel): staging стек 20 → ed96b18 (snolla 0.42.0/core 0.24.0) — DoD GREEN 172/172 + gallery 12/12
[tandemmebel-deploy-snolla-0-42-0] 🟢 done. Собран на VDS, стек 20 healthy,
acceptance#1 SSR /projects→200, acceptance#2 completeness-DoD с VDS зелёный.
Cutover остаётся DNS-gated ([tandemmebel-web-vds-deploy]) — образ к флипу=ed96b18.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 23:26:39 +03:00
ea8672f09c deploy(tandemmebel): staging стек 20 → b02ca18 (core 0.16.2) — gallery GREEN 12/12
Ребилд по коррекции workshop: образ tandemmebel:b02ca18 (core 0.16.2 SlugFeedPage-fix,
digest f8672218) собран на VDS, стек 20 передеплоен (env 8/8, healthy). DoD-чек GREEN:
gallery-грид staging==prod точно на всех 12 роутах, крошки+title наполнены (были пустые),
байты 28508≈прод 28253. Предыдущий a173401 давал пустой грид — 0.16.2 закрыл.

Флагнул сомнение перед сборкой (DB-дамп: /gallery = конвенционный саб-роут, не feed) —
рендер-чек опроверг, фикс сработал. Cutover HELD. Прогеру не пинговал (по указанию оператора).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 13:25:04 +03:00
b299c7d5da deploy(tandemmebel): staging стек 20 → a173401 (FeedPages) — роуты 404→200, но grid+крошки ПУСТЫЕ (VM-баг у прогера)
Ребилд по ops-таску workshop: образ tandemmebel:a173401 (snolla 0.35.0/core
0.16.0/data 0.13.0, digest 6962bd97) собран на VDS, стек 20 передеплоен через
Portainer API (env 8/8, healthy). FeedPages чинит роутинг gallery 404→200 (12/12).

RED на рендер-чеке: gallery-grid пустой на всех роутах (staging /galleries/*/images
= 0 vs prod 24/80/62), breadcrumb itemprop=name пустые. Корень — FeedPage-VM не
прокидывает item в шаблон. Деплой чист; фикс на прогере. Пропинговал с уликами.
Cutover HELD.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 12:58:40 +03:00
5be6662c60 deploy(tandemmebel): SHARP staging GREEN — stack 20 on image 68b93a9, cutover held on operator
Пивот tandemmebel на in-process sharp завершён (snolla 0.34.0/core 0.15.0).

- Образ registry.kzntsv.site/tandemmebel:68b93a9 (digest 12288b15) собран на VDS из sha 68b93a95.
- Стек 20 обновлён на sharp-образ (env verbatim 8/8, PullImage:false). Контейнер healthy, лог чист.
- Compose: движок 0.34.0/0.15.0, imgproxy из tandem-пути убран (sharp in-process), egress без imgproxy.

Parity-smoke GREEN: nav 8/8; sitemap staging⊇prod (prod-only=0, +12 categories benign); 2012-посты 31/31;
redirects 301/301; sharp media = slug-URL 200 webp serve-bytes, 0 /imgproxy-рефов; variant-cache пишется
(32 объекта, NoSuchBucket снят); watermark визуально ✓ featured+lightbox, gallery-small чистый.

Находка (не блокер): осиротевший imgproxy-блок в production.json пина эмпирически мёртв (0 /imgproxy-рефов) → heads-up воркшопу вычистить.

HOLD cutover — DNS gated оператором (reg.ru → 89.253.255.94).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 11:51:19 +03:00
85fa2d7ad9 deploy(tandemmebel): staging GREEN on vds-kzntsv — stack 20, image 0facb35, cutover held on operator
Финал тиража tandemmebel. Ops-часть до cutover, всё зелёное.

- Образ registry.kzntsv.site/tandemmebel:0facb35 (snolla@0.32.2/core@0.13.8,
  digest 464d2f22, watermark-override в пине) собран НА VDS (обход traefik-499).
- Стек Portainer tandemmebel Id 20 (ep1), staging-rule Host(tandemmebel.vds.kzntsv.site),
  env verbatim из labtools стека 17 (8/8). Контейнер healthy, MSSQL+S3, listening :5000.
  Source-of-truth compose: host-stacks/vds-kzntsv/tandemmebel.compose.yml.
- PURGE imgproxy-nginx кэша (books-vds стек 29) — stale-clean featured ушли,
  featured отдаёт 27820B вотермарк без cache-bust.

Staging-smoke с VDS GREEN: status-parity 10/10; sitemap staging index (184) ⊇
prod (172) prod-only=0 + 12 /projects/categories/* (benign#3); trailing 301/301;
blog-post 200 +3.5KB (benign#2 imgproxy vs /galleries/ 26/26); 2012-посты 31/31;
theme 21/22 MD5-OK. Находка (не блокер): prod Gotham-Pro.css=0B пустой,
staging=4436B корректный → cutover чинит латентный прод-баг шрифта.

HOLD cutover — DNS-флип gated оператором (reg.ru → 89.253.255.94).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 08:34:36 +03:00
7127e92a4d ops(books-vds): add tandemmebel imgproxy watermark glyph (logo.png, sha256 e995...971fc)
Durable binary channel for [imgproxy-watermark-glyph-books-vds] — base64-in-task got
corrupted in transit (field truncation looped PNG tail, dropped IEND). This is the
verified-intact 348x42 RGBA wordmark. Admin: git show this path, sha256==e995...971fc,
then set IMGPROXY_WATERMARK_DATA=base64(this file) on imgproxy stack 29.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 07:43:09 +03:00
a9f4f3a673 deploy(labtools): 43e28ba LIVE on vds-kzntsv — cutover done, labtools.ru on VDS
DNS zone is on Yandex DNS (dns1/dns2.yandex.net), not reg.ru. Flip propagated
unevenly (dns2 first, dns1 lagged); cutover gate = BOTH authoritative Yandex NS
agree apex+www -> 89.253.255.94 (monitor waited for it) so LE HTTP-01 can't hit
RUVDS via a stale auth server and burn the rate-limit.

Stack 17 traefik-rule -> Host(labtools.ru)||Host(www.labtools.ru) via Portainer
PUT (env 8/8 preserved, pullImage=false). LE cert issued (~t+20s; brief self-signed
window during issuance). Live-smoke GREEN: both hosts 200 (nav+catalog+products),
redirects parity (trailing/lowercase/.php), sitemap index host=labtools.ru (this
tenant's siteUrl is non-www), theme assets byte-identical (RUVDS 301 apex->www made
the direct md5 an artifact; -L => MD5-OK). Staging host removed (->404). External:
apex->VDS 200; www still split-brain on RUVDS cache (200, identical content, TTL 6h).
RUVDS left intact as rollback.

Task closed. Whole batch done: labtools.ru + labtools.pro LIVE on VDS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 12:42:57 +03:00
ed99f2225b deploy(labtools-pro): b LIVE on vds-kzntsv — cutover done, labtools.pro on VDS
DNS flip confirmed at authoritative ns1.reg.ru (Resolve-DnsName) + 8.8.8.8 ->
89.253.255.94 (labtools.pro/www; NOT labtools.ru). Earlier checks hit stale TTL
cache; authoritative NS was the truth.

Stack 19 traefik-rule -> Host(labtools.pro)||Host(www.labtools.pro) via Portainer
PUT (env 8/8 preserved, pullImage=false). LE cert issued instantly (ssl_verify=0).
Live-smoke GREEN: both hosts 200 (nav+catalog+products), redirects parity, sitemap
index host=www, real content (lang=en). Staging host removed (->404). External
check from RUVDS box: labtools.pro/www -> 89.253.255.94 HTTP 200 trusted cert.
RUVDS labtools.pro left intact as rollback.

Task closed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 12:07:52 +03:00
531d7f0fda deploy(labtools-pro): staging GREEN on vds-kzntsv — image 7bd9fae, stack 19, parity vs prod
Mirror of emspb deploy. Built registry.kzntsv.site/labtools-pro:7bd9fae on VDS
(guard: default.json absent), created Portainer stack labtools-pro (Id 19, env
verbatim from labtools stack 17). Container healthy, MSSQL+S3 connected.

Staging smoke vs www.labtools.pro (RUVDS) GREEN, run from VDS:
- nav + 3 catalog sections + products 200/200
- redirects (catalog#1->lshm-750, /Contacts lowercase, trailing) 301 parity
- sitemap: snolla index of 7 children, aggregate 25 URLs == prod set, host=www (R3)
- theme assets 7/7 md5-identical; Cache-Control absent (correct, CachingOptions=[])
- content pages real body, delta +155..222B (host length in canonical)

Cosmetic (not a defect, flagged to workshop): startup banner logs "labtools.ru
(snolla)" — scaffold constant; site identity is siteId 663F9410 in production.json.

Cutover (live DNS) is gated on operator. Runbook + compose committed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 11:38:56 +03:00
c3b722bb6d deploy(emspb): b6e361a LIVE on vds-kzntsv — staging GREEN + cutover done
- image registry.kzntsv.site/emspb:b6e361a (digest 8f5ba02) built on VDS from clean git-archive
- Portainer stack emspb (Id 18) traefik+LE; 8 runtime-env secrets reused verbatim from labtools stack-17
- staging smoke vs prod www.emspb.ru: 23/23 status-parity, theme CSS+image (MinIO) md5-identical, CC 86400
- cutover (operator flipped emspb.ru/www DNS -> VDS): traefik-rule Host(emspb.ru)||Host(www.emspb.ru),
  staging host emspb.vds.kzntsv.site removed post-cutover (-> 404), single LE cert,
  live smoke www.emspb.ru+emspb.ru 200 ssl_verify=0, canonical normalized, live == old-RUVDS byte-identical
- RUVDS IIS 80.64.31.36 intact = rollback path
- runbook .wiki/concepts/emspb-vds-deploy-runbook.md (mirror labtools)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 00:38:03 +03:00
a15fd65ae9 deploy(labtools): staging on vds-kzntsv GREEN — image 43e28ba, parity vs prod
- build registry.kzntsv.site/labtools:43e28ba on VDS from clean git-archive
  (no config/default.json), push from VDS (registry local)
- Portainer stack `labtools` (Id 17) on labtools.vds.kzntsv.site, container
  healthy (MSSQL mssql.kzntsv.site + MinIO minio.kzntsv.site), 8 secret-env in
  stack-env (not in image/git)
- smoke parity vs www.labtools.ru GREEN: menu pages 200/200, redirects
  (.php / trailing-slash / lowercase) 301 1:1, theme.css + /assets byte-identical
  from MinIO, Cache-Control max-age=86400
- add runbook .wiki/concepts/labtools-vds-deploy-runbook.md + stack source
  host-stacks/vds-kzntsv/labtools.compose.yml
- cutover DNS gated to operator (tomorrow 2026-07-02); RUVDS IIS 80.64.31.36
  prod untouched = rollback path

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 00:21:28 +03:00
027cc79d23 deploy(pilonuxt): GSC Product name fix LIVE on prod — c4e34d4
Rebuilt pilonuxt from monorepo master c4e34d4 (workspace Dockerfile,
sharp @img baked, live VERDACCIO_TOKEN). Canon delivery: build here
(425MB) -> docker save | ssh vds load -> push FROM vds -> Portainer
stack 16 pullImage:true (tag 6c6d52d->c4e34d4, fresh registry pull).

Acceptance MET (in-container smoke on VDS + prod smoke via curl
--resolve, bypassing LAN-DNS): 3 product pages 200, leading
<meta itemprop="name"> inside schema.org/Product = product title
(was only Brand 'Пилорама 98' before). 10 nav routes 200, no regression.
Compose SOT -> c4e34d4. Inbox victor/pilorama98.ru sent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:56:16 +03:00
vitya
45ebe629c9 deploy(pilorama): GREEN on prod — SEO live via monorepo build 6c6d52d
4th layer fixed by peer (data 0.9.0->0.9.1). Rebuilt from 6c6d52d
(workspace Dockerfile + sharp @img copy), pushed from VDS, deployed stack 16.
Container smoke all 200: product title<=60 + meta 'доставка по СПб и ЛО';
/catalog/planken 'Планкен прямой и скошенный — купить в СПб'; products 200x3;
home/shipping/blog meta ok. stderr clean. Compose -> 6c6d52d.
Pending (cross-repo, needs push-ok): commit sharp Dockerfile + docker-deploy.md to monorepo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:11:06 +03:00
103df9fa46 feat(deploy): pilonuxt 37412d0 — offers в микроразметку Product, GSC-фикс live
redeploy-pilonuxt-gsc-offers closed. Build workstation @37412d0 (verdaccio
build-secret) → push registry.kzntsv.site/pilonuxt:37412d0 → перекат Portainer
stack 16 (PUT API, PullImage). Acceptance: itemprop="offers" (price/currency/
availability/url) на странице товара, verified curl --resolve к VDS; меню+viewModel
200, без регрессии.

Попутно: registry.kzntsv.site зарегистрирован в Portainer (Custom Id 1) —
первый pull падал "no basic auth credentials" (Portainer не имел ни одного
registry; host docker login слетел). Теперь приватный registry авторизован
в Portainer постоянно.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:09:19 +03:00
9add1ac164 feat(deploy): pilonuxt CUTOVER LIVE on www.pilorama98.ru — deploy-pilonuxt-vds closed
vitya флипнул DNS pilorama98.ru+www → 89.253.255.94. Перенастроил traefik
роутер на боевые хосты (apex+www+vds-subdomain, LE cert), снял smoke
GTM-override (прод-аналитика вкл), выкатил 125a3e2 (фикс Продукция→/catalog).
Финальный smoke с VDS по www.pilorama98.ru: все страницы page 200/viewModel
200, картинки 200 webp, x-powered-by Nuxt (не IIS), cert valid, битый
футер-линк убран. Форма закрыта (vitya ok + pilonuxt dev-verified).
Stack 16. Задача 🟢 closed. Follow-ups: decommission старого IIS после soak.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 00:09:08 +03:00
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
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
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
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