Mirror of emspb deploy. Built registry.kzntsv.site/labtools-pro:7bd9fae on VDS (guard: default.json absent), created Portainer stack labtools-pro (Id 19, env verbatim from labtools stack 17). Container healthy, MSSQL+S3 connected. Staging smoke vs www.labtools.pro (RUVDS) GREEN, run from VDS: - nav + 3 catalog sections + products 200/200 - redirects (catalog#1->lshm-750, /Contacts lowercase, trailing) 301 parity - sitemap: snolla index of 7 children, aggregate 25 URLs == prod set, host=www (R3) - theme assets 7/7 md5-identical; Cache-Control absent (correct, CachingOptions=[]) - content pages real body, delta +155..222B (host length in canonical) Cosmetic (not a defect, flagged to workshop): startup banner logs "labtools.ru (snolla)" — scaffold constant; site identity is siteId 663F9410 in production.json. Cutover (live DNS) is gated on operator. Runbook + compose committed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
59 lines
3.5 KiB
YAML
59 lines
3.5 KiB
YAML
# labtools-pro — прод-фронт labtools.pro (snolla-приложение, server-side Liquid, node) на vds-kzntsv (89.253.255.94).
|
||
#
|
||
# STAGING-FIRST. Source-of-truth этого compose — admin-репо; применяется через Portainer
|
||
# API/UI (VDS-rule: стеки через Portainer, не ssh+compose).
|
||
#
|
||
# Модель: НЕ pilonuxt/Nuxt-contentApi. Это монолит @snollajs/snolla (0.28.7) — читает БД-контент
|
||
# 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. КАТАЛОЖНЫЙ сайт (secции /products/*, редиректы).
|
||
#
|
||
# Образ собирается АДМИНОМ на VDS из victor/labtools.pro/deploy/Dockerfile (build-arg VERDACCIO_TOKEN,
|
||
# @snollajs/* из verdaccio.kzntsv.site). Тег = git-sha монорепы labtools.pro.
|
||
# ⚠️ Имя образа labtools-pro (НЕ labtools — тот у labtools.ru).
|
||
#
|
||
# Домен: STAGING — labtools-pro.vds.kzntsv.site (под wildcard *.vds.kzntsv.site, cert LE HTTP-01 авто).
|
||
# Cutover live labtools.pro/www.labtools.pro — ОТДЕЛЬНЫЙ gated шаг: бой живой на RUVDS IIS, НЕ выводить.
|
||
# DNS переключает ОПЕРАТОР. ⚠️ НЕ путать с labtools.ru — тот флипается отдельно. План отката = revert DNS.
|
||
#
|
||
# Runtime egress (наружу из proxy-сети): mssql.kzntsv.site:1433, minio.kzntsv.site:443,
|
||
# imgproxy.kzntsv.site:443, smtp.yandex.ru:465.
|
||
#
|
||
# Секреты — env на VDS (Portainer stack env), НЕ в образ, НЕ в git. Значения ${...} инжектит Portainer
|
||
# из stack-переменных (переиспользованы verbatim из labtools stack Id 17). Контракт:
|
||
# DB_USER DB_PASSWORD IMGPROXY_KEY IMGPROXY_SALT S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY SMTP_USER SMTP_PASSWORD
|
||
# siteId=663F9410-A6CC-4651-9A5C-62844A313957 — non-secret, в production.json (не env).
|
||
|
||
services:
|
||
labtools-pro:
|
||
container_name: labtools-pro
|
||
image: registry.kzntsv.site/labtools-pro:7bd9fae # git-sha victor/labtools.pro master
|
||
restart: unless-stopped
|
||
environment:
|
||
NODE_ENV: production
|
||
TZ: Europe/Moscow
|
||
# PORT не переопределяем — образ дефолтит 5000 (EXPOSE 5000, healthcheck на $PORT)
|
||
# --- runtime-секреты (значения из Portainer stack env; НЕ хранить тут) ---
|
||
DB_USER: ${DB_USER}
|
||
DB_PASSWORD: ${DB_PASSWORD}
|
||
IMGPROXY_KEY: ${IMGPROXY_KEY}
|
||
IMGPROXY_SALT: ${IMGPROXY_SALT}
|
||
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID}
|
||
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY}
|
||
SMTP_USER: ${SMTP_USER}
|
||
SMTP_PASSWORD: ${SMTP_PASSWORD}
|
||
networks:
|
||
- proxy
|
||
labels:
|
||
traefik.enable: "true"
|
||
traefik.http.routers.labtools-pro.entrypoints: websecure
|
||
# STAGING rule. Cutover: заменить на Host(`labtools.pro`) || Host(`www.labtools.pro`)
|
||
# ТОЛЬКО ПОСЛЕ флипа DNS на 89.253.255.94 (иначе LE HTTP-01 упадёт на RUVDS → rate-limit).
|
||
traefik.http.routers.labtools-pro.rule: Host(`labtools-pro.vds.kzntsv.site`)
|
||
traefik.http.routers.labtools-pro.tls.certresolver: letsEncrypt
|
||
traefik.http.services.labtools-pro.loadbalancer.server.port: "5000"
|
||
|
||
networks:
|
||
proxy:
|
||
external: true
|