DNS zone is on Yandex DNS (dns1/dns2.yandex.net), not reg.ru. Flip propagated unevenly (dns2 first, dns1 lagged); cutover gate = BOTH authoritative Yandex NS agree apex+www -> 89.253.255.94 (monitor waited for it) so LE HTTP-01 can't hit RUVDS via a stale auth server and burn the rate-limit. Stack 17 traefik-rule -> Host(labtools.ru)||Host(www.labtools.ru) via Portainer PUT (env 8/8 preserved, pullImage=false). LE cert issued (~t+20s; brief self-signed window during issuance). Live-smoke GREEN: both hosts 200 (nav+catalog+products), redirects parity (trailing/lowercase/.php), sitemap index host=labtools.ru (this tenant's siteUrl is non-www), theme assets byte-identical (RUVDS 301 apex->www made the direct md5 an artifact; -L => MD5-OK). Staging host removed (->404). External: apex->VDS 200; www still split-brain on RUVDS cache (200, identical content, TTL 6h). RUVDS left intact as rollback. Task closed. Whole batch done: labtools.ru + labtools.pro LIVE on VDS. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
57 lines
3.4 KiB
YAML
57 lines
3.4 KiB
YAML
# 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
|
||
# CUTOVER 2026-07-02: DNS labtools.ru/www флипнут на VDS (89.253.255.94) оператором (Yandex DNS).
|
||
# Проверено ОБА авторитетных Yandex-NS (dns1+dns2) согласованно → 89.253.255.94 (НЕ labtools.pro!). Боевые хосты.
|
||
# staging-хост labtools.vds.kzntsv.site УБРАН post-cutover. RUVDS IIS 80.64.31.36 — rollback, не тронут.
|
||
traefik.http.routers.labtools.rule: Host(`labtools.ru`) || Host(`www.labtools.ru`)
|
||
traefik.http.routers.labtools.tls.certresolver: letsEncrypt
|
||
traefik.http.services.labtools.loadbalancer.server.port: "5000"
|
||
|
||
networks:
|
||
proxy:
|
||
external: true
|