# kupimknigi-deploy-snolla-0-42-0 ## Goal Собрать VDS-staging образ `kupimknigi.spb.ru` на `@snollajs/snolla@0.42.0` из `victor/kupimknigi.spb.ru` (`apps/web`, HEAD **`9608ff6`**) и передеплоить/создать стек. Простой **одностраничник** — код закрыт (re-review PASS, docker-валидация GREEN локально, секреты не в git/образ). Финал тиража snolla. ## Site (факты, резолвнуты из БД прогом) - siteId `E924A354-0377-4E1E-80C6-2EB0194AA55F` · theme `EF2C663C-8960-4D3B-83AA-5C683D47D6C0` («bootstrap», store-путь `ef2c663c89604d3b83aa5c683d47d6c0`) - бой `https://kupimknigi.spb.ru` — **БЕЗ www** (www мёртв, оператор подтвердил). Production=false в БД. - Структура: Pages=1 (`/`, content_page), Forms=1 (`/callback-order` POST). Каталога/стора/блога/фида/редиректов нет. ## Key files - `~/projects/kupimknigi.spb.ru/apps/web/package.json` — пин `@snollajs/snolla@0.42.0` - `~/projects/kupimknigi.spb.ru/deploy/Dockerfile` — multi-stage node:22-slim non-root, build-arg `VERDACCIO_TOKEN`, секреты не бейкаются - config: `default.json` gitignored; на VDS передаётся через env (`custom-environment-variables.json` маппинг) — БД `mssql.kzntsv.site/MoreThenCms`, S3/MinIO, imgproxy ## Acceptance (право-масштабировано под одностраничник — НЕ tandemmebel) - build sha `9608ff6` на VDS → образ в `registry.kzntsv.site` → стек Portainer (env verbatim, healthy MSSQL+S3). - Staging-smoke с VDS: `/` → 200, рендер == бой `kupimknigi.spb.ru` (H1 «Скупка старых книг в Санкт-Петербурге»), тема-ассеты 200 из MinIO, форма `/callback-order` POST жива, seoCanonical (`/callback-order/`→301). Completeness тривиален (1 URL). - rollback наготове. ## Cutover — operator-gated (как весь тираж) Live DNS flip **НЕ трогать** без отмашки оператора. ⚠️ kupimknigi DNS сейчас на RUVDS IIS `80.64.31.36` (майская iis-migration) — cutover-таргет/порядок разрешить с оператором отдельно, RUVDS=rollback. Этот таск = staging-образ + гейты, не флип. ## Meta - **Weight:** needs-claude (staging-сборка; cutover=operator-gated отдельный шаг) - **Notify:** OpeItcLoc03/workshop (оркестратор — «его сайт = workshop») - Deploy-source dev: `victor/kupimknigi.spb.ru`. **Status:** done — 2026-07-05 (admin). GREEN. **Where I stopped:** закрыто, все гейты зелёные. **Next action:** — Cutover=operator-gated отдельный шаг. ## Completed steps (2026-07-05, admin) - [x] Пин верифицирован: sha `9608ff6` резолвит snolla 0.42.0 (package.json + yarn.lock), Dockerfile OK, порт 5000, healthcheck=robots.txt. production.json запечён (siteId E924A354/siteUrl kupimknigi.spb.ru/DB/imgproxy/minio). Консюмер-пин на месте (не было tandemmebel-блокера). - [x] snolla 0.42.0 в verdaccio подтверждён (ранее в сессии). - [x] Build на VDS `registry.kzntsv.site/kupimknigi:9608ff6` (digest `ac7f846`, 583MB, BUILD_EXIT=0), push OK. - [x] Создал НОВЫЙ Portainer-стек **Id 21 `kupimknigi`** (POST create/standalone/string, endpointId=1, env verbatim 8/8 из стека 20 — тот же snolla-тенант). Контейнер healthy сразу, running==9608ff6. - [x] Staging-smoke с VDS GREEN: `/`→200==prod; H1 «Скупка старых книг в Санкт-Петербурге…» идентичен prod; robots.txt 200; тема-ассет toolbox.css→200 (MinIO); форма action="/callback-order" в HTML; callback-роуты паритет prod (`/callback-order/`→301, `/callback-order`→404 POST-only); байты 17717≈17672. - [x] compose source-of-truth: `host-stacks/vds-kzntsv/kupimknigi.compose.yml` (staging-host, боевой Host только в cutover-комменте). - [x] Таска 🟢 done, notify workshop. ## Decisions log - 2026-07-05: **CLOSED 🟢.** Тривиальный одностраничник, деплой чистый, без блокеров. Форму не сабмитил (POST=реальное письмо клиенту) — роут зарегистрирован==prod + отрендерен, достаточно для staging. Cutover остаётся operator-gated (kupimknigi DNS на RUVDS IIS, майская миграция — таргет/порядок с оператором). Follow-up (общий тиражу): Dockerfile печёт VERDACCIO_TOKEN в ARG/ENV → build-secret (парный фикс с dev, отложен).