From 9705468ef4b9ad6cbfedfd21ffa55de56a6b16ed Mon Sep 17 00:00:00 2001 From: vitya Date: Mon, 20 Jul 2026 11:47:59 +0300 Subject: [PATCH] feat(on-snolla): Portainer stack 22 source-of-truth (staging Host, mem_limit 512m, 8 env secrets) on.snolla.com snolla-app live behind traefik on staging Host on-snolla.vds.kzntsv.site. Image registry.kzntsv.site/on-snolla:473923e494db (snolla 0.42.1). Pending DNS cutover (reg.ru on.snolla.com A 80.64.31.36 -> 89.253.255.94, then PUT rule -> Host(on.snolla.com)). Co-Authored-By: Claude --- host-stacks/vds-kzntsv/on-snolla.compose.yml | 57 ++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 host-stacks/vds-kzntsv/on-snolla.compose.yml diff --git a/host-stacks/vds-kzntsv/on-snolla.compose.yml b/host-stacks/vds-kzntsv/on-snolla.compose.yml new file mode 100644 index 0000000..0f6a8ee --- /dev/null +++ b/host-stacks/vds-kzntsv/on-snolla.compose.yml @@ -0,0 +1,57 @@ +# on-snolla — посадочная on.snolla.com (snolla-app, 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.1) / core / liquid / data — читает БД-контент MoreThenCms +# (mssql.kzntsv.site) + server-side Liquid render. Ассеты из MinIO (minio.kzntsv.site). In-process sharp, +# delivery=serve-bytes, cache=local-variant. imgproxy в путях нет (как tandemmebel — сырой /imgproxy -> 404 норма). +# node-config: NODE_ENV=production -> default(dev,gitignored)+production.json+ENV-override. +# ЛЕНДИНГ (1 Page / + 2 StaticPages), БЕЗ блога/каталога/e-commerce. +# +# Образ собирается АДМИНОМ на VDS из victor/on.snolla.com/deploy/Dockerfile (build-arg VERDACCIO_TOKEN, +# @snollajs/* из verdaccio.kzntsv.site). Тег = git-sha репо on.snolla.com (текущий 473923e494db). +# Homepage render byte-identical прод-HTML (verified direct diff + completeness-gate 3/3 loc parity 2026-07-20). +# +# Домен: STAGING-Host on-snolla.vds.kzntsv.site (wildcard -> VDS). Cutover: flip DNS reg.ru -> 89.253.255.94, +# затем PUT rule -> Host(`on.snolla.com`), LE-серт issued on first hit. Прод-оракул до cutover = RUVDS IIS +# (80.64.31.36), жив, не тронут. Rollback = revert DNS -> 80.64.31.36 ИЛИ PUT стека назад на тег. +# +# Runtime egress: mssql.kzntsv.site:1433, minio.kzntsv.site:443 (оригиналы + variant-cache), smtp.yandex.ru:465. +# +# Секреты — env на VDS (Portainer stack env), НЕ в образ, НЕ в git. Значения ${...} инжектит Portainer +# из stack-переменных (переиспользованы verbatim из tandemmebel стека 20 — общая snolla-инфра). Контракт: +# DB_USER DB_PASSWORD IMGPROXY_KEY IMGPROXY_SALT S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY SMTP_USER SMTP_PASSWORD +# siteId=B9ECDB50-2B93-4CE5-B238-A9918B3F9CF7 — non-secret, в production.json (не env). Culture en. siteUrl=https://on.snolla.com + +services: + on-snolla: + container_name: on-snolla + image: registry.kzntsv.site/on-snolla:473923e494db # git-sha victor/on.snolla.com master 473923e494db (snolla 0.42.1). rollback-теги в registry: 473923e494db (:latest он же — первый deploy, отката пока нет, revert DNS -> RUVDS). + restart: unless-stopped + mem_limit: 512m # guardrail: snolla baseline ~100-200M; OOM -> restart. standalone-compose -> mem_limit (НЕ deploy.resources, swarm-only). + environment: + NODE_ENV: production + TZ: Europe/Moscow + # --- 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.on-snolla.entrypoints: websecure + # STAGING-RULE. Cutover: после flip DNS reg.ru -> 89.253.255.94 (verify авторит. NS) сменить на Host(`on.snolla.com`). + traefik.http.routers.on-snolla.rule: Host(`on-snolla.vds.kzntsv.site`) + traefik.http.routers.on-snolla.tls.certresolver: letsEncrypt + traefik.http.services.on-snolla.loadbalancer.server.port: "5000" + +networks: + proxy: + external: true \ No newline at end of file