Восстановление лендинга maljarka.tandemmebel.ru («Малярка от Тандеммебель», snolla-app @snollajs/snolla0.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) остался цел — восстанавливаемо.
Образ: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).
Build на VDS:git archive 7f03d67 → scp → ~/build/maljarka → docker build -f deploy/Dockerfile --build-arg VERDACCIO_TOKEN=<vitya JWT> → 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.
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 регрессий.
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.
Live smoke GREEN:/ 200 43730B byte-identical, <title>Малярка от Тандеммебель</title>, 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).