feat(maljarka): restore maljarka.tandemmebel.ru as 7th snolla site on VDS (stack 23)

Сайт потерян при decomm RUVDS 2026-07-21 (.NET MoreThenCms tenant, не был в v3 тираже).
Восстановлен как Node snolla-app 0.43.2 на VDS: victor/maljarka.tandemmebel.ru @7f03d67,
layout.liquid byte-identical рендеру локального .NET-admin (43730B, sha256 match),
siteId A2476738, Reversal тема из MinIO. LE issued. Live smoke GREEN.

- host-stacks/vds-kzntsv/maljarka.compose.yml (source-of-truth, stack 23)
- .wiki/concepts/maljarka-vds-deploy-runbook.md (калька on-snolla runbook)
- .tasks/STATUS.md + .wiki/index.md updated
- тираж snolla теперь 7/7: labtools(17)/emspb(18)/labtools-pro(19)/tandemmebel(20)/kupimknigi(21)/on-snolla(22)/maljarka(23)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-31 06:15:29 +03:00
parent 18c27ab8f5
commit 494b101067
4 changed files with 124 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
# maljarka — прод-лендинг maljarka.tandemmebel.ru (snolla-app, server-side Liquid, node) на vds-kzntsv (89.253.255.94).
#
# 7-й сайт тиража snolla на VDS. Source-of-truth этого compose — admin-репо; применяется через
# Portainer API/UI (VDS-rule: стеки через Portainer, не ssh+compose).
#
# Модель: монолит @snollajs/snolla (0.43.2) / aws-sdk v3 — читает БД-контент MoreThenCms
# (mssql.kzntsv.site) для siteId A2476738 + server-side Liquid render (Reversal тема 4881fc7f).
# Ассеты темы из MinIO (minio.vds.kzntsv.site) bucket `themes`. Лендинг: 1 published Page `/`
# (content пуст — вёрстка baked в layout.liquid, byte-identical рендеру .NET-admin) + 4 StaticPages.
#
# Образ собирается АДМИНОМ на VDS из victor/maljarka.tandemmebel.ru/deploy/Dockerfile (build-arg
# VERDACCIO_TOKEN, @snollajs/* из verdaccio.kzntsv.site). Тег = git-sha монорепы (текущий 7f03d67).
#
# Домен: LIVE — maljarka.tandemmebel.ru (cert LE HTTP-01, issued on first hit 2026-07-31).
# DNS = CNAME → tandemmebel.ru → 89.253.255.94 (на VDS с decomm RUVDS 2026-07-21).
# Сайт потерян при декоммишне RUVDS IIS (единственный публичный хост maljarka), восстановлен
# тиражом как Node snolla-app. RUVDS более не rollback-target (погашен у провайдера).
# Предыстория: жил на RUVDS IIS catch-all (80.64.31.36), 502-на-HTTPS пофикшен 2026-06-08
# (SettingsData httpSecure блок, [[morethencms-null-settingsdata-https-502]]).
#
# Runtime egress (наружу из proxy-сети): mssql.kzntsv.site:1433, minio.vds.kzntsv.site:443,
# smtp.yandex.ru:465. imgproxy НЕ нужен (in-process sharp serve-bytes).
#
# Секреты — 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=A2476738-E26C-49D5-95AD-958F42DCCDD0 — non-secret, в production.json (не env). Culture ru-RU. siteUrl=https://maljarka.tandemmebel.ru
services:
maljarka:
container_name: maljarka
image: registry.kzntsv.site/maljarka:7f03d67 # git-sha victor/maljarka.tandemmebel.ru master 7f03d67 (snolla 0.43.2 / aws-sdk v3 — первый deploy 2026-07-31, 7-й сайт тиража; реконструкция Reversal-лендинга из MoreThenCms DB). rollback-теги: ведутся с этого deploy.
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.maljarka.entrypoints: websecure
traefik.http.routers.maljarka.rule: Host(`maljarka.tandemmebel.ru`)
traefik.http.routers.maljarka.tls.certresolver: letsEncrypt
traefik.http.services.maljarka.loadbalancer.server.port: "5000"
networks:
proxy:
external: true