From 494b101067347f6a09fac78cebccf53e86c0c40d Mon Sep 17 00:00:00 2001 From: vitya Date: Fri, 31 Jul 2026 06:15:29 +0300 Subject: [PATCH] feat(maljarka): restore maljarka.tandemmebel.ru as 7th snolla site on VDS (stack 23) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сайт потерян при 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 --- .tasks/STATUS.md | 3 + .wiki/concepts/maljarka-vds-deploy-runbook.md | 61 +++++++++++++++++++ .wiki/index.md | 1 + host-stacks/vds-kzntsv/maljarka.compose.yml | 59 ++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 .wiki/concepts/maljarka-vds-deploy-runbook.md create mode 100644 host-stacks/vds-kzntsv/maljarka.compose.yml diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index ab50150..30ef00e 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,5 @@ # Admin Task Board +_Updated: 2026-07-31 — 🟢 **[maljarka-vds-restore] CLOSED.** `maljarka.tandemmebel.ru` восстановлен как 7-й сайт тиража snolla на VDS. Сайт был потерян 2026-07-21 при декоммишне RUVDS IIS (единственный публичный хост maljarka; в v3 тираж не входила, осталась на RUVDS). DNS перебросили на VDS, но `Host()`-правила + snolla-app с siteId `A2476738` не было → traefik 404. Аудит 21.07 «VDS=200» = false-positive с локального IIS воркстейшна. **Контент цел** в shared `MoreThenCms` DB (5 Pages, 4 StaticPages, тема Reversal `4881FC7F` уже в MinIO themes bucket). Восстановление = клон `victor/on.snolla.com` → `victor/maljarka.tandemmebel.ru` (snolla 0.43.2/aws-sdk v3), swap siteId `A2476738`+siteUrl, `layout.liquid` **byte-identical** рендеру локального .NET-admin (43730B, sha256 match, `{{ item.content }}` inline — content пуст), error-страницы Reversal-бренд. Build на VDS (`7f03d67`, digest df4e3642, regen yarn.lock под переименованный workspace), throwaway-staging :5081 gate GREEN (byte-parity `/`, 4 staticpages 200 sizes==DB, theme asset 200 103320B, unpublished 404 parity), Portainer стек **Id 23** (node create-stack, НЕ PS — кириллица), env 8/8 shared, mem_limit 512m, `Host(maljarka.tandemmebel.ru)`. DNS уже VDS → LE issued on first hit (CN=maljarka.tandemmebel.ru, YR1, до 2026-10-29). Live smoke GREEN: `/` 200 43730B byte-identical, title «Малярка от Тандеммебель», 4 staticpages 200, theme asset 200, robots/sitemap 200. **Тираж 7/7**: labtools(17)/emspb(18)/labtools-pro(19)/tandemmebel(20)/kupimknigi(21)/on-snolla(22)/maljarka(23). Runbook: `maljarka-vds-deploy-runbook`. Rollback = образ-тег в registry (RUVDS DECOMM, не DNS)._ _Updated: 2026-07-20 (2) — 🟢 **[snolla-local-admin-restore] CLOSED.** Локальный .NET-админ поднят: selective tar-copy `C:\sites\snolla\` ~100MB с RUVDS (исключил stale App_Data 8.76GB — assets/galleries/themes теперь в MinIO), Web.config уже → `mssql.kzntsv.site,1433` Catalog=MoreThenCms (user `snolla`) + MinIO S3 drop-in (ключи реальные, placeholder_count=0). Elevated setup `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1` (ASCII-only, PS5.1 BOM-less-safe): AppPool `snolla` (.NET v4.0, AppPoolIdentity, recycle@200MB), IIS site `*:80` catch-all, ACL `IIS AppPool\snolla:(OI)(CI)(M)`, hosts-override `127.0.0.1 <6 aliases>.snolla.com`, FW block inbound 80. Smoke GREEN: `tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com/admin/account/login` → 200, реальная MoreThenCms-логинформа (`SNOLLA`, `
`). **Unblocks [on-snolla-vds-migration]** (Task B — админ для контент-инспекции готов). МинIO upload-acceptance = ручной follow-up оператора. RUVDS SSH через plink `-hostkey SHA256:r/vSKU5WzH4B8T7RiXyXlg0D8XZ9hlBxzmdrPzuPWzE` (креды `pass show ruvds-iis/full-env`)._ _Updated: 2026-07-20 — ⚪ **заведены [snolla-local-admin-restore] + [on-snolla-vds-migration].** Design: `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md`. **Task A:** восстановить локальный .NET-админ (catch-all IIS `snolla`, снесён 2026-06-08 при decommission) копированием `C:\sites\snolla\` с RUVDS (текущий прод-админ с MinIO drop-in), conn→`mssql.kzntsv.site:1433` Catalog=MoreThenCms, доступ `.snolla.com/admin` через hosts-override (1 AppPool, 6 адресов: tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on). **Task B** (blocked by A): мигрировать посадочную on.snolla.com (siteId `B9ECDB50-2B93-4CE5-B238-A9918B3F9CF7`, alias `on`, «Internal Site», culture `en`) с RUVDS IIS на VDS как Node snolla-app 0.42.1, реконструируя Liquid-шаблоны из боевого сайта+админки (исходников нет). Addresses + siteIds извлечены из `MoreThenCms` DB read-only (tedious-проб, SA из `pass mssql-vds/sa-password`, скрипт в `.tmp/dbprobe-sites.mjs` gitignored). Развилка адресации confirmed оператором: catch-all `*:80` + hosts (не per-port)._ _Updated: 2026-07-13 — 🟢 **[tandemmebel-web-vds-deploy] in-place template bump 8df10ee LIVE.** Ops-handoff от tandemmebel-сессии (inbox-запрос): убрать FB/Twitter/Google+ share-кнопки (extremist-icon compliance РФ), оставить ВК+Одноклассники. Коммит `8df10ee` в `victor/tandemmebel.ru` master (template-only, `apps/web/views/social_buttons.liquid`, 1 file 12 deletions, snolla pin 0.42.1 НЕ менялся). **Верификация перед сборкой поймала расхождение:** записка утверждала live=`ed96b18`/0.42.0, фактически на проде крутился `0cd9351`/0.42.1 (in-place bump 2026-07-12). gitea compare `0cd9351...8df10ee` = `total_commits:1` → фикс ровно один коммит поверх 0.42.1 (правильная база), yarn.lock идентичен → регрессии sitemap 184→172 нет. Собрал `tandemmebel:8df10ee` на VDS (чистый архив 8df10ee из gitea API, build-arg VERDACCIO_TOKEN=books-ci JWT, digest `sha256:30a7e5ab82f2bf371042f1b5fa0cd7ac5ceda71379d1da59e148dee8166bd560`, layer-cache hit, push OK). Throwaway-staging :5020 → completeness-gate GREEN: sitemap NEW==PROD **184=184 identical** (0 prod-only/new-only), self-consistency 183×200+1×404(/articles benign parity staging==prod), share-block staging vk+ok/fb-tw-gp=0 vs prod-before vk+ok+fb+tw+gp (доказательство — фикс убирает ровно лишнее). Swap стека 20 (Portainer JWT, PUT `/api/stacks/20?endpointId=1`, env 8/8 preserve, `prune:false`, `pullImage:true`), контейнер healthy ~8s. **Live-smoke С VDS GREEN:** robots/`/`/sitemap 200, /articles 404 parity, sitemap 184 locs, 4 share-block страницы (project-post ×2, /furniture/bedrooms, /furniture/kitchens/classic) все 200 → **vk+ok на месте, fb/tw/gp=0** (экстремистские иконы УБРАНЫ с прода), TLS-серт CN=tandemmebel.ru не дёрнут (in-place swap). `/galleries/` нет на 0.42.1 (sitemap-реструктуризация 0.42.x → gallery рендерится на project-post роуте). Rollback = PUT стека 20 назад на `0cd9351` (0.42.1, {% order %} fix, template-only чистый откат) / `ed96b18` (0.42.0, в registry, стёрт с VDS при disk-cleanup 2026-07-13) / `b02ca18` / revert DNS→80.64.31.36. Source-of-truth compose `host-stacks/vds-kzntsv/tandemmebel.compose.yml` актуализирован (8df10ee + LIVE-комменты + история bump'ов). Hygiene-заметка: Portainer stack 20 file несёт устаревшие STAGING-комменты на строках 16-17/53 (rule line 55 уже LIVE) — косметика, не трогал при деплое. Ответ отправлен в tandemmebel inbox._ @@ -52,6 +53,8 @@ _Updated: 2026-05-26 — заведена `bookva-tenant-cutover-prep` ⚪ (7-st _Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user decision — 9/24 hostnames live на RUVDS, source IIS оставлен running. `migrate-elasticsearch-to-books-vds` 🟢 closed ранее сегодня. 16 IIS hostnames + LE renewal pipeline + decommission — descoped в Closure note, не отдельные tracker tasks.)_ +## 🟢 [maljarka-vds-restore] — closed 2026-07-31 — maljarka.tandemmebel.ru восстановлен как 7-й сайт тиража snolla на VDS. Per-task/runbook: `maljarka-vds-deploy-runbook.md`. .NET MoreThenCms tenant (Reversal, siteId `A2476738`) потерян при decomm RUVDS 2026-07-21 → восстановлен Node snolla-app 0.43.2 на VDS (стек 23). `victor/maljarka.tandemmebel.ru` @ `7f03d67`, layout.liquid byte-identical .NET-admin рендеру. LE issued. Live GREEN. + ## 🟢 [snolla-local-admin-restore] — closed 2026-07-20 — локальный .NET-админ (catch-all IIS `snolla`) поднят с RUVDS, `/admin` для тиража+on.snolla.com. Per-task: `snolla-local-admin-restore.md`. Selective tar-copy ~100MB (НЕ 8.76GB, исключил stale App_Data assets/galleries/themes). Web.config уже на mssql.kzntsv.site+MinIO (repoint не нужен, ключи реальные). Elevated setup: `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1`. Smoke GREEN: 6 адресов `/admin/account/login` → 200 (tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on), реальная MoreThenCms-логинформа. unblocks `on-snolla-vds-migration`. ## 🟢 [on-snolla-vds-migration] — on.snolla.com (siteId B9ECDB50…) с RUVDS IIS → VDS Node snolla-app 0.42.1, реконструкция шаблонов из боевого+админки. Per-task: `on-snolla-vds-migration.md`. Design: `../.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` §Task B. ⚪ ready, blocked by `snolla-local-admin-restore`. diff --git a/.wiki/concepts/maljarka-vds-deploy-runbook.md b/.wiki/concepts/maljarka-vds-deploy-runbook.md new file mode 100644 index 0000000..3880d39 --- /dev/null +++ b/.wiki/concepts/maljarka-vds-deploy-runbook.md @@ -0,0 +1,61 @@ +--- +title: maljarka.tandemmebel.ru snolla-app — VDS deploy runbook (restore 2026-07-31) +type: concept +tags: [maljarka, tandemmebel, snolla, vds, deploy, docker, portainer, traefik, runbook, migration, landing, ruvds-decomm] +related: [[../entities/vds-kzntsv], [on-snolla-vds-deploy-runbook], [tandemmebel-vds-deploy-runbook], [morethencms-null-settingsdata-https-502], [snolla-local-admin-and-on-snolla-migration-design]] +updated: 2026-07-31 +--- + +# maljarka.tandemmebel.ru → VDS deploy runbook (restore) + +Восстановление лендинга `maljarka.tandemmebel.ru` («Малярка от Тандеммебель», snolla-app `@snollajs/snolla` **0.43.2** / aws-sdk v3, server-side Liquid) — **7-й сайт тиража snolla на VDS**. Паттерн = [[on-snolla-vds-deploy-runbook]] (прецедент: тоже лендинг с RUVDS catch-all origin, 1 Page `/` + empty content + StaticPages, реконструкция layout.liquid). + +## Почему восстанавливали (root cause) + +maljarka была **.NET MoreThenCms tenant** (тема «Reversal», siteId `A2476738-E26C-49D5-95AD-958F42DCCDD0`), служила на **RUVDS IIS catch-all** (`80.64.31.36`). В v3 тираж (6 Node snolla-app сайтов, 2026-07-30) **не входила** — осталась на RUVDS. **RUVDS декоммишнен 2026-07-21** ([[../entities/ruvds-iis-host]] §DECOMM, погашен у провайдера) → maljarka потеряла единственный публичный хост. DNS перебросили на VDS (CNAME → `tandemmebel.ru` → `89.253.255.94`), но `Host()`-правила и snolla-app с siteId `A2476738` на VDS не было → traefik 404. Аудит 21.07 «maljarka VDS=200» = **false-positive** с локального IIS воркстейшна (local .NET-admin catch-all поднят 20.07, LAN-DNS отдавал его; memory `workstation-lan-dns-serves-local-cms-copy`). Контент в shared `MoreThenCms` DB (`mssql.kzntsv.site`) остался цел — восстанавливаемо. + +## Артефакты +- **Код:** `victor/maljarka.tandemmebel.ru` @ `7f03d67` (apps/web, snolla 0.43.2). Клон `victor/on.snolla.com` (lean-база: 4 view-файла, root `package.json` v3 resolutions). `deploy/Dockerfile` (multi-stage node:22-slim, `yarn install --immutable`, non-root, healthcheck `/robots.txt`). +- **Образ:** `registry.kzntsv.site/maljarka:7f03d67` (+`:latest`), digest `sha256:df4e3642…`. Имя **`maljarka`** (= стек/контейнер). Собран НА VDS (обход traefik-499). +- **Стек Portainer:** `maljarka` (**Id 23**, endpoint 1). Source-of-truth compose: `admin/host-stacks/vds-kzntsv/maljarka.compose.yml`. +- **siteId:** `A2476738-E26C-49D5-95AD-958F42DCCDD0` (non-secret, в `production.json` + `default.json`). +- **siteUrl:** `https://maljarka.tandemmebel.ru`. +- **Runtime env (8 секретов):** `DB_USER DB_PASSWORD IMGPROXY_KEY IMGPROXY_SALT S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY SMTP_USER SMTP_PASSWORD` — Portainer stack env (переиспользованы verbatim из tandemmebel стека 20 — общая snolla-инфра). НЕ в образе, НЕ в git. +- **mem_limit:** `512m`. + +## Site model (MoreThenCms DB, siteId A2476738) +- 5 Pages (intro/services/portfolio/about/contacts), но **Published=true только `/`** (content пуст — лендинг baked в теме) → sitemap = 1 loc `/`. +- 4 StaticPages (all published, sitemap=false): `/index.html` (18401B), `/portfolio-single.html` (1336B), `/portfolio-single-gallery.html` (1567B), `/portfolio-single-video.html` (822B) — отдаются snolla из DB verbatim. +- 2 Domains rows (→ robotsTxt-гоча НЕ applies, `app.locals.domain` set; index.js null-guard остался как defensive). +- SettingsData `httpSecure` блок на месте (fix 2026-06-08, [[morethencms-null-settingsdata-https-502]]). +- Тема «Reversal» `4881FC7F` → MinIO bucket `themes` prefix `4881fc7f52034f8eb371fe5637b1cce1/` (78 файлов, УЖЕ была в MinIO — заливать не понадобилось). + +## Реконструкция шаблонов +- `views/layout.liquid` = **byte-identical** рендеру локального .NET-admin (`curl --noproxy '*' --resolve maljarka.tandemmebel.ru:80:127.0.0.1`, 43730B). `{{ item.content }}` вставлен **inline** после последней `` (content пуст → empty output → byte-parity сохранён). +- `error_404.liquid` / `error_500.liquid` — Reversal-тема + maljarka-бренд (вместо on.snolla SNOLLA-бренда). +- Источник реконструкции = локальный catch-all IIS `snolla` ([[snolla-local-admin-and-on-snolla-migration-design]] §Task A) — тот же MoreThenCms DB + та же тема. + +## Deploy 2026-07-31 (DNS уже на VDS — без DNS-flip-шага) +1. **Репо:** `victor/maljarka.tandemmebel.ru` создан на gitea (API, admin-token). Клон on.snolla.com → swap `production.json` (siteId A2476738, siteUrl, appName) + package names → `yarn install` (regen lockfile под переименованный workspace) → push. SHA `ebebe4e` → `7f03d67` (lockfile). +2. **Build на VDS:** `git archive 7f03d67` → scp → `~/build/maljarka` → `docker build -f deploy/Dockerfile --build-arg VERDACCIO_TOKEN=` → `registry.kzntsv.site/maljarka:7f03d67`(+latest). Guard: `config/default.json` ABSENT в архиве (.dockerignore), snolla 0.43.2, `yarn install --immutable` GREEN (lockfile перегенерён под maljarka workspace). Push OK. +3. **Throwaway-staging :5081** из env live tandemmebel-контейнера (8 секретов, `--network proxy`). Healthy. **Completeness-gate С VDS GREEN:** `/` **byte-identical** oracle (sha256 `64011be6…`, 43730B), robots 200, sitemap-pages-1 1 loc `/` (+ пустой blog-index — benign parity, как on-snolla `/c`), 4 staticpages 200 (sizes == DB clen), theme asset `bootstrap.min.css` 200 103320B (MinIO Reversal подтверждена), unpublished /about/services/contacts/intro → 404 (parity). 0 регрессий. +4. **Portainer стек 23** создан node-скриптом `create-maljarka-stack.mjs` (JWT auth, **НЕ PS** — кириллица compose; memory `ps51-iso8851-corrupts-portainer-stackfile`), env 8/8, `mem_limit 512m`, `Host(\`maljarka.tandemmebel.ru\`)`. DNS уже `89.253.255.94` → **LE-серт issued on first hit**: CN=maljarka.tandemmebel.ru, issuer YR1, until 2026-10-29. +5. **Live smoke GREEN:** `/` 200 43730B byte-identical, `Малярка от Тандеммебель`, 4 staticpages 200 (sizes == DB), theme asset 200, robots/sitemap 200, TLS LE. Log чист. + +## Гочи +- **yarn.lock workspace-rename** — переименование root package (`on.snolla.com`→`maljarka.tandemmebel.ru`) и `apps/web` name (`@on-snolla/web`→`@maljarka/web`) требует regen yarn.lock, иначе `yarn install --immutable` падает (lockfile ссылается старые workspace-дескрипторы). Fix: `yarn install` локально под vitya JWT → commit обновлённого lockfile. +- **workstation-curl отравлен локальным HTTP-прокси** — `--resolve` игнорируется прокси (CONNECT), обе пробы уходят на VDS. External verify prod-maljarka с воркстейшна = только через VDS-ssh curl (или `curl --resolve :443:89.253.255.94 --noproxy`, но прокси всё равно может перехватить). Локальный IIS-рендер для реконструкции — через `--noproxy '*' --resolve :80:127.0.0.1`. +- **hosts override на воркстейшне** — Task A оставил hosts-override для .snolla.com (НЕ maljarka), но local IIS `*:80` catch-all + LAN-DNS могут перехватить. Оракул-рендер снимался явно через 127.0.0.1. +- **robotsTxt-гоча НЕ applies** — у maljarka 2 Domains rows (`app.locals.domain` set). index.js null-guard (из on.snolla) остался как defensive, не вредит. +- **RUVDS DECOMM** — rollback только образ-тегом в registry, НЕ DNS (RUVDS погашен 2026-07-21). + +## Rollback +- **Образный:** PUT стека 23 назад на предыдущий тег в registry. С первого deploy ведём rollback-теги (пока только `7f03d67` = `:latest`). +- DNS-rollback НЕ доступен (RUVDS DECOMM). +- Если layout сломан: revert Host-правила (вернёт 404) ИЛИ поправить `layout.liquid` + rebuild. + +## Связанное +- Тираж snolla на VDS теперь **7/7**: labtools.ru(17) / emspb(18) / labtools.pro(19) / tandemmebel(20) / kupimknigi(21) / on-snolla(22) / **maljarka(23)**. +- Прецедент-паттерн: [[on-snolla-vds-deploy-runbook]] (лендинг, реконструкция из .NET-admin рендера). +- 502-на-HTTPS fix (RUVDS-эпоха, 2026-06-08): [[morethencms-null-settingsdata-https-502]]. +- Локальный .NET-admin (источник реконструкции): [[snolla-local-admin-and-on-snolla-migration-design]] §Task A. \ No newline at end of file diff --git a/.wiki/index.md b/.wiki/index.md index f65621c..5957db7 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -38,6 +38,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [labtools-vds-deploy-runbook](concepts/labtools-vds-deploy-runbook.md) — labtools.ru snolla-app на VDS (стек 17): сборка/env/cutover 07-02 (Yandex DNS!) + **0.42.1 in-place bump 07-05** (образ `labtools:566d41c`, order-фикс + sitemap починен) - [labtools.pro-vds-deploy-runbook](concepts/labtools.pro-vds-deploy-runbook.md) — labtools.pro snolla-каталог на VDS (стек 19): сборка/env/cutover 07-02 + **0.42.1 in-place bump 07-05** (образ `labtools-pro:0610432`, order-парити 3 секции) - [tandemmebel-vds-deploy-runbook](concepts/tandemmebel-vds-deploy-runbook.md) — tandemmebel.ru snolla-блог-портфолио на VDS (стек 20): cutover 07-12 (DNS reg.ru, LE) + **0.42.1 in-place bump 07-12** (образ `tandemmebel:0cd9351`, 184/184 parity, /articles 404 benign) +- [maljarka-vds-deploy-runbook](concepts/maljarka-vds-deploy-runbook.md) — maljarka.tandemmebel.ru snolla-лендинг на VDS (стек 23): restore 2026-07-31 (потерян при decomm RUVDS 2026-07-21, не был в v3 тираже). Клон on.snolla.com, siteId A2476738, layout.liquid byte-identical .NET-admin рендеру (43730B). Тираж 7/7 - [minio-imgproxy-on-vds](concepts/minio-imgproxy-on-vds.md) — MinIO+imgproxy stack на VDS, миграция с upgrade 2020→2025 + DNS swap pending - [minio-split-cutover-runbook](concepts/minio-split-cutover-runbook.md) — разнос MinIO-контента: Track A books-vds 2020→2025 (shared+bookva) + Track B CMS-медиа → vds 2025. Progress: B1 миррор✅ B2 DNS-flip✅ B3 on-snolla v2-пилот✅ LIVE, B3v3 (snolla 0.43.2 опубликована, live verify ЗЕЛЁНЫЙ, resolutions optional) ⚡READY, B4/B5/Track A TODO. v3 — конечная цель. - [morethencms-null-settingsdata-https-502](concepts/morethencms-null-settingsdata-https-502.md) — MoreThenCms тенант с `Sites.SettingsData=NULL` → 502 только на HTTPS (нет `httpSecure` → KeyNotFound); fix = UPDATE + recycle. maljarka 2026-06-08 diff --git a/host-stacks/vds-kzntsv/maljarka.compose.yml b/host-stacks/vds-kzntsv/maljarka.compose.yml new file mode 100644 index 0000000..6df6fa2 --- /dev/null +++ b/host-stacks/vds-kzntsv/maljarka.compose.yml @@ -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 \ No newline at end of file