From 2811b5a180aaedd750418e8b965cbb42bdaaad1c Mon Sep 17 00:00:00 2001 From: vitya Date: Mon, 8 Jun 2026 12:47:46 +0300 Subject: [PATCH] fix(iis-migration): maljarka.tandemmebel.ru 502-on-HTTPS resolved Root cause (NOT a migration defect): MoreThenCms tenant `maljarka` had `dbo.Sites.SettingsData = NULL` (no `httpSecure` block) -> on a real HTTPS request SnollaMiddleware throws KeyNotFoundException -> 502. HTTP served 200 fine. DNS/TLS/IIS binding all correct. Fix applied to shared MSSQL (mssql.kzntsv.site): UPDATE Sites set SettingsData with httpSecure{enableHttps:true,...} + recycle snolla pool. Verified 443->200 server-local and external via 80.64.31.36; kupimknigi untouched. Audit: maljarka was the only NULL-settings site with a :443 binding (of 25); rimiz degraded for another reason. - new concept: morethencms-null-settingsdata-https-502 - entities/ruvds-iis-host: maljarka moved from Degraded -> fixed - index.md + log.md + STATUS.md + NEXT_SESSION.md updated Co-Authored-By: Claude Opus 4.8 (1M context) --- .tasks/NEXT_SESSION.md | 2 +- .tasks/STATUS.md | 1 + ...morethencms-null-settingsdata-https-502.md | 66 +++++++++++++++++++ .wiki/entities/ruvds-iis-host.md | 3 +- .wiki/index.md | 1 + .wiki/log.md | 2 + 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 .wiki/concepts/morethencms-null-settingsdata-https-502.md diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 08bd057..86890bd 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -31,7 +31,7 @@ _Сессия: (1) full DNS cutover на RUVDS достигнут; (2) подн - **Decommission `snolla` site** на windows-source — ждём soak (~2026-06-12) + drain кэша, или раньше? Когда решит: elevated PS → `Stop-Website snolla` → архив `C:\sites\snolla` (8.66 ГБ) → kreknin + cleanup temp SSH-ключей/FW-правил. (win-acme на RUVDS от этого не зависит — он самостоятелен.) -- `maljarka.tandemmebel.ru` 502 — чинить CMS-тенант отдельно? (pre-existing, не блокер; HTTPS-cert у него валиден). +- ✅ `maljarka.tandemmebel.ru` 502 — **решено 2026-06-08**. Корень: `dbo.Sites.SettingsData=NULL` у тенанта (нет `httpSecure`) → KeyNotFound в MoreThenCms на HTTPS-ветке. Fix: `UPDATE Sites SET SettingsData='{httpSecure:...}'` + recycle пула snolla; verified 443→200. См. `.wiki/concepts/morethencms-null-settingsdata-https-502.md`. (rimiz — отдельная причина, не трогали.) ## Не делать (preemptive guards) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 33a2c6b..68617d9 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,5 @@ # Admin Task Board +_Updated: 2026-06-08 — 🟢 ad-hoc fix `maljarka.tandemmebel.ru` (iis-migration follow-up): домен переехал на RUVDS корректно (DNS/TLS/IIS ок), но отдавал 502 **только на HTTPS**. Root cause не в миграции: у тенанта maljarka `dbo.Sites.SettingsData=NULL` (нет блока `httpSecure`) → MoreThenCms `SnollaMiddleware` бросает KeyNotFound на HTTPS-ветке → 502; по HTTP 200. Fix: `UPDATE dbo.Sites SET SettingsData='{httpSecure:enableHttps=true,…}' WHERE SiteId=a2476738… AND SettingsData IS NULL` + `Restart-WebAppPool snolla`. Verified maljarka:443→200 (server-local + external по 80.64.31.36), kupimknigi не задет. Audit: maljarka — единственный NULL-сайт с :443-биндингом из 25. rimiz degraded по др. причине. Concept: `.wiki/concepts/morethencms-null-settingsdata-https-502.md`._ _Updated: 2026-06-05 (вечер) — 🟡 `fix-nl-vds-reality-pq-dest`: по команде user применён server-side fix + ротация кредов. Reality dest intel→microsoft (x-ui.db + restart), сквозной тоннель через реальный :443 = HTTP 204; 32030 жив. Креды ротированы (root SSH / panel user+pass / panel secret-JWT — светились в плейнтексте; новые в `pass nl-vds-3xui/full-env`, старые отклоняются, БД-бэкап на сервере). Остался client-side: user меняет SNI в v2rayN (`pqmkayaxo2`→microsoft) + подтверждает → close._ _Updated: 2026-06-05 — заведена `fix-nl-vds-reality-pq-dest`. Новый NL VDS (213.176.64.253, 3x-UI/Xray 26.6.1): диагностирован отказ Reality-инбаунда 443 — **ML-DSA-65 (PQ) × dest `www.intel.com` (Akamai шлёт HRR)**; plain VLESS 32030 работает. Узел+root-cause в вики (`nl-vds-3xui`, `reality-pq-mldsa65-dest-incompatibility`); креды в `pass nl-vds-3xui/full-env`._ _Updated: 2026-05-31 — 🟢 `vehicles-loader-progress-deploy` **closed**: live-verify прогона Sun 31.05 06:21→07:53 MSK прошёл — progress-logging показывает движение по всем фазам (▶/батчи/✓/delete-sweep), НЕ тишина; exit 0; `importRun id=4 ok`, `reportJson errors:[]`. **Попутно найден+починен email-баг:** `STOSTAYER_MAIL_TO=site@stostayer.ru` (слалось само себе) → `vitya.kuznetsov@gmail.com` в host env (бэкап `.bak.20260531`); доставка на gmail подтверждена тест-письмом (`250 queued`). Follow-up'ы (не блокеры): units-фаза 1h31m на 100k rows = узкое место; generation `unmatched:51`; репо `config/default.json` дефолт `to` всё ещё site@ (прод перекрыт env)._ diff --git a/.wiki/concepts/morethencms-null-settingsdata-https-502.md b/.wiki/concepts/morethencms-null-settingsdata-https-502.md new file mode 100644 index 0000000..5c4f90f --- /dev/null +++ b/.wiki/concepts/morethencms-null-settingsdata-https-502.md @@ -0,0 +1,66 @@ +--- +title: MoreThenCms — NULL SettingsData → 502 на HTTPS (per-tenant) +type: concept +tags: [morethencms, cms, iis, ruvds, https, 502, mssql, multi-tenant] +sources: [../sources/iis-migration-to-ruvds-2026-05-23.md] +updated: 2026-06-08 +--- + +# MoreThenCms — пустой `Sites.SettingsData` ⇒ 502 на HTTPS + +## Симптом + +Один тенант catch-all CMS ([[ruvds-iis-host]], движок **MoreThenCms**) недоступен **только по HTTPS**, тогда как остальные живут: + +| | maljarka | рабочий тенант (kupimknigi) | +|---|---|---| +| `:80` (HTTP) | **200** | 200 | +| `:443` (HTTPS) | **502** Bad Gateway (пустое тело) | 200 | + +502 приходит с `Server: Microsoft-IIS/10.0`, `X-Powered-By: ASP.NET`, `Content-Length: 0`. В IIS-логе (`W3SVC1`) — `sc-status=502 sc-substatus=0 sc-win32-status=0` (managed-код, **не** HTTP.sys/ARR; ARR на хосте не установлен). + +## Root cause + +У сайта в БД `MoreThenCms` (`mssql.kzntsv.site,1433` → `dbo.Sites`) поле **`SettingsData` = NULL**. У рабочих сайтов там JSON с блоком: + +```json +"httpSecure": { "enableHttps": true, "httpsOnly": false, "forceHttpsRedirect": false, "forceHttpsApi": false, "forceHttpsAdministration": false } +``` + +На **HTTPS**-запросе `SnollaMiddleware` читает ключ `httpSecure`/`enableHttps` из настроек сайта. При NULL-настройках ключа нет → `KeyNotFoundException: The given key was not present in the dictionary` (`MoreThenCms.Owin.ErrorHandler.cs:line 61`) → middleware отдаёт **502 до** пайплайна (в логе видно `Begin invoke /` → сразу `End invoke /`, без `RedirectionsService`/рендера). По HTTP блок не читается → страница рендерится (200). + +Не зависит от хоста — данные в общей БД, поэтому симптом был идентичен и на старом home-IIS:8089. **Не дефект миграции.** + +## Диагностический след (как ловить) + +- Логи движка: `C:\Logs\MoreThenCms\log.YYYYMMDD.txt` (log4net). 502-запрос = `Begin invoke /` → `End invoke /` без промежуточных шагов; `KeyNotFoundException` в `Owin.ErrorHandler` (async-стек теряет исходный кадр — он не покажет конкретный словарь, не трать время). +- Воспроизводить **с самого сервера** против `127.0.0.1` (`curl.exe --resolve host:443:127.0.0.1`), чтобы исключить свой сетевой путь (дома трафик может уходить через VPN/прокси — см. [[proxy-debugging-test-the-real-client]]). +- Подключение к БД: строка `MoreThenCmsEntities` в `C:\sites\snolla\web.config` (EF-обёртка, `provider connection string=...`). `INFORMATION_SCHEMA.COLUMNS` под app-юзером может быть пуст — читать колонки из ридера (`GetName`), не из метаданных. + +## Fix + +Заполнить `SettingsData` сайта блоком `httpSecure` (структуру брать с рабочего sibling-сайта): + +```sql +UPDATE dbo.Sites +SET SettingsData = N'{ "httpSecure": { "enableHttps": true, "httpsOnly": false, + "forceHttpsRedirect": false, "forceHttpsApi": false, "forceHttpsAdministration": false } }' +WHERE SiteId = '' AND SettingsData IS NULL; -- гард: не затереть существующие настройки +``` + +Затем `Restart-WebAppPool snolla` (настройки сайта кэшируются в памяти w3wp). App-native альтернатива: в админке MoreThenCms (`/admin`) включить «HTTPS» в настройках сайта — пишет тот же блок. + +`httpsOnly/forceHttpsRedirect=false` ⇒ поведение HTTP не меняется, риск минимальный; откат = вернуть `SettingsData = NULL`. + +## Scope (audit 2026-06-08) + +На [[ruvds-iis-host]] из 25 SNI-биндингов :443 единственным сайтом с NULL-настройками был **maljarka** — пофикшен 2026-06-08. Прочие ~27 NULL-сайтов **не имеют :443-биндинга** (HTTP-only / неактивные домены) → этот баг их не заденет, пока кому-то не повесят HTTPS-биндинг. **Памятка:** при добавлении нового HTTPS-тенанта на этот CMS — проверить, что у его сайта `SettingsData` содержит `httpSecure`. + +> Не путать: `rimiz.ru`/www/`rimiz.snolla.com` тоже «degraded», но у них `SettingsData` заполнен — их 502/404 имеет **другую** причину (dead-routes контента), не этот баг. + +## Cross-refs + +- Хост: [[ruvds-iis-host]] +- БД-бэкенд: [[vds-kzntsv]] (MSSQL `mssql.kzntsv.site`) +- Сетевой анти-паттерн при диагностике: [[proxy-debugging-test-the-real-client]] +- Контекст миграции: [[../sources/iis-migration-to-ruvds-2026-05-23]] diff --git a/.wiki/entities/ruvds-iis-host.md b/.wiki/entities/ruvds-iis-host.md index 0131457..6ffc182 100644 --- a/.wiki/entities/ruvds-iis-host.md +++ b/.wiki/entities/ruvds-iis-host.md @@ -45,7 +45,8 @@ updated: 2026-05-24 - ⏳ 22 more in queue (`pilorama98.ru`/www, `labtools.ru`/www, `labtools.pro`/www, 12× `*.snolla.com`, `rimiz.ru`/www, `maljarka.tandemmebel.ru`, etc.) — pending DNS TTL drop в reg.ru (TTL=86400 пока) - ⛔ `tandemmebel.ru` / `www.tandemmebel.ru` — scope-narrowed 2026-05-24, остаются на windows-IIS на неопределённый срок -**Degraded (CMS-side, не migration defect):** `maljarka.tandemmebel.ru`, `rimiz.ru`/www, `rimiz.snolla.com` — возвращают 502/404 (pre-existing dead-routes от [[../sources/iis-host-migration-2026-05-19]] cleanup; на source IIS:8089 тоже не работают). +**Degraded (CMS-side, не migration defect):** `rimiz.ru`/www, `rimiz.snolla.com` — возвращают 502/404 (pre-existing dead-routes от [[../sources/iis-host-migration-2026-05-19]] cleanup; на source IIS:8089 тоже не работают). +- ✅ `maljarka.tandemmebel.ru` — **пофикшен 2026-06-08**: 502-на-HTTPS был из-за `Sites.SettingsData=NULL` (нет блока `httpSecure`) → `KeyNotFoundException` в MoreThenCms. Корень + fix: [[../concepts/morethencms-null-settingsdata-https-502]]. rimiz — **другая** причина (его `SettingsData` заполнен). ## Ключевые папки diff --git a/.wiki/index.md b/.wiki/index.md index 156c0da..a1da464 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -30,6 +30,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [hyper-backup-structure-and-recovery](concepts/hyper-backup-structure-and-recovery.md) — Hyper Backup — структура репо и стратегия восстановления - [iis-migration-2026-05-19-postmortem](concepts/iis-migration-2026-05-19-postmortem.md) — post-mortem миграции CMS на нативный IIS, 2026-05-19 - [minio-imgproxy-on-vds](concepts/minio-imgproxy-on-vds.md) — MinIO+imgproxy stack на VDS, миграция с upgrade 2020→2025 + DNS swap pending +- [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 - [mssql-container-data-restore](concepts/mssql-container-data-restore.md) — MSSQL контейнер с восстановленными production data — паттерн - [mssql-on-vds](concepts/mssql-on-vds.md) — MSSQL Express 2022 Linux на VDS — миграция + login orphan fix + traefik TCP gotchas - [ocis-on-vds-deploy-recipe](concepts/ocis-on-vds-deploy-recipe.md) — oCIS на VDS — deploy recipe + non-obvious gotchas (UID 1001 vs 1000, basic auth, LibreGraph user-create) diff --git a/.wiki/log.md b/.wiki/log.md index d2da929..a5d5686 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -2,6 +2,8 @@ Append-only log of wiki operations (ingests, promotions, lints, migrations). +## [2026-06-08] ingest | concepts/morethencms-null-settingsdata-https-502 — RCA+fix: `maljarka.tandemmebel.ru` отдавал 502 только на HTTPS (HTTP=200). Корень = `dbo.Sites.SettingsData=NULL` у тенанта maljarka (нет блока `httpSecure`) → `KeyNotFoundException` в `SnollaMiddleware`/`Owin.ErrorHandler` на HTTPS-ветке. Fix = `UPDATE dbo.Sites SET SettingsData='{httpSecure:...}'` + `Restart-WebAppPool snolla`; verified 443→200 server-local + external. Audit: maljarka — единственный NULL-сайт с :443-биндингом; rimiz degraded по другой причине. Обновлён [[../entities/ruvds-iis-host]]. Источник: live-диагностика 2026-06-08. + ## [2026-06-05] ingest | concepts/winacme-iis-owin-catchall-http01 — постоянный self-renewing LE pipeline на RUVDS IIS (win-acme v2.2.9, 25-SAN cert, SYSTEM scheduled task). Главное: OWIN-catch-all CMS жрёт `/.well-known/acme-challenge/` → решено отдельным IIS-приложением в пуле «No Managed Code» + патч шаблона `Web_Config.xml` (snять Owin-handler). Заменяет ручной [[traefik-acme-json-to-iis-cert-import]] для renewal'а; снимает зависимость RUVDS от домашнего traefik. Закрывает дедлайн cert-expiry 2026-07-22 (новый cert до 2026-09-03). Источник: `.tasks/iis-migration-to-ruvds.md` Decisions log 2026-06-05. ## [2026-05-28] ingest | concepts/es-destructive-delete-incident-2026-05-26 — RCA для удаления 3 user-индексов на canonical ES `elasticsearch.kzntsv.site` (books VDS stack 33) во время cutover-prep. Caller identity unrecoverable (audit log = X-Pack платный, traefik accessLog был выключен). 2 preventive controls applied + verified: ES env `action.destructive_requires_name=true` + traefik JSON accessLog. Источник: `.tasks/restore-elasticsearch-indices-books-vds.md` § Closure note.