deploy(labtools): staging on vds-kzntsv GREEN — image 43e28ba, parity vs prod

- build registry.kzntsv.site/labtools:43e28ba on VDS from clean git-archive
  (no config/default.json), push from VDS (registry local)
- Portainer stack `labtools` (Id 17) on labtools.vds.kzntsv.site, container
  healthy (MSSQL mssql.kzntsv.site + MinIO minio.kzntsv.site), 8 secret-env in
  stack-env (not in image/git)
- smoke parity vs www.labtools.ru GREEN: menu pages 200/200, redirects
  (.php / trailing-slash / lowercase) 301 1:1, theme.css + /assets byte-identical
  from MinIO, Cache-Control max-age=86400
- add runbook .wiki/concepts/labtools-vds-deploy-runbook.md + stack source
  host-stacks/vds-kzntsv/labtools.compose.yml
- cutover DNS gated to operator (tomorrow 2026-07-02); RUVDS IIS 80.64.31.36
  prod untouched = rollback path

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-01 16:51:46 +03:00
parent 1a33c429d3
commit a15fd65ae9
4 changed files with 156 additions and 26 deletions

View File

@@ -0,0 +1,54 @@
# labtools — prod-фронт labtools.ru (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 — читает БД-контент 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.
#
# Образ собирается АДМИНОМ на VDS из victor/labtools.ru/deploy/Dockerfile (build-arg VERDACCIO_TOKEN,
# @snollajs/* из verdaccio.kzntsv.site). Тег = git-sha монорепы labtools.ru. [ТЕГ TBD — ждём Dockerfile имплементера]
#
# Домен: STAGING — labtools.vds.kzntsv.site (под wildcard *.vds.kzntsv.site, cert LE HTTP-01 авто).
# Cutover live www.labtools.ru — ОТДЕЛЬНЫЙ gated шаг: бой живой на RUVDS IIS (80.64.31.36), НЕ выводить.
# DNS переключает ОПЕРАТОР по сигналу «staging green». План отката = revert DNS на RUVDS.
#
# 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-переменных. Контракт (custom-environment-variables.json):
# DB_USER DB_PASSWORD IMGPROXY_KEY IMGPROXY_SALT S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY SMTP_USER SMTP_PASSWORD
services:
labtools:
container_name: labtools
image: registry.kzntsv.site/labtools:43e28ba # git-sha victor/labtools.ru 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.entrypoints: websecure
# STAGING-хост. Боевой www.labtools.ru || labtools.ru добавить ТОЛЬКО на cutover-шаге.
traefik.http.routers.labtools.rule: Host(`labtools.vds.kzntsv.site`)
traefik.http.routers.labtools.tls.certresolver: letsEncrypt
traefik.http.services.labtools.loadbalancer.server.port: "5000"
networks:
proxy:
external: true