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>
This commit is contained in:
2026-07-01 16:51:46 +03:00
parent 1a33c429d3
commit a15fd65ae9
4 changed files with 156 additions and 26 deletions

View File

@@ -1,37 +1,43 @@
---
_last_updated_: 2026-06-29T20:05:00Z
session_id: 2026-06-29-pilonuxt-deploys
_last_updated_: 2026-07-01T13:45:00Z
session_id: 2026-07-01-labtools-vds-staging
---
# Next session handoff
## Recent commits
- `685f2735` deploy(pilonuxt): cf2bba2 LIVE — forms-api + full @snollajs/snolla drop (ADR-0010)
- `dca1bf77` deploy(pilonuxt): 40bb383 LIVE — staticPages + robots.txt from DB (ADR-0009)
- `c3e84583` wiki(books-vds): document public bookva-db endpoint :33306
## Что произошло (сжато)
Два последовательных деплоя pilonuxt на прод (Portainer стек 16, vds-kzntsv 89.253.255.94), оба по наряду от victor/pilorama98.ru через inbox:
1. **40bb383** — DB-backed staticPages + robots.txt (ADR-0009). Smoke 6/6.
2. **cf2bba2** — forms на `@snollajs/forms-api`, полный дроп `@snollajs/snolla`, core@0.1.1 (Buffer вместо btoa). Tree-check `.output` 4/4 (0× snolla, 0× btoa, 1× data@0.9.1) + smoke зелёный (SSR 200, robots/yandex из БД, форма 422/404).
Оба наряда 🟢 closed, notify отправлены. **Текущий прод pilonuxt = `cf2bba2`.** Откат: стек 16 → `40bb383` (образ на VDS цел).
- `deploy(labtools)`: staging собран+развёрнут на vds-kzntsv, smoke parity GREEN, рунбук + стек-черновик (этой сессии).
- (до этого: pilonuxt sitemap taxonomy deploys — не связано)
## Open треки
| Трек | Готовность | Entry-point |
|---|---|---|
| (нет активных 🔴) | — | борд чист по pilonuxt |
| backlog/blocked без изменений | ⚪/🔵/🟡 | STATUS.md: harden-books-vds-exposed-ports ⚪, kreknin-self-backup ⚪, books-* bootstrap/cutover 🔵, fix-nl-vds-reality 🟡 (ждёт client-side от vitya) |
| `[labtools-web-vds-deploy]` | STAGING GREEN, ждём DNS-cutover | `.tasks/STATUS.md` + `.wiki/concepts/labtools-vds-deploy-runbook.md` |
## Спроси / подтверди
- (нет на этом раунде) — обе задачи закрыты, ничего mid-task не висит.
**Состояние labtools:** образ `registry.kzntsv.site/labtools:43e28ba` собран на VDS + push; Portainer stack `labtools`
(Id 17, endpoint 1) на `labtools.vds.kzntsv.site`, контейнер healthy; 8 секрет-env в stack-env. Smoke vs бой
`www.labtools.ru` — GREEN (меню 200/200, редиректы 301 1:1, тема+`/assets` из MinIO байт-в-байт, Cache-Control 86400).
Бой на RUVDS IIS (`80.64.31.36`) ЖИВОЙ, не тронут. Env-контракт (8 секретов, источники) — в рунбуке.
## Спроси user'а
- **DNS хозяин перенастраивает A-записи `labtools.ru`/`www``89.253.255.94` ЗАВТРА (2026-07-02).** Как оператор
подтвердит «DNS флипнут / флипаю сейчас» — выполнить cutover ops-шаги (ниже).
- `labtools.pro` — отдельная таска (оператор решил 2026-07-01, не в scope этой). Ждёт заведения.
## Cutover ops-шаги (по сигналу оператора о флипе — НЕ раньше)
1. В стеке `labtools` (Portainer Id 17) добавить в traefik-rule: `Host(labtools.ru) || Host(www.labtools.ru)`
**синхронно с флипом** (не заранее — см. guard ниже). Правка source: `admin/host-stacks/vds-kzntsv/labtools.compose.yml` → PUT в Portainer.
2. Проверить LE cert выпущен на боевом хосте + прогнать тот же смоук-свип уже на `https://www.labtools.ru`.
3. Отчитаться оператору + workshop (from admin).
## Не делать (preemptive guards)
- **Notify victor/pilorama98.ru → ТОЛЬКО `~/projects/pilorama98.ru/.claude-inbox/`** (монореп, живой, метётся в `.read/`). НЕ dotted `~/projects/.pilorama98.ru/` (мёртвый, сообщения копятся непрочитанными). Промахнулся раз на 40bb383-notify. См. memory `pilorama98-inbox-is-monorepo-not-dotted`.
- **Автопуш был выдан на ЭТУ сессию** — на старте следующей сбросить в ask-mode (project-discipline Rule 4).
- **pilonuxt build-канал:** push с дома гарантированно 499 на `.output`-слое → сразу `docker save | ssh -i ~/.ssh/id_ed25519 vitya@89.253.255.94 'sudo docker load'` + push с VDS (registry локален). Не тратить время на home-push.
- **forms-api smoke:** 422 только с `Accept: application/json` (иначе `prefersJson` false → 404, не баг).
- **Деплой pilonuxt всегда требует ФОРС-регенерации клиента:** `rm -rf apps/web/src/generated` + `yarn workspace nuxt-app schema-gen` (egress в MSSQL) перед docker build — иначе ensure-schema skip соберёт stale-клиент.
- **НЕ добавлять `Host(labtools.ru)` в traefik-rule ДО флипа DNS** — traefik проактивно на reload тянет LE-cert (HTTP-01),
challenge упадёт на RUVDS (DNS ещё там), сожжём LE rate-limit → задержка cert на реальном cutover'е.
- **НЕ выводить RUVDS IIS labtools из эксплуатации** (директива оператора 2026-07-01) — это rollback-путь.
- **НЕ флипать DNS самим** — это делает хозяин домена.
- **Автопуш в ЭТОЙ сессии НЕ выдавался** — коммиты локальные, не запушены; на старте следующей — ask-mode (project-discipline Rule 4).
- Build-канал labtools: собирать НА VDS из чистого `git archive` (без `config/default.json`), push с VDS (registry локален).
- `labtools.pro` — не трогать в рамках этой таски.
## Memory updates за сессию
- Создана `pilorama98-inbox-is-monorepo-not-dotted.md` (reference) + строка в MEMORY.md — куда слать notify pilorama98.
- (нет на этом раунде — всё в STATUS.md + рунбуке `labtools-vds-deploy-runbook.md`)