# kupimknigi — прод-фронт kupimknigi.spb.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). # # Модель: монолит @snollajs/snolla (0.42.0) / core (0.24.0) / data (0.14.1) — читает БД-контент # MoreThenCms (mssql.kzntsv.site) + server-side Liquid render. Ассеты из MinIO (minio.kzntsv.site) # через imgproxy (imgproxy.kzntsv.site). ПРОСТОЙ ОДНОСТРАНИЧНИК: Pages=1 (`/`), Forms=1 (`/callback-order` POST). # Каталога/стора/блога/фида/редиректов НЕТ. node-config: NODE_ENV=production → production.json + ENV-override. # siteId=E924A354-0377-4E1E-80C6-2EB0194AA55F, siteUrl=https://kupimknigi.spb.ru (БЕЗ www — www мёртв) — в production.json (запечён). # # Образ собирается АДМИНОМ на VDS из victor/kupimknigi.spb.ru/deploy/Dockerfile (build-arg VERDACCIO_TOKEN, # @snollajs/* из verdaccio.kzntsv.site). Тег = git-sha монорепы kupimknigi.spb.ru (9608ff6). # # Домен: STAGING — kupimknigi.vds.kzntsv.site (под wildcard *.vds.kzntsv.site, cert LE HTTP-01 авто). # Cutover live kupimknigi.spb.ru — ОТДЕЛЬНЫЙ gated шаг: бой сейчас на RUVDS IIS (80.64.31.36, майская iis-migration). # DNS/порядок cutover разрешает ОПЕРАТОР отдельно. План отката = revert DNS → RUVDS. RUVDS не тронут. # ⚠️ Боевой Host-rule добавлять ТОЛЬКО ПОСЛЕ flip DNS (иначе LE HTTP-01 упадёт на RUVDS → rate-limit). # # Runtime egress (наружу из proxy-сети): mssql.kzntsv.site:1433, minio.kzntsv.site:443, # imgproxy.kzntsv.site:443, smtp.yandex.ru:465 (форма callback-order). # # Секреты — env на VDS (Portainer stack env), НЕ в образ, НЕ в git. Значения ${...} инжектит Portainer # из stack-переменных (те же 8 общего snolla-тенанта, verbatim из labtools/tandemmebel). Контракт # (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: kupimknigi: container_name: kupimknigi image: registry.kzntsv.site/kupimknigi:9608ff6 # git-sha victor/kupimknigi.spb.ru (snolla 0.42.0 / core 0.24.0 / data 0.14.1) 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 на robots.txt) # --- 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.kupimknigi.entrypoints: websecure # CUTOVER 2026-07-05: DNS kupimknigi.spb.ru флипнут на VDS (89.253.255.94) оператором (reg.ru). # Проверено ОБА авторитетных reg.ru-NS (ns1+ns2) согласованно → 89.253.255.94 (было 80.64.31.36 RUVDS). # Боевой хост (БЕЗ www — мёртв). staging-хост kupimknigi.vds.kzntsv.site УБРАН post-cutover. # RUVDS IIS 80.64.31.36 — rollback (revert DNS), не тронут. traefik.http.routers.kupimknigi.rule: Host(`kupimknigi.spb.ru`) traefik.http.routers.kupimknigi.tls.certresolver: letsEncrypt traefik.http.services.kupimknigi.loadbalancer.server.port: "5000" networks: proxy: external: true