diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 21c64ec..44fe81e 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,5 @@ # Admin Task Board +_Updated: 2026-07-04 (5) — 🟢 **[tandemmebel-sharp-staging-rebuild] closed — SHARP staging GREEN.** Пивот tandemmebel на in-process sharp завершён. Образ `tandemmebel:68b93a9` (snolla 0.34.0/core 0.15.0, digest 12288b15) собран на VDS, стек 20 обновлён (env verbatim 8/8, imgproxy из tandem-пути убран). 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 `/galleries//images//` 200 webp serve-bytes, **0 /imgproxy-рефов** (осиротевший imgproxy-конфиг в пине эмпирически мёртв → heads-up воркшопу вычистить), variant-cache пишется (32 объекта content-addressed), watermark визуально ✓ featured+lightbox / gallery-small чистый. [tandemmebel-web-vds-deploy] теперь 🟡 sharp-staging-green, ждёт **cutover DNS — gated оператором** (reg.ru→89.253.255.94). RUVDS=rollback._ _Updated: 2026-07-04 (4) — 🟢 **[minio-variant-cache-bucket] closed.** sharp-prereq. Создан бакет `variant-cache` в shared MinIO (minio.kzntsv.site/books-vds) — S3-эквивалент легаси App_Data/imageCache, куда sharp кладёт resize+watermark варианты on-demand (без него 500 NoSuchBucket на всех sharp-картинках = agent-блокер 1 из tandemmebel sharp-verify). Грант: snolla S3-креды == MinIO root (сверено) → в mode-server-fs полный доступ by construction, IAM не нужен. Write-verify под деплойными кредами: put→stat→get(md5 match)→delete→gone ✓. Другие 17 бакетов не тронуты, lifecycle не ставил (кэш регенерируем). Готовит почву под sharp-переезд tandemmebel (движок victor/snolla media-sharp-imageprocessor-port в переработке)._ _Updated: 2026-07-04 (3) — 🟢 **[imgproxy-stack29-watermark-rollback] closed.** Оператор сменил watermark-подход: tandemmebel уходит с imgproxy-watermark на in-process sharp (victor/snolla media-sharp-serve-and-watermark) → глифу на SHARED стеке 29 не место. Снял `IMGPROXY_WATERMARK_DATA` со стека 29 (books-vds): вырезал строку → результат byte-identical pre-watermark бэкапу (cross-check true) → PUT+redeploy+purge. Verify (не задеть боевых): pilorama98 (главный консюмер) 3 рендера == baseline (43950/172042/160010B) не задет; stostayer НЕ imgproxy-консюмер (картинки /galleries//images//assets/) → не затрагивается; WATERMARK_DATA present:false; tandem featured→чистый (ожидаемо, staging→sharp). Глиф-бинарь 7127e92a оставлен для sharp. [tandemmebel-web-vds-deploy] теперь ждёт ПЕРЕСБОРА образа на sharp-пин перед cutover. Notify workshop._ _Updated: 2026-07-04 (2) — 🟡 **[tandemmebel-web-vds-deploy] STAGING GREEN, ждёт cutover.** Финал тиража tandemmebel. Образ `tandemmebel:0facb35` (snolla@0.32.2/core@0.13.8, digest 464d2f22, watermark-override в пине) собран на VDS (обход 499). Стек Portainer **Id 20** (staging-rule `tandemmebel.vds.kzntsv.site`, env verbatim из labtools стека 17, 8/8), контейнер healthy MSSQL+S3. imgproxy-nginx кэш (books-vds стек 29) purged → featured отдаёт вотермарк без cache-bust (27820B). Staging-smoke с VDS GREEN: status-parity 10/10, sitemap staging⊇prod (prod-only=0, +12 /projects/categories/*=benign#3, /articles 404 parity), 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 reg.ru→89.253.255.94; порядок: verify авторит.NS → ТОЛЬКО потом боевой Host-rule (иначе LE упадёт на RUVDS). RUVDS=rollback._ @@ -1205,7 +1206,7 @@ Focus-ревьюер (независимо) нашёл: nginx перед imgprox ### Rollback DNS → RUVDS IIS (живой, не выводить до явного решения оператора). Стек remove / откат тега. -**Status:** 🟡 staging-green, PAUSED — watermark-подход СМЕНЁН на in-process sharp (imgproxy-путь отменён 2026-07-04). Ждёт пересбора образа на sharp → новый staging → cutover. +**Status:** 🟡 SHARP staging-green 2026-07-04 (образ 68b93a9, стек 20), ждёт cutover (DNS gated оператором). Пивот на sharp завершён — см. [tandemmebel-sharp-staging-rebuild] 🟢. **Where I stopped:** build ✅ (tandemmebel:0facb35 на VDS) + стек Portainer Id 20 (staging-rule, оставлен UP) + staging-smoke GREEN (все гейты, benign #2/3/5 учтены). Оператор поставил cutover на HOLD → решение: watermark через sharp (victor/snolla media-sharp-serve-and-watermark), НЕ imgproxy. **imgproxy глиф со стека 29 СНЯТ** (таск [imgproxy-stack29-watermark-rollback] 🟢, боевые тенанты verified чисты); глиф-бинарь 7127e92a оставлен для sharp-composite. Текущий образ 0facb35 использует imgproxy.watermark — при возврате к деплою нужен ПЕРЕСБОР на sharp-пин. Compose source-of-truth в host-stacks/vds-kzntsv/tandemmebel.compose.yml. **Next action:** ЖДУ отмашку ОПЕРАТОРА на DNS-флип reg.ru (tandemmebel.ru+www → 89.253.255.94). Потом: verify авторит.NS (Resolve-DnsName) ПЕРЕД traefik → PUT стека 20 rule → Host(`tandemmebel.ru`)||Host(`www.tandemmebel.ru`), убрать staging-host → live-smoke оба хоста + featured-вотермарк на живом. RUVDS=rollback, не трогать. **Branch:** n/a @@ -1294,6 +1295,10 @@ tandemmebel-staging (стек 20) потеряет featured-вотермарк --- +## 🟢 [tandemmebel-sharp-staging-rebuild] — closed 2026-07-04 — sharp staging GREEN. Образ `tandemmebel:68b93a9` (snolla 0.34.0/core 0.15.0 in-process sharp, digest 12288b15) собран на VDS; стек 20 обновлён (env verbatim 8/8). Smoke: nav-parity 8/8, sitemap staging⊇prod (prod-only=0, +12 categories benign#3), 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-рефов) — вычистить в след. пине. Cutover — НЕ в scope, gated оператором. Notify workshop. + + + ## ⚪ [tandemmebel-sharp-staging-rebuild] — РЕЗЮМ ДЕПЛОЯ tandemmebel (был 🟡 paused под пивот на sharp — sharp готов, снимаем паузу). Оператор: «деплоим, ты всё проверишь». Пересобрать staging на новом sharp-движке, parity-smoke. Cutover DNS — НЕ в scope, отдельный gated шаг оператора позже. ## Что нового vs прошлый staging (imgproxy-путь) @@ -1328,11 +1333,12 @@ tandemmebel-staging (стек 20) потеряет featured-вотермарк **notify:** OpeItcLoc03/workshop **Dev-source:** victor/tandemmebel sha 68b93a95 (sharp-движок snolla 0.34.0/core 0.15.0) -**Status:** ready -**Where I stopped:** (not started) -**Next action:** Собрать staging-образ tandemmebel с sha 68b93a95 (движок sharp), деплой staging-стек, parity-smoke vs бой, доложить. +**Status:** 🟢 closed 2026-07-04 (sharp staging green) +**Where I stopped:** образ 68b93a9 собран + стек 20 обновлён + parity-smoke GREEN (media/watermark/variant-cache/sitemap все ок). Notify workshop отправлен. Осиротевший imgproxy-конфиг в пине — heads-up воркшопу (dead). +**Next action:** — (закрыто). Cutover — в [tandemmebel-web-vds-deploy], ждёт DNS-отмашки оператора. **Branch:** n/a **Notify:** OpeItcLoc03/workshop + --- diff --git a/host-stacks/vds-kzntsv/tandemmebel.compose.yml b/host-stacks/vds-kzntsv/tandemmebel.compose.yml index 63250fa..a3fee93 100644 --- a/host-stacks/vds-kzntsv/tandemmebel.compose.yml +++ b/host-stacks/vds-kzntsv/tandemmebel.compose.yml @@ -3,11 +3,12 @@ # STAGING-FIRST. Source-of-truth этого compose — admin-репо; применяется через Portainer # API/UI (VDS-rule: стеки через Portainer, не ssh+compose). # -# Модель: монолит @snollajs/snolla (0.32.2) / @snollajs/core (0.13.8) — читает БД-контент -# MoreThenCms (mssql.kzntsv.site) + server-side Liquid render. Ассеты из MinIO (minio.kzntsv.site) -# через imgproxy (imgproxy.kzntsv.site). node-config: NODE_ENV=production → default(dev,gitignored)+ -# production.json+ENV-override. КОНТЕНТ+БЛОГ-ПОРТФОЛИО+category сайт, БЕЗ e-commerce каталога. -# production.json содержит imgproxy.watermark override {size:post-featured, option:wm:0.5:ce:0:0:0} — в образе. +# Модель: монолит @snollajs/snolla (0.34.0) / @snollajs/core (0.15.0) — читает БД-контент +# MoreThenCms (mssql.kzntsv.site) + server-side Liquid render. Ассеты из MinIO (minio.kzntsv.site). +# МЕДИА: in-process sharp (resize+data-driven watermark), delivery=serve-bytes, cache=local-variant→ +# бакет variant-cache в MinIO. imgproxy ИЗ ПУТИ tandem УБРАН (сырой /imgproxy → 404 норма). +# node-config: NODE_ENV=production → default(dev,gitignored)+production.json+ENV-override. +# КОНТЕНТ+БЛОГ-ПОРТФОЛИО+category сайт, БЕЗ e-commerce каталога. # # Образ собирается АДМИНОМ на VDS из victor/tandemmebel.ru/deploy/Dockerfile (build-arg VERDACCIO_TOKEN, # @snollajs/* из verdaccio.kzntsv.site). Тег = git-sha монорепы tandemmebel.ru (0facb35). @@ -17,8 +18,8 @@ # DNS переключает ОПЕРАТОР. План отката = revert DNS → 80.64.31.36. # ⚠️ Host-правило боевых хостов добавлять ТОЛЬКО ПОСЛЕ flip DNS (иначе LE HTTP-01 упадёт на RUVDS → rate-limit). # -# Runtime egress (наружу из proxy-сети): mssql.kzntsv.site:1433, minio.kzntsv.site:443, -# imgproxy.kzntsv.site:443, smtp.yandex.ru:465. +# Runtime egress (наружу из proxy-сети): mssql.kzntsv.site:1433, minio.kzntsv.site:443 +# (оригиналы + запись вариантов в bucket variant-cache), smtp.yandex.ru:465. imgproxy НЕ нужен (sharp in-process). # # Секреты — env на VDS (Portainer stack env), НЕ в образ, НЕ в git. Значения ${...} инжектит Portainer # из stack-переменных (переиспользованы verbatim из labtools stack Id 17). Контракт: @@ -28,7 +29,7 @@ services: tandemmebel: container_name: tandemmebel - image: registry.kzntsv.site/tandemmebel:0facb35 # git-sha victor/tandemmebel.ru master + image: registry.kzntsv.site/tandemmebel:68b93a9 # git-sha victor/tandemmebel.ru master (sharp-движок) restart: unless-stopped environment: NODE_ENV: production