diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 5c02667..0b5069f 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -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 /pilonuxt: .` @@ -531,11 +531,13 @@ vehicles-loader (stostayer) деплоится в Docker у клиента (lite **weight:** needs-human (deploy-инфра) **notify:** victor/pilonuxt -**Status:** ready -**Where I stopped:** (not started) -**Next action:** Прочитать pilonuxt Dockerfile + .wiki/concepts/verdaccio-token-lifecycle.md; собрать образ с verdaccio build-secret; согласовать с vitya целевой домен (боевой www.pilorama98.ru vs временный поддомен для smoke). +**Status:** blocked +**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 (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 **Notify:** victor/pilonuxt + --- diff --git a/host-stacks/vds-kzntsv/pilonuxt.compose.yml b/host-stacks/vds-kzntsv/pilonuxt.compose.yml new file mode 100644 index 0000000..5054145 --- /dev/null +++ b/host-stacks/vds-kzntsv/pilonuxt.compose.yml @@ -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