From a9f4f3a673b4202ca9abcdce18c9fb946e6935e7 Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 2 Jul 2026 12:42:57 +0300 Subject: [PATCH] =?UTF-8?q?deploy(labtools):=2043e28ba=20LIVE=20on=20vds-k?= =?UTF-8?q?zntsv=20=E2=80=94=20cutover=20done,=20labtools.ru=20on=20VDS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .tasks/STATUS.md | 8 ++++---- .wiki/concepts/labtools-vds-deploy-runbook.md | 13 +++++++------ host-stacks/vds-kzntsv/labtools.compose.yml | 6 ++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 24d35e0..95cf8d3 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -989,7 +989,7 @@ deps подняты: `@snollajs/snolla ^0.18`, `content-api ^0.13`, `content-api --- -## 🟡 [labtools-web-vds-deploy] — Деплой `labtools.ru` snolla-приложения (`victor/labtools.ru/apps/web`) в docker-контейнере на Rusonyx VDS за traefik. Приложение parity-подтверждено (ре-ревью №2 PASS: HTML+визуал byte-parity с боем `www.labtools.ru`, ассеты из MinIO, ноль локальных хаков, `@snollajs/snolla@0.28.2`). +## 🟢 [labtools-web-vds-deploy] — Деплой `labtools.ru` snolla-приложения (`victor/labtools.ru/apps/web`) в docker-контейнере на Rusonyx VDS за traefik. Приложение parity-подтверждено (ре-ревью №2 PASS: HTML+визуал byte-parity с боем `www.labtools.ru`, ассеты из MinIO, ноль локальных хаков, `@snollajs/snolla@0.28.2`). ## Кто/где собирает образ (решение workshop) **Образ собирает АДМИН на VDS** из `Dockerfile`, который пишет имплементер. build нужен docker + доступ к verdaccio (`verdaccio.kzntsv.site`) + `VERDACCIO_TOKEN` — эта инфра у админа/на VDS; имплементер владеет корректностью Dockerfile, не реестром. Кросс-машинный трансфер образа не нужен. @@ -1019,9 +1019,9 @@ deps подняты: `@snollajs/snolla ^0.18`, `content-api ^0.13`, `content-api **notify:** OpeItcLoc03/workshop Dev-source: `victor/labtools.ru/apps/web` (parity-док/буфер — в `.workshop/.brainstorm/snolla-sites-migration.md`). Blast: cutover затронет живой прод labtools.ru — staging-first, cutover gated. -**Status:** in_progress -**Where I stopped:** STAGING ЗЕЛЁНЫЙ (2026-07-01). Образ `registry.kzntsv.site/labtools:43e28ba` собран на VDS + push; Portainer stack `labtools` (Id 17) на `labtools.vds.kzntsv.site`, контейнер healthy (MSSQL+S3 подключены); 8 секрет-env в stack-env. Smoke parity vs бой GREEN: все страницы меню 200/200, редиректы `.php`/trailing-slash/lowercase 301 1:1, `theme.css` из MinIO байт-в-байт (Cache-Control 86400), `/assets/*.webp` байт-в-байт. Рунбук: `.wiki/concepts/labtools-vds-deploy-runbook.md`. -**Next action:** Cutover live DNS `labtools.ru` — GATED, ждём добро оператора (бой на RUVDS 80.64.31.36 живой, НЕ выводить). По go: добавить `Host(labtools.ru)||Host(www.labtools.ru)` в traefik-rule стека → оператор флипает A-записи reg.ru → 89.253.255.94 → LE cert → smoke на боевом хосте. labtools.pro — ОТДЕЛЬНАЯ таска (deferred, решение оператора 2026-07-01), не в scope. +**Status:** 🟢 CLOSED 2026-07-02 — cutover LIVE. `labtools.ru`+`www` на VDS (89.253.255.94), стек 17, образ `labtools:43e28ba`. Рунбук § Cutover обновлён. +**Closure:** DNS зона на **Yandex DNS** (не reg.ru). Флип шёл неравномерно — dns1/dns2 расходились; cutover-гейт = ОБА авторитетных Yandex-NS согласованно → VDS по apex+www (монитор дождался). Стек 17 traefik-rule → `Host(labtools.ru)||Host(www.labtools.ru)` (Portainer PUT, env 8/8, pullImage=false); LE-cert выпущен (~t+20s). Live-smoke GREEN: оба хоста 200 (nav+каталог-секции+продукты), редиректы (`/about/` trailing, `/Contacts` lowercase, `/index.php`→`/`) parity, sitemap index (host=labtools.ru non-www — siteUrl тенанта без www), theme-ассеты byte-identical (RUVDS 301 apex→www → прямой md5 артефакт, с -L MD5-OK). staging-host убран (→404). Внешне: apex→VDS 200; www ещё split-brain на кэше RUVDS (200, идентичный контент, тухнет по TTL 6ч). RUVDS = rollback, не тронут. Репорт workshop отправлен. **Весь тираж закрыт: labtools.ru + labtools.pro LIVE на VDS.** +**Next action:** — (закрыто). Опционально позже по решению оператора: снять RUVDS-биндинги labtools.ru/www (как для emspb) — сейчас оставлены как rollback. **Branch:** master **Notify:** OpeItcLoc03/workshop diff --git a/.wiki/concepts/labtools-vds-deploy-runbook.md b/.wiki/concepts/labtools-vds-deploy-runbook.md index 9c0a3ec..02a70d5 100644 --- a/.wiki/concepts/labtools-vds-deploy-runbook.md +++ b/.wiki/concepts/labtools-vds-deploy-runbook.md @@ -57,12 +57,13 @@ PORT — не переопределять (образ дефолтит 5000; EX - `/assets//*.webp` из MinIO — **байт-в-байт** с боем (44444, 24354); content-type `application/octet-stream` — как на бою. - Контейнер healthy (MSSQL+S3 подключены). -## Cutover (live DNS) — GATED, действие ОПЕРАТОРА -Бой на [[../entities/ruvds-iis-host]] (`80.64.31.36`) **остаётся живым** до подтверждения. Порядок: -1. **(ops)** В стеке `labtools` добавить в traefik-rule: `Host(\`labtools.ru\`) || Host(\`www.labtools.ru\`)` (LE HTTP-01 выпустит cert на первый хит после DNS-flip). -2. **(оператор)** reg.ru: A-записи `labtools.ru` + `www.labtools.ru` → `89.253.255.94` (с RUVDS `80.64.31.36`). Понизить TTL заранее. -3. Проверить LE cert выпущен + smoke на боевом хосте. -4. `labtools.pro` — открытый вопрос (бой IIS обслуживал и его; scope таски = labtools.ru). Решить отдельно. +## Cutover (live DNS) — ✅ ВЫПОЛНЕН 2026-07-02 +⚠️ **DNS зоны `labtools.ru` — на Yandex DNS (`dns1/dns2.yandex.net`), НЕ reg.ru** (в отличие от `labtools.pro`/reg.ru). Порядок был: +1. **(оператор)** Yandex DNS: A-записи `labtools.ru` + `www.labtools.ru` → `89.253.255.94` (с RUVDS `80.64.31.36`). +2. **(ops) verify перед traefik — критично:** флип шёл неравномерно, **dns1 и dns2 расходились** (dns2 обновился первым, dns1 отставал). Гейт cutover = **ОБА** авторитетных NS согласованно отдают VDS по apex+www (иначе LE мог попасть на dns1→RUVDS→сжечь rate-limit). Публичные резолверы кэшировали до 6ч (TTL 21600) — для LE не критично (резолвит по авторитетному). Cм. memory [operator-dns-flip-verify-domain-before-cutover]. +3. **(ops) после подтверждения обоих NS:** стек `labtools` (Id 17) traefik-rule → `Host(\`labtools.ru\`) || Host(\`www.labtools.ru\`)` (Portainer PUT, env 8/8 сохранён, pullImage=false). LE-cert выпущен (~t+20s; первые хиты ловили self-signed в окне issuance, потом ssl_verify=0). +4. **Live-smoke GREEN:** оба хоста 200 (nav + каталог-секции + продукты); редиректы (`/about/`→trailing, `/Contacts`→lowercase, `/index.php`→`/`) parity; sitemap = index (host=`labtools.ru`, non-www — siteUrl этого тенанта без www, в отличие от .pro/R3); theme-ассеты из MinIO byte-identical бою (RUVDS отдаёт 301 apex→www, поэтому прямой md5 «DIFF» — артефакт; с `-L` MD5-OK). staging-хост `labtools.vds.kzntsv.site` убран (→404). **Внешняя проверка с RUVDS-хоста:** `labtools.ru`→VDS 200; `www` ещё на кэше RUVDS (200, идентичный контент) — split-brain окно, тухнет по TTL. +5. `labtools.pro` — **закрыт отдельно** ([[labtools.pro-vds-deploy-runbook]], LIVE 2026-07-02). ## Rollback - **DNS:** вернуть A-записи `labtools.ru`/`www` → `80.64.31.36` (RUVDS IIS живой, нетронут). Откат = смена DNS. diff --git a/host-stacks/vds-kzntsv/labtools.compose.yml b/host-stacks/vds-kzntsv/labtools.compose.yml index bd26d61..84f87c1 100644 --- a/host-stacks/vds-kzntsv/labtools.compose.yml +++ b/host-stacks/vds-kzntsv/labtools.compose.yml @@ -44,8 +44,10 @@ services: labels: traefik.enable: "true" traefik.http.routers.labtools.entrypoints: websecure - # STAGING-хост. Боевой www.labtools.ru || labtools.ru добавить ТОЛЬКО на cutover-шаге. - traefik.http.routers.labtools.rule: Host(`labtools.vds.kzntsv.site`) + # CUTOVER 2026-07-02: DNS labtools.ru/www флипнут на VDS (89.253.255.94) оператором (Yandex DNS). + # Проверено ОБА авторитетных Yandex-NS (dns1+dns2) согласованно → 89.253.255.94 (НЕ labtools.pro!). Боевые хосты. + # staging-хост labtools.vds.kzntsv.site УБРАН post-cutover. RUVDS IIS 80.64.31.36 — rollback, не тронут. + traefik.http.routers.labtools.rule: Host(`labtools.ru`) || Host(`www.labtools.ru`) traefik.http.routers.labtools.tls.certresolver: letsEncrypt traefik.http.services.labtools.loadbalancer.server.port: "5000"