From ed99f2225b5e56d998b34140d20e403d80ecd050 Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 2 Jul 2026 12:07:52 +0300 Subject: [PATCH] =?UTF-8?q?deploy(labtools-pro):=20b=20LIVE=20on=20vds-kzn?= =?UTF-8?q?tsv=20=E2=80=94=20cutover=20done,=20labtools.pro=20on=20VDS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .tasks/STATUS.md | 7 ++++--- .wiki/concepts/labtools.pro-vds-deploy-runbook.md | 14 +++++++------- host-stacks/vds-kzntsv/labtools-pro.compose.yml | 7 ++++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index d485bc5..24d35e0 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1069,7 +1069,7 @@ Dev-source: `victor/labtools.ru/apps/web` (parity-док/буфер — в `.wor --- -## 🟡 [labtools-pro-web-vds-deploy] — Вынести `victor/labtools.pro` (snolla-app, `@snollajs/snolla@0.28.7`, server-side Liquid, БД-контент + MinIO-ассеты) с RUVDS IIS в docker-контейнер на VDS kzntsv (89.253.255.94) за traefik. **Зеркало `[emspb-web-vds-deploy]`** — тот же паттерн; рунбуки `emspb-vds-deploy-runbook` / `labtools-vds-deploy-runbook` (.admin вика) читать как шаблон. Код-DONE: ре-ревью PASS (все 9 дименшнов, ноль хаков), независимый ревьюер на живой БД+MinIO. +## 🟢 [labtools-pro-web-vds-deploy] — Вынести `victor/labtools.pro` (snolla-app, `@snollajs/snolla@0.28.7`, server-side Liquid, БД-контент + MinIO-ассеты) с RUVDS IIS в docker-контейнер на VDS kzntsv (89.253.255.94) за traefik. **Зеркало `[emspb-web-vds-deploy]`** — тот же паттерн; рунбуки `emspb-vds-deploy-runbook` / `labtools-vds-deploy-runbook` (.admin вика) читать как шаблон. Код-DONE: ре-ревью PASS (все 9 дименшнов, ноль хаков), независимый ревьюер на живой БД+MinIO. **Weight:** needs-human **Notify:** OpeItcLoc03/workshop @@ -1103,9 +1103,10 @@ Acceptance = внешний smoke на задеплоенном URL: ## Скилы / отчёт invoke `using-vds-ops`/`using-tasks`/`project-discipline`. Написать рунбук `labtools.pro-vds-deploy-runbook` в .admin вике (зеркало emspb). Репорт → OpeItcLoc03/workshop. Ops-acceptance = staging smoke-parity green; cutover — отдельным словом оператора. -**Status:** 🟡 STAGING GREEN — ждём DNS-cutover (gated, оператор). Runbook: `.wiki/concepts/labtools.pro-vds-deploy-runbook.md`. +**Status:** 🟢 CLOSED 2026-07-02 — cutover LIVE. `labtools.pro`+`www` на VDS (89.253.255.94), стек 19, образ `labtools-pro:7bd9fae`. Runbook: `.wiki/concepts/labtools.pro-vds-deploy-runbook.md`. +**Closure:** DNS флип подтверждён авторитетным `ns1.reg.ru` (Resolve-DnsName) + 8.8.8.8 → 89.253.255.94 (именно `.pro`; ранние проверки ловили старый TTL-кэш). Стек 19 traefik-rule → `Host(labtools.pro)||Host(www.labtools.pro)` (Portainer PUT, env 8/8 сохранён, pullImage=false); LE-cert выпущен мгновенно (ssl_verify=0). Live-smoke GREEN: оба хоста 200 (nav+каталог+продукты), редиректы parity, sitemap index host=www, контент реальный (lang=en). staging-хост убран (→404). Внешняя проверка с RUVDS-хоста: labtools.pro/www→89.253.255.94 HTTP 200 cert-trusted. RUVDS labtools.pro = rollback, жив, не тронут. Репорт workshop отправлен. **Where I stopped:** Образ `registry.kzntsv.site/labtools-pro:7bd9fae` (+latest, digest `sha256:23d0bc59…`) собран+запушен НА VDS (guard default.json absent OK). Portainer stack `labtools-pro` **Id 19** создан (env verbatim из stack 17, 8 секретов), контейнер healthy, MSSQL+S3 подключены, лог чист. Staging `labtools-pro.vds.kzntsv.site` LE-cert выпущен. **Smoke-parity vs бой `www.labtools.pro` GREEN** (гнал с VDS): статусы nav+3 каталог-секции+продукты 200/200; редиректы (каталог#1→lshm-750, /Contacts→lowercase, /contacts/→trailing) 301 parity; sitemap = index из 7 дочерних, в сумме 25 URL набор==бой, host=www (R3); theme-ассеты 7/7 md5-identical; Cache-Control absent (корректно, `CachingOptions=[]`); контент-страницы реальное тело (delta +155…+222B = host-длина). Косметика (не дефект, отдана workshop): стартовый баннер лога = `labtools.ru (snolla)` (константа из скаффолда). Compose: `host-stacks/vds-kzntsv/labtools-pro.compose.yml`. Репорт workshop отправлен. -**Next action:** Ждать сигнал оператора «флипнул DNS labtools.pro». ТОЛЬКО ПОСЛЕ external-resolve (8.8.8.8) что именно `labtools.pro`→89.253.255.94 (НЕ путать с labtools.ru!): в стеке 19 заменить traefik-rule на `Host(labtools.pro)||Host(www.labtools.pro)` (Portainer PUT, env сохранить), дождаться LE-cert, live-smoke на боевом хосте, убрать staging-хост post-cutover, репорт. Рунбук § Cutover. НЕ добавлять Host-rule до флипа (LE rate-limit). НЕ выводить RUVDS. +**Next action:** — (закрыто). Follow-up (не блокер, у workshop): косметика баннера `labtools.ru` в логе (константа app-name из скаффолда). Опционально позже: снять RUVDS-биндинги labtools.pro (как сделано для emspb) — по решению оператора, сейчас оставлены как rollback. **Branch:** master **Notify:** OpeItcLoc03/workshop diff --git a/.wiki/concepts/labtools.pro-vds-deploy-runbook.md b/.wiki/concepts/labtools.pro-vds-deploy-runbook.md index bf2c94b..3ffc223 100644 --- a/.wiki/concepts/labtools.pro-vds-deploy-runbook.md +++ b/.wiki/concepts/labtools.pro-vds-deploy-runbook.md @@ -62,13 +62,13 @@ curl -ksS -X POST "$BASE/api/stacks/create/standalone/string?endpointId=1" -H "X ### Косметика (не дефект, отдано workshop) Стартовый баннер в логе — `labtools.ru (snolla) listening…` — строка-константа унаследована из labtools.ru-референса при скаффолде. Идентификация сайта = siteId в production.json (663F9410…), на рендер/контент не влияет. -## Cutover (live DNS) — GATED, действие ОПЕРАТОРА (ещё НЕ выполнен) -Бой live на [[../entities/ruvds-iis-host]] (`80.64.31.36`) **остаётся живым** до подтверждения. Порядок (как emspb): -1. **(оператор)** reg.ru: A-записи `labtools.pro` + `www.labtools.pro` → `89.253.255.94` (с RUVDS `80.64.31.36`). Понизить TTL заранее. -2. ⚠️ **Проверить внешним резолвером (8.8.8.8), что флипнут именно `labtools.pro`** (НЕ `labtools.ru` — он тоже ждёт cutover на RUVDS; не перепутать домены). Cм. memory [operator-dns-flip-verify-domain-before-cutover]. -3. **(ops) ТОЛЬКО ПОСЛЕ flip:** в стеке `labtools-pro` (Id 19) заменить traefik-rule на `Host(\`labtools.pro\`) || Host(\`www.labtools.pro\`)` (Portainer PUT, env сохранить, pullImage=false). LE HTTP-01 выпустит cert на первый хит. -4. Проверить LE cert выпущен + live-smoke на боевом хосте; убрать staging-хост `labtools-pro.vds.kzntsv.site` из rule post-cutover. -5. Отрепортить workshop. +## Cutover (live DNS) — ✅ ВЫПОЛНЕН 2026-07-02 +Порядок был (как emspb): +1. **(оператор)** reg.ru: A-записи `labtools.pro` + `www.labtools.pro` → `89.253.255.94` (с RUVDS `80.64.31.36`). +2. **(ops) verify флипа перед traefik:** предыдущие проверки ловили старый TTL-кэш (публичные резолверы отдавали 80.64.31.36); **авторитетный `ns1.reg.ru` через `Resolve-DnsName` подтвердил** `labtools.pro`+`www` → `89.253.255.94` (TTL 3600), 8.8.8.8 догнал. Именно `.pro` (НЕ `.ru`). Урок: при "поменял DNS" проверять авторитетный NS напрямую, а не только кэширующие резолверы. Cм. memory [operator-dns-flip-verify-domain-before-cutover]. +3. **(ops) ТОЛЬКО ПОСЛЕ flip:** стек `labtools-pro` (Id 19) traefik-rule → `Host(\`labtools.pro\`) || Host(\`www.labtools.pro\`)` (Portainer PUT, env сохранён 8/8, pullImage=false). LE HTTP-01 выпустил cert **мгновенно** (ssl_verify=0 с первого хита). +4. **Live-smoke GREEN:** оба хоста 200 (nav+каталог+продукты); редиректы (ball-mills→lshm-750, /Contacts→lowercase, /contacts/→trailing) parity; sitemap index 7 детей host=www; контент реальный (12728 B, `lang="en"`). staging-хост `labtools-pro.vds.kzntsv.site` убран из rule (→ 404). **Внешняя проверка с RUVDS-хоста (Королёв, public DNS):** `labtools.pro`+`www` → 89.253.255.94 HTTP 200, cert доверенный. +5. RUVDS labtools.pro — rollback-путь, жив (отвечает 301, TLS ок), НЕ тронут. ⚠️ **Порядок критичен:** Host-правило добавлять ТОЛЬКО ПОСЛЕ flip DNS (иначе traefik проактивно тянет LE-cert HTTP-01, challenge упадёт на RUVDS → сожжём rate-limit). diff --git a/host-stacks/vds-kzntsv/labtools-pro.compose.yml b/host-stacks/vds-kzntsv/labtools-pro.compose.yml index 119ef9e..64ca070 100644 --- a/host-stacks/vds-kzntsv/labtools-pro.compose.yml +++ b/host-stacks/vds-kzntsv/labtools-pro.compose.yml @@ -47,9 +47,10 @@ services: labels: traefik.enable: "true" traefik.http.routers.labtools-pro.entrypoints: websecure - # STAGING rule. Cutover: заменить на Host(`labtools.pro`) || Host(`www.labtools.pro`) - # ТОЛЬКО ПОСЛЕ флипа DNS на 89.253.255.94 (иначе LE HTTP-01 упадёт на RUVDS → rate-limit). - traefik.http.routers.labtools-pro.rule: Host(`labtools-pro.vds.kzntsv.site`) + # CUTOVER 2026-07-02: DNS labtools.pro/www флипнут на VDS (89.253.255.94) оператором. + # Проверено авторитетным ns1.reg.ru + 8.8.8.8 → 89.253.255.94 (НЕ labtools.ru!). Боевые хосты. + # staging-хост labtools-pro.vds.kzntsv.site УБРАН post-cutover. RUVDS IIS 80.64.31.36 — rollback, не тронут. + traefik.http.routers.labtools-pro.rule: Host(`labtools.pro`) || Host(`www.labtools.pro`) traefik.http.routers.labtools-pro.tls.certresolver: letsEncrypt traefik.http.services.labtools-pro.loadbalancer.server.port: "5000"