Bisect через X-Forwarded headers: IIS+CMS возвращает 502 specifically для
Host: maljarka.tandemmebel.ru + X-Forwarded-Proto: https. Без XFP=https → 200.
URL Rewrite rule из cms-port-leak-fix ставит HTTPS=on/SERVER_PORT=443 → CMS
код для этого hostname падает в HTTPS-context. Same class как
emspb /admin/assets 500 NullRef, rimiz 404 — pre-existing CMS issues.
Side finding: traefik file-watch broken под Docker Desktop Windows (WSL2 9p
не пропускает inotify). Rename .yml → .disabled оставался без эффекта 38min
после изменения; только docker restart traefik подхватил. Это значит
iis-traefik-dead-routes-cleanup был фантомным до сегодняшнего restart 07:42 UTC.
2 новых wiki concepts: traefik-file-watch-wsl2-broken (workarounds) +
cms-maljarka-https-mode-crash (3 workarounds + 5 investigation places).
Новая follow-up ⚪ cms-maljarka-https-mode-bug-fix.
Final smoke post-restart: 7 live hosts ✅ Microsoft-IIS/10.0 без regression,
2 dead routes (sestech, ics-artmaterials) → 404 (cleanup теперь real).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bisect через X-Forwarded headers: IIS+CMS возвращает 502 specifically для
Host: maljarka.tandemmebel.ru + X-Forwarded-Proto: https. Без XFP=https → 200.
URL Rewrite rule из cms-port-leak-fix ставит HTTPS=on/SERVER_PORT=443 → CMS
код для этого hostname падает в HTTPS-context. Same class как
emspb /admin/assets 500 NullRef, rimiz 404 — pre-existing CMS issues.
Side finding: traefik file-watch broken под Docker Desktop Windows (WSL2 9p
не пропускает inotify). Rename .yml → .disabled оставался без эффекта 38min
после изменения; только docker restart traefik подхватил. Это значит
iis-traefik-dead-routes-cleanup был фантомным до сегодняшнего restart 07:42 UTC.
2 новых wiki concepts: traefik-file-watch-wsl2-broken (workarounds) +
cms-maljarka-https-mode-crash (3 workarounds + 5 investigation places).
Новая follow-up ⚪ cms-maljarka-https-mode-bug-fix.
Final smoke post-restart: 7 live hosts ✅ Microsoft-IIS/10.0 без regression,
2 dead routes (sestech, ics-artmaterials) → 404 (cleanup теперь real).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Renamed sestech.yml + isc-artmaterials.yml to .disabled (backups
.bak-pre-dead-routes-cleanup-2026-05-21). Traefik file-provider auto-reloaded,
no restart needed. 4 sibling live hosts (emspb, on.snolla, www.tandemmebel,
kupimknigi) → Microsoft-IIS/10.0 без regression.
maljarka оказался НЕ dead — yml route'ит maljarka.tandemmebel.ru (subdomain),
не голый maljarka.ru. DNS на наш IP, IIS backend 200 OK. Изначальная task'а
перепутала hostname. Side-finding: traefik HTTPS возвращает 502 для этого
subdomain (backend сам 200). Новая ⚪ task traefik-maljarka-502-bug.
Files renamed live в C:\Users\vitya\projects\docker\diskstation\traefik\data\
custom\ (вне репо) — поэтому в diff только task/wiki updates.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Soak passed: traefik Up 38h, w3wp 8.8h (scheduled IIS pool recycle ~29h, not crash).
HTTPS smoke 11 hostnames через full traefik chain — 8/8 наших sites вернули
Microsoft-IIS/10.0. 3 hostname'а оказались off-infra (DNS снят / parked / external
nginx) — не regression миграции, заведена follow-up ⚪ iis-traefik-dead-routes-cleanup.
Wiki: Phase 11 close-out section в sources/iis-host-migration-2026-05-19, log
ingest+decision entries.
VM snolla-recovery ready для savestate (waits user go).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Soak passed: traefik Up 38h, w3wp 8.8h (scheduled IIS pool recycle ~29h, not crash).
HTTPS smoke 11 hostnames через full traefik chain — 8/8 наших sites вернули
Microsoft-IIS/10.0. 3 hostname'а оказались off-infra (DNS снят / parked / external
nginx) — не regression миграции, заведена follow-up ⚪ iis-traefik-dead-routes-cleanup.
Wiki: Phase 11 close-out section в sources/iis-host-migration-2026-05-19, log
ingest+decision entries.
VM snolla-recovery ready для savestate (waits user go).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ntfy v2.11.0 stack at /opt/stacks/ntfy on VDS. Per-host LE cert (R12,
2026-05-20 → 2026-08-18) via traefik http-01. Admin user vitya/Pryakhin9
(deny-all default + admin role). Topics vds-backup + vds-ops. Phone push
confirmed in Android ntfy app. Integration-ready for vds-backup-rsync-kreknin.
iis-on-host-migration demoted to paused (passive soak, no agent action).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Admin /admin/assets/<siteId>/getList?path= крашился 500 NullReferenceException
в AssetsJsonViewModelBuilder.cs:22 (model.ParentPath на null) для 15 sites без
root AssetsFolder в Folders table (emspb.ru, pilorama98.ru, labtools.pro,
kupimknigi.spb.ru, sestech.ru, aquamax.spb.ru, artmone.pro, priemka-kvartiry.ru,
profund.spb.ru, ics-artmaterials.com, _voda-indigo.ru + 4 sites с NULL Domain).
Root создавался lazy при first upload — sites которые никогда не использовали
admin assets UI остались без root. Frontend (AssetsAppFunc.cs:66-86) делает
proper null-check → 404, только admin view-model builder упустил.
Fix: idempotent SQL seed (WHERE NOT EXISTS), 15 rows inserted. Inserted
FolderId/OwnerId captured в .tasks/...inserted-rows.txt для atomic revert.
Browser-verified user'ом на pilorama98/emspb.
Долгосрочный TODO: null-guard в AssetsJsonViewModelBuilder.Build (CMS code),
требует recompile DLL — отложено до восстановления build env (vds-kzntsv-bootstrap).
snapshot open issue #8 → resolved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Admin /admin/assets/<siteId>/getList?path= крашился 500 NullReferenceException
в AssetsJsonViewModelBuilder.cs:22 (model.ParentPath на null) для 15 sites без
root AssetsFolder в Folders table (emspb.ru, pilorama98.ru, labtools.pro,
kupimknigi.spb.ru, sestech.ru, aquamax.spb.ru, artmone.pro, priemka-kvartiry.ru,
profund.spb.ru, ics-artmaterials.com, _voda-indigo.ru + 4 sites с NULL Domain).
Root создавался lazy при first upload — sites которые никогда не использовали
admin assets UI остались без root. Frontend (AssetsAppFunc.cs:66-86) делает
proper null-check → 404, только admin view-model builder упустил.
Fix: idempotent SQL seed (WHERE NOT EXISTS), 15 rows inserted. Inserted
FolderId/OwnerId captured в .tasks/...inserted-rows.txt для atomic revert.
Browser-verified user'ом на pilorama98/emspb.
Долгосрочный TODO: null-guard в AssetsJsonViewModelBuilder.Build (CMS code),
требует recompile DLL — отложено до восстановления build env (vds-kzntsv-bootstrap).
snapshot open issue #8 → resolved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Port :8089/:4443 утечка в admin URLs закрыта. URL Rewrite 2.1 + apphost
allowedServerVariables (HTTPS/SERVER_PORT/SERVER_PORT_SECURE) + Web.config rule
на X-Forwarded-Proto=https → set SERVER_PORT=443/SERVER_PORT_SECURE=1/HTTPS=on
ДО того как ASP.NET читает их в Url.SiteRoot(). Лечит все 11 cms (общий site
snolla). Path B (traefik http entrypoint :80→:8090) abandoned — Docker Desktop
WSL2 NAT quirk на host.docker.internal:80 возвращает 17-byte 301 plain text
независимо от traefik internals. Quirk не reproducible на Linux Docker (synology).
Side regression: pre-existing customErrors mode="off" lowercase в Web.config
пробудился после ASP.NET full-reload (мой rewrite-block edit) — fixed (Off).
Outside scope, open: emspb.snolla.com /admin/assets/<guid>/getList → 500 NullRef
в AssetsJsonViewModelBuilder.cs:22 (model null от GetFolderByPath). User
подтвердил «только этот site». Зафиксировано в snapshot open issue #8.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Port :8089/:4443 утечка в admin URLs закрыта. URL Rewrite 2.1 + apphost
allowedServerVariables (HTTPS/SERVER_PORT/SERVER_PORT_SECURE) + Web.config rule
на X-Forwarded-Proto=https → set SERVER_PORT=443/SERVER_PORT_SECURE=1/HTTPS=on
ДО того как ASP.NET читает их в Url.SiteRoot(). Лечит все 11 cms (общий site
snolla). Path B (traefik http entrypoint :80→:8090) abandoned — Docker Desktop
WSL2 NAT quirk на host.docker.internal:80 возвращает 17-byte 301 plain text
независимо от traefik internals. Quirk не reproducible на Linux Docker (synology).
Side regression: pre-existing customErrors mode="off" lowercase в Web.config
пробудился после ASP.NET full-reload (мой rewrite-block edit) — fixed (Off).
Outside scope, open: emspb.snolla.com /admin/assets/<guid>/getList → 500 NullRef
в AssetsJsonViewModelBuilder.cs:22 (model null от GetFolderByPath). User
подтвердил «только этот site». Зафиксировано в snapshot open issue #8.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Rusonyx 160 NVMe заказан 2026-05-19 (6 vCPU / 8GB RAM / 160GB NVMe / Ubuntu 24.04, без ispmanager/CMS/VPS Backup, 1 IPv4). Ждём выделение IP.
OS resolved: Ubuntu 24.04 LTS (поддержка до апреля 2029, docker official APT flow, mainstream community для docker workload). Debian 12 отвергнут — не даёт material выгоды при 8GB RAM.
160 SSD → 160 NVMe — Rusonyx апгрейд storage по той же цене, IOPS выше.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After NAS incident 2026-05-18 — план вынести инфраструктурные сервисы (gitea/verdaccio/seafile/registry/hermes) с kreknin Synology на облачный VDS Rusonyx 160 SSD (2500 ₽/мес, 6 vCPU / 8GB RAM / 160GB SSD).
Размеры с kreknin /volume1/docker/*: gitea 2.6G, verdaccio 8.5G (prune до ~3G), owncloud → replace with seafile ~30-40G, registry 99G (GC до ~5-15G), hermes 10G (Nous Research agent self-host, LLM external).
Tier-decision history записана в Decisions log: 160 → 80+addon → 160 final (user choice: operational simplicity over 6k₽/год экономии).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Status: done (false) -> paused (true). Миграция была сделана,
сломала prod (Docker port-loop), откатили. Артефакты на хосте
остались inert для следующей попытки.
- STATUS: 🟢 done -> 🟡 paused с детальным where-I-stopped
- iis-on-host-migration: Phase 9 rollback задокументирован, что
НЕ делать в следующей попытке (cross-ref на post-mortem)
- NEXT-SESSION-PROMPT: переписан для retry-сценария — обязательное
чтение post-mortem перед началом, recipe из 5 пунктов
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>