diff --git a/cms-maljarka-https-mode-crash.md b/cms-maljarka-https-mode-crash.md new file mode 100644 index 0000000..24e94ca --- /dev/null +++ b/cms-maljarka-https-mode-crash.md @@ -0,0 +1,102 @@ +--- +title: CMS 502 при HTTPS-mode для конкретного hostname (maljarka.tandemmebel.ru) +type: concept +tags: [cms, iis, gotcha, url-rewrite, https] +sources: [] +updated: 2026-05-21 +--- + +# CMS 502 при HTTPS-mode для maljarka.tandemmebel.ru + +CMS код (или CMS DB config) для `maljarka.tandemmebel.ru` падает когда IIS request попадает с включённым HTTPS-context (`HTTPS=on`/`SERVER_PORT=443`). Тот же hostname работает (200 OK) когда request интерпретируется как plain HTTP. Другие cms hosts (`tandemmebel.ru`, `emspb.ru`, `pilorama98.ru` и т.д.) работают нормально в HTTPS-mode. + +## Симптом + +Через traefik HTTPS chain: +``` +GET https://maljarka.tandemmebel.ru/ → 502 Bad Gateway +``` + +## Bisect-trace + +| Direct backend request (внутри traefik container) | Headers | Result | +|---|---|---| +| `wget http://host.docker.internal:8089/ -H 'Host: maljarka.tandemmebel.ru'` | base | **200 OK** (43730 bytes, "Малярка от Тандеммебель") | +| same + `X-Forwarded-For: 1.2.3.4` | XFF only | **200 OK** | +| same + `X-Forwarded-Proto: https` | XFP=https | **502** ← триггер | +| same + ALL X-Forwarded-* | full | **502** | +| `Host: tandemmebel.ru` + XFP=https | sibling control | 301 (correct) | + +`X-Forwarded-Proto: https` — единственная переменная которая триггерит 502 для maljarka.tandemmebel.ru. + +## Mechanism + +После [[cms-server-port-leak-fix]] в `C:\sites\snolla\Web.config` добавлен URL Rewrite rule: + +```xml + + + + + + + + + + + + +``` + +Когда traefik проксит request через HTTPS entrypoint, он добавляет `X-Forwarded-Proto: https` (стандартное поведение). IIS URL Rewrite rule срабатывает → ставит `HTTPS=on` / `SERVER_PORT=443`. CMS код (`MoreThenCms.Web`) видит request как HTTPS. + +Для большинства hostname'ов CMS строит URLs корректно в HTTPS-context. Для `maljarka.tandemmebel.ru` — что-то падает (NullRef в URL builder, missing config, redirect loop, etc.) → ASP.NET unhandled exception → IIS возвращает 502. + +## Where to investigate (next session) + +1. **IIS Logs** — `C:\inetpub\logs\LogFiles\W3SVC*\` для site `snolla` — найти request с `Host: maljarka.tandemmebel.ru` + XFP=https → status code + sub-status. +2. **ASP.NET Event Log** — `eventvwr.msc` → Application log → ASP.NET 4.0 errors с stack trace. +3. **CMS DB** — table с per-host config (если есть field "https URL" / "base URL"); может для maljarka.tandemmebel.ru эта запись `NULL`/empty. +4. **CMS source** — grep по `siteRoot`, `BaseUrl`, `HttpsUrl` в коде CMS; искать где условие `IsSecureConnection` или `Request.IsHttps` ветвит логику. +5. **`Url.SiteRoot()`** — уже паттерн из [[cms-server-port-leak-fix]]; возможно тут другой helper падает specifically на этом host. + +## Workarounds + +### Workaround A: Strip X-Forwarded-Proto для maljarka в traefik (быстро, но скрывает CMS bug) + +В `maljarka.yml` добавить middleware: +```yaml +http: + routers: + maljarka: + ... + middlewares: [maljarka-strip-xfp] + middlewares: + maljarka-strip-xfp: + headers: + customRequestHeaders: + X-Forwarded-Proto: "" +``` + +Side effect: maljarka страница может содержать `http://...` asset links вместо `https://...` — mixed content warnings в браузере. + +### Workaround B: Per-host bypass в URL Rewrite rule + +В `C:\sites\snolla\Web.config` обновить rule: +```xml + + + + +``` + +Workaround C: hot-fix DB / Web.config с правильным базовым URL для maljarka.tandemmebel.ru (нужно исследование CMS). + +## Применено + +Не применено. Diagnosed only — fix отложен до CMS code investigation. Side-finding из [[traefik-maljarka-502-bug]]. + +## Ссылки + +- URL Rewrite rule origin: [[cms-server-port-leak-fix]] +- Other CMS-side 5xx bugs (паттерн): [[cms-admin-assets-root-folder-seed]] (другой NullRef), `emspb /admin/assets 500` (snapshot open issue #8). diff --git a/traefik-file-watch-wsl2-broken.md b/traefik-file-watch-wsl2-broken.md new file mode 100644 index 0000000..e393e17 --- /dev/null +++ b/traefik-file-watch-wsl2-broken.md @@ -0,0 +1,68 @@ +--- +title: Traefik file-watch broken under Docker Desktop Windows (WSL2 9p mount) +type: concept +tags: [traefik, docker-desktop, windows, gotcha, wsl2] +sources: [] +updated: 2026-05-21 +--- + +# Traefik file-watch broken под Docker Desktop Windows + +Traefik file provider's `watch: true` **не работает** для bind mounts из Windows host через Docker Desktop WSL2 9p (виртуальная файловая система). Изменения на disk **не доходят** до traefik. Config остаётся frozen на startup state до явного `docker restart traefik`. + +## Симптомы + +1. Rename `.yml → .yml.disabled` — route ОСТАЁТСЯ active в traefik runtime, продолжает отвечать. +2. Edit content of `.yml` — изменения не подхватываются, runtime использует старый snapshot. +3. New `.yml` файл в `/custom/` — игнорируется, route не добавляется. +4. `touch` обновление mtime — нет reload. +5. В logs (`--log.level=DEBUG`) — никаких "Configuration reloaded" сообщений. + +## Root cause + +Docker Desktop на Windows монтирует bind volumes через WSL2 9p protocol (`/run/desktop/mnt/host/c/...`). 9p **не пропагирует inotify events** — fsnotify watchers внутри контейнера не получают уведомлений об изменениях. Traefik file-watcher использует `fsnotify` → молчит. + +Это известная архитектурная проблема Docker Desktop Windows. Linux native Docker, Docker on macOS (через osxfs/virtiofs новый) — работают по-разному. + +## Подтверждение + +```powershell +# 1. Mount bind path inside traefik +docker inspect traefik --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}' +# Покажет: /run/desktop/mnt/host/c/... -> /custom/ <-- WSL2 9p + +# 2. Rename one yml to .disabled, проверить route ещё активный +docker exec traefik wget --header='Host: ' --spider https://traefik/ +# 200 OK даже после rename (т.к. config не перезагружен) + +# 3. После docker restart traefik — то же запрос вернёт 404 +docker restart traefik +docker exec traefik wget --header='Host: ' --spider https://traefik/ +# 404 ✅ +``` + +## Последствия + +- **Любое изменение в `/custom/*.yml` требует `docker restart traefik`.** +- Atomic revert: backup .yml → restart → rollback означает restore + restart. +- "Hot reload" workflow невозможен под этой config'ом — нужно или native Linux Docker, или migrate на docker provider via labels (отдельные изменения сразу видны через container restart events). + +## Workarounds + +1. **Always restart traefik after config changes** — single source of truth для team is restart, не file-edit. Документировать. +2. **Periodic auto-restart** — cron внутри traefik container (`docker exec traefik `), e.g. каждый час. Кustомные disruption для уже работающих routes. +3. **Migrate to docker provider** (labels) — labels на сервисах меняются вместе с container restart, traefik догоняет docker events корректно. Big migration работа. +4. **Use traefik file provider's `pollInterval`** — НЕ поддерживается в file provider (только в HTTP provider). Не вариант. +5. **Move traefik в WSL native** — запускать traefik внутри WSL2 distro (Ubuntu), mount /etc/traefik внутри WSL native fs, traefik видит inotify нормально. Требует переезд compose stack в WSL. + +## Применено + +[`traefik-maljarka-502-bug`](../../.tasks/traefik-maljarka-502-bug.md) — обнаружено при debugging. После рестарта traefik 2026-05-21: +- 2 dead routes (sestech, ics-artmaterials) реально 404'нулись (до restart были active despite .disabled rename). +- maljarka 502 не ушло — другая root cause (CMS-side HTTPS-mode crash для maljarka.tandemmebel.ru, см. cms-maljarka-https-mode-bug если создана). + +## Ссылки + +- Docker Desktop Windows mount perf: https://docs.docker.com/desktop/windows/wsl/ +- fsnotify limitations: https://github.com/fsnotify/fsnotify/issues/611 (9p/WSL2) +- Setup на этом стэке: [[traefik-on-windows-docker-desktop]]