diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 32f4926..98a4056 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -794,7 +794,7 @@ Approach ратифицирован человеком (вариант A): ко --- -## 🔵 [deploy-pilorama-web-from-monorepo] — Раскатать на прод текущий `apps/web` из монорепы `victor/pilorama98.ru` — содержит SEO on-page фиксы (тех-аудит 2026-06-18): `buildProductSeo` (172 товарных title+meta, commit `03c250b`) + `seoOverrides` (16 category/service title + 8 meta, commit `b73c7c8`). На проде их пока НЕТ. +## 🟡 [deploy-pilorama-web-from-monorepo] — Раскатать на прод текущий `apps/web` из монорепы `victor/pilorama98.ru` — содержит SEO on-page фиксы (тех-аудит 2026-06-18): `buildProductSeo` (172 товарных title+meta, commit `03c250b`) + `seoOverrides` (16 category/service title + 8 meta, commit `b73c7c8`). На проде их пока НЕТ. **Ключевое — перенацелить источник сборки.** Пайплайн исторически собирал из `victor/pilonuxt` (см. web-вики `apps/web/.wiki/concepts/docker-deploy.md`). После консолидации 2026-06-18 код в `victor/pilorama98.ru/apps/web/` (Dockerfile приехал с subtree, там же). Сборку надо перенаправить: clone монорепы, build-контекст = `apps/web/`. @@ -825,7 +825,9 @@ Approach ратифицирован человеком (вариант A): ко **Blocker (актуальный):** `sharp`/libvips не попадает в standalone Nitro output. Шов: ПОЧЕМУ sharp в товарном пути = поведение snolla/content-api; КАК забандлить = `apps/web` `nuxt.config` (nitro traceInclude/externals) ИЛИ runner-стейдж Dockerfile (скопировать `@img/sharp-*` нативы в `.output`). Образ `eaee56f` в реестре (не рабочий из-за sharp). **Update 2026-06-18 (3):** sharp-фикс СДЕЛАН (admin, Dockerfile-side): runner-стейдж копирует `/app/node_modules/@img` (вкл. `sharp-libvips-linux-x64` с `libvips-cpp.so.8.18.3`) в `.output/server/node_modules/@img`. Verified в контейнере: `import sharp → toBuffer()` = SHARP_OK. Пересобрал+задеплоил → sharp из лога ушёл. **НО за sharp вскрылся СЛЕДУЮЩИЙ блокер:** `getSiteById findByPk undefined` опять, теперь в snolla **0.17** (`@snollajs/snolla/lib/services/sites.js:21`) на **ecommerce-роуте** (`content-api/routes/ecommerce.js:304`) → `/snolla/stores//products` 500. При этом pages-путь работает: `/` и `/catalog/planken` = 200 c SEO, viewModel ок. Т.е. Sites-модель доступна на pages-роуте, но не на ecommerce — snolla-0.17-внутренности. Был замаскирован sharp'ом (тот падал первым на том же роуте). **Откатил прод на `19a4a84` (все 200, каталог жив).** **Blocker (актуальный):** snolla 0.17 — `getSiteById` падает на ecommerce-роуте (Sites-модель undefined именно там; pages-роут ок). Зона пира/snolla. Локальный «товар 200» пира — видимо product-detail (viewModel), а не store-products-листинг; нужен прогон именно `/snolla/stores//products` в контейнере. sharp (моя часть) закрыт; Dockerfile-фикс ждёт в дереве монорепы (`M apps/web/Dockerfile`, не закоммичен). -**Next action:** пир/snolla: починить `getSiteById` на ecommerce-роуте snolla 0.17 → я коммичу sharp-Dockerfile + обновляю docker-deploy.md → пересобрать `@HEAD` → повторить деплой (рецепт отлажен, ~10 мин, sharp уже решён). +**Update 2026-06-19 (4) — 🟢 GREEN на проде:** пир добил 4-й слой (commit `41cf89f`: `@snollajs/data` 0.9.0→0.9.1 — forEach-async race + Windows-path-surgery, ломавшая `import()` на Linux = ровно Linux-only дефект; snolla 0.17.1 единой runtime). Пересобрал из `6c6d52d` (HEAD, вкл. деп-фикс + мой sharp `@img` COPY), запушил с VDS, задеплоил стек 16. **Контейнер-smoke ВСЁ 200:** товарная `/shop/products/brusok-…-40-50-6000` → title «Брусок обрезной естественной влажности 40×50×6000 мм» (52≤60) + meta «…**доставка по СПб и ЛО** — от производителя» ✓; `/catalog/planken` → «Планкен прямой и скошенный — купить в СПб» ✓; `/snolla/stores//products` 200×3 стабильно; home/shipping/blog 200 + meta. Контейнер `6c6d52d` 3мин без рестартов, **stderr пуст**. Acceptance 1-3 выполнены, прод отдаёт SEO. +**Остаётся (🟡):** criterion 4 — закоммитить в МОНОРЕП (`victor/pilorama98.ru`) sharp-фикс `apps/web/Dockerfile` (некоммичен) + обновить `apps/web/.wiki/concepts/docker-deploy.md` («нативных модулей нет» → sharp via snolla 0.17, runner несёт @img). Это **cross-repo push** → ждёт явного push-ok от vitya (дисциплина Rule 4). Прод от этого не зависит — он уже зелёный. +**Next action:** получить от vitya ok на cross-repo push в монореп → закоммитить Dockerfile + docker-deploy.md → закрыть 🟢. Пир уведомлён (закроет свою деплой-таску, GSC). **Branch:** n/a **Notify:** victor/pilorama98.ru diff --git a/host-stacks/vds-kzntsv/pilonuxt.compose.yml b/host-stacks/vds-kzntsv/pilonuxt.compose.yml index 9c10236..8de891f 100644 --- a/host-stacks/vds-kzntsv/pilonuxt.compose.yml +++ b/host-stacks/vds-kzntsv/pilonuxt.compose.yml @@ -3,8 +3,11 @@ # Деплой: Portainer-стек за Traefik. Source-of-truth этого compose — admin-репо; # применяется через Portainer API/UI (VDS-rule: стеки через Portainer, не ssh+compose). # -# Образ собирается на workstation (build secret VERDACCIO_TOKEN, живой JWT) и -# пушится в registry.kzntsv.site. Тег = git-sha pilonuxt master. +# Образ собирается на workstation из МОНОРЕПЫ victor/pilorama98.ru (workspace-build: +# контекст = корень монорепы, -f apps/web/Dockerfile, build secret VERDACCIO_TOKEN живой JWT). +# runner несёт @img/sharp-* нативы (sharp приехал с snolla 0.17, imageResize). Тег = git-sha +# монорепы. Push: с дома .output-слой ловит traefik-499 → docker save | ssh vds 'docker load' +# + docker push С VDS. См. apps/web/.wiki/concepts/docker-deploy.md. # # Домен: на smoke-фазе — временный поддомен pilonuxt.vds.kzntsv.site (под wildcard # *.vds.kzntsv.site, cert LE HTTP-01 авто). Cutover www.pilorama98.ru — отдельным @@ -21,7 +24,7 @@ services: pilonuxt: container_name: pilonuxt - image: registry.kzntsv.site/pilonuxt:37412d0 + image: registry.kzntsv.site/pilonuxt:6c6d52d restart: unless-stopped environment: NODE_ENV: production