feat(deploy): add pilonuxt VDS Portainer stack compose; block on pilonuxt Dockerfile fix

pilonuxt deploy на vds-kzntsv за Traefik. Compose готов (proxy net,
websecure, certresolver letsEncrypt, Host pilonuxt.vds.kzntsv.site, :3000,
GTM погашен на smoke-поддомене). Домен согласован с vitya: temp-поддомен
для smoke, cutover www.pilorama98.ru — отдельным шагом.

Сборка диагностирована, образ НЕ собран — Dockerfile pilonuxt падает в
чистом контейнере (локально замаскировано глоб. yarnrc + сетью):
  1. .yarnrc.yml без npmAlwaysAuth:true → YN0041 anonymous (whoami=vitya).
  2. Dockerfile не копирует scripts/+src/generated до yarn install →
     postinstall Cannot find module scripts/ensure-schema.mjs (YN0009).
По решению vitya сборка отдана pilonuxt (их репо/фикс), за admin — Portainer.
Inbox victor/pilonuxt отправлен с разбором. Задача 🔵 blocked до образа.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-14 22:01:48 +03:00
parent 2ba7b6df5c
commit 38e84ce20b
2 changed files with 51 additions and 4 deletions

View File

@@ -490,7 +490,7 @@ vehicles-loader (stostayer) деплоится в Docker у клиента (lite
--- ---
## [deploy-pilonuxt-vds] — **Цель:** Собрать prod-образ нового Nuxt-фронта ПИЛОРАМА98 (`victor/pilonuxt`, master) и задеплоить на VDS как Portainer-стек за Traefik. Готово в репо: `Dockerfile` + `.dockerignore` в корне. Полный овнершип сборки и деплоя — на тебе (build → push в VDS-registry → Portainer stack), как books/stostayer. ## 🔵 [deploy-pilonuxt-vds] — **Цель:** Собрать prod-образ нового Nuxt-фронта ПИЛОРАМА98 (`victor/pilonuxt`, master) и задеплоить на VDS как Portainer-стек за Traefik. Готово в репо: `Dockerfile` + `.dockerignore` в корне. Полный овнершип сборки и деплоя — на тебе (build → push в VDS-registry → Portainer stack), как books/stostayer.
**Сборка:** **Сборка:**
- `docker build --secret id=verdaccio_token,env=VERDACCIO_TOKEN -t <registry>/pilonuxt:<tag> .` - `docker build --secret id=verdaccio_token,env=VERDACCIO_TOKEN -t <registry>/pilonuxt:<tag> .`
@@ -531,11 +531,13 @@ vehicles-loader (stostayer) деплоится в Docker у клиента (lite
**weight:** needs-human (deploy-инфра) **weight:** needs-human (deploy-инфра)
**notify:** victor/pilonuxt **notify:** victor/pilonuxt
**Status:** ready **Status:** blocked
**Where I stopped:** (not started) **Where I stopped:** Домен согласован (temp `pilonuxt.vds.kzntsv.site` для smoke). Сборка диагностирована: Dockerfile pilonuxt падает в чистом контейнере по 2 причинам (локально замаскированы глоб. yarnrc + локальной сетью): (1) `.yarnrc.yml` без `npmAlwaysAuth: true` → YN0041 anonymous хотя whoami=vitya; (2) Dockerfile копирует `config/` но не `scripts/`+`src/generated/` до `yarn install` → postinstall `Cannot find module scripts/ensure-schema.mjs` (YN0009). Оба подтверждены прогонами. По решению vitya сборку отдал pilonuxt (их репо, их фикс), за собой — Portainer-деплой. Compose готов: `host-stacks/vds-kzntsv/pilonuxt.compose.yml`.
**Next action:** Прочитать pilonuxt Dockerfile + .wiki/concepts/verdaccio-token-lifecycle.md; собрать образ с verdaccio build-secret; согласовать с vitya целевой домен (боевой www.pilorama98.ru vs временный поддомен для smoke). **Next action:** Ждать от pilonuxt (inbox victor/pilonuxt отправлен 19:05): имя+тег собранного образа в registry.kzntsv.site → обновить тег в compose → Portainer-стек на `pilonuxt.vds.kzntsv.site` → smoke → доклад.
**Blocker:** pilonuxt чинит Dockerfile (npmAlwaysAuth + COPY scripts/+src/generated до install) и пушит образ в registry.
**Branch:** n/a **Branch:** n/a
**Notify:** victor/pilonuxt **Notify:** victor/pilonuxt
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: victor/pilonuxt / 2026-06-14T18:45:22.955Z --> <!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: victor/pilonuxt / 2026-06-14T18:45:22.955Z -->
<!-- activated: vitya@.admin-exec / 2026-06-14 / ТЗ получено, домен=temp-subdomain для smoke -->
--- ---

View File

@@ -0,0 +1,45 @@
# pilonuxt — prod-фронт ПИЛОРАМА98 (Nuxt 4 / Nitro node-server) на vds-kzntsv (89.253.255.94).
#
# Деплой: 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.
#
# Домен: на smoke-фазе — временный поддомен pilonuxt.vds.kzntsv.site (под wildcard
# *.vds.kzntsv.site, cert LE HTTP-01 авто). Cutover www.pilorama98.ru — отдельным
# шагом после зелёного smoke (правка rule + DNS reg.ru).
#
# Runtime egress (наружу из proxy-сети, по умолчанию открыт):
# mssql.kzntsv.site:1433 (живые CMS-запросы, cacheTimeout=0) — обязателен;
# smtp.yandex.ru:465 (письма форм contacts/checkout);
# собственный origin https://pilonuxt.vds.kzntsv.site (SSR self-call на /snolla).
#
# Секреты (MSSQL/SMTP/imgproxy key+salt/siteId) ЗАПЕЧЕНЫ в config/default.json образа
# (решение vitya — образ только в приватном registry). Env-override не настраивали.
services:
pilonuxt:
container_name: pilonuxt
image: registry.kzntsv.site/pilonuxt:238a820
restart: unless-stopped
environment:
NODE_ENV: production
TZ: Europe/Moscow
NITRO_HOST: 0.0.0.0
NITRO_PORT: "3000"
# Smoke на временном поддомене — гасим боевую аналитику, чтобы не лить
# тестовый трафик в GTM-MNNXFJ6. На cutover вернуть дефолт (убрать строку).
NUXT_PUBLIC_GTM_ID: ""
networks:
- proxy
labels:
traefik.enable: "true"
traefik.http.routers.pilonuxt.entrypoints: websecure
traefik.http.routers.pilonuxt.rule: Host(`pilonuxt.vds.kzntsv.site`)
traefik.http.routers.pilonuxt.tls.certresolver: letsEncrypt
traefik.http.services.pilonuxt.loadbalancer.server.port: "3000"
networks:
proxy:
external: true