# 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 из МОНОРЕПЫ 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 — отдельным # шагом после зелёного 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). # Admin-api env (2026-08-05): JWT_SECRET / DATABASE_URL / S3_* передаются через Portainer # stack-env. При перекате стека env ОБЯЗАТЕЛЕН (Env:[] очищает секреты — gotcha #10). services: pilonuxt: container_name: pilonuxt image: registry.kzntsv.site/pilonuxt:0db46e1 restart: unless-stopped environment: NODE_ENV: production TZ: Europe/Moscow NITRO_HOST: 0.0.0.0 NITRO_PORT: "3000" # Admin-api env (2026-08-05, embed в apps/web Nuxt-middleware) JWT_SECRET: SUz56VIm96HqxLTZhR31BGhrVbAbIZC2R67prRwhzXsywCsd76Qaxlwl93vs9WC9 DATABASE_URL: "sqlserver://mssql.kzntsv.site:1433;database=MoreThenCms;user=snolla;password=fXkH4@8O%3pc;encrypt=true;trustServerCertificate=true" S3_ENDPOINT: https://minio.vds.kzntsv.site S3_REGION: us-east-1 S3_FORCE_PATH_STYLE: "true" S3_ACCESS_KEY_ID: AKIAJ2YJP72W6ZHCRE6Q S3_SECRET_ACCESS_KEY: 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 THEMES_BUCKET: themes # CUTOVER 2026-06-15: боевой домен www.pilorama98.ru — аналитика ВКЛ # (дефолт GTM-MNNXFJ6, env не задаём). На smoke-поддомене гасили `""`. networks: - proxy labels: traefik.enable: "true" traefik.http.routers.pilonuxt.entrypoints: websecure # Боевые хосты pilorama98 (DNS → 89.253.255.94, cutover с RUVDS IIS) + # pilonuxt.vds.kzntsv.site оставлен для прямого smoke/диагностики. traefik.http.routers.pilonuxt.rule: Host(`www.pilorama98.ru`) || Host(`pilorama98.ru`) || Host(`pilonuxt.vds.kzntsv.site`) traefik.http.routers.pilonuxt.tls.certresolver: letsEncrypt traefik.http.services.pilonuxt.loadbalancer.server.port: "3000" networks: proxy: external: true