# 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:0610432 # git-sha victor/labtools.pro master (snolla 0.42.1, bump 2026-07-05; prev 7bd9fae=0.28.7=rollback) restart: unless-stopped mem_limit: 512m # guardrail от runaway: snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only). 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 # CUTOVER 2026-07-02: DNS labtools.pro/www флипнут на VDS (89.253.255.94) оператором. # Проверено авторитетным ns1.reg.ru + 8.8.8.8 → 89.253.255.94 (НЕ labtools.ru!). Боевые хосты. # staging-хост labtools-pro.vds.kzntsv.site УБРАН post-cutover. RUVDS IIS 80.64.31.36 — rollback, не тронут. traefik.http.routers.labtools-pro.rule: Host(`labtools.pro`) || Host(`www.labtools.pro`) traefik.http.routers.labtools-pro.tls.certresolver: letsEncrypt traefik.http.services.labtools-pro.loadbalancer.server.port: "5000" networks: proxy: external: true