docs(.wiki): iis-migration rollback + post-mortem + xml-escape concept
Phase 9 — rollback миграции на host-IIS из-за Docker port-loop (host.docker.internal:80 от traefik container резолвится обратно в сам traefik через NAT, https.yml http-catchall middleware отдавал 301 -> TOO_MANY_REDIRECTS). Prod снова через VM. - iis-migration-2026-05-19-postmortem: 10 ошибок миграции + recipe для следующей попытки (backend port НЕ :80, smoke с MaximumRedirection 0, тест из НЕ-LAN, parallel VM x N часов, atomic revert plan) - webconfig-password-xml-escape: новая gotcha — & в conn-string пароле требует & в Web.config (XML reserved char) - iis-host-migration-2026-05-19: Phase 9 rollback chronology + что осталось на хосте inert - snolla-recovery-vm: статус -> active prod (обратно) - windows-recovery-host: host IIS sites -> inert artifacts - recovery-architecture-snapshot: chain снова через VM, traefik backends восстановлены из .bak-phase3 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,9 +8,9 @@ updated: 2026-05-19
|
||||
|
||||
# Recovery Architecture Snapshot
|
||||
|
||||
Снимок production-инфраструктуры на 2026-05-19, **после миграции основного CMS на нативный IIS хоста** ([[iis-host-migration-2026-05-19]]). Это **рабочее, но временное** состояние — single-point-of-failure на бытовом железе. Замечания по улучшению — [[future-resilient-architecture-goals]].
|
||||
Снимок production-инфраструктуры на конец 2026-05-19, **после отката миграции** (попытка миграции на host-IIS не удалась — см. [[iis-migration-2026-05-19-postmortem]]). Prod снова через VM `snolla-recovery`, как было до session start. Это **рабочее, но временное** состояние — single-point-of-failure на бытовом железе. Замечания по улучшению — [[future-resilient-architecture-goals]].
|
||||
|
||||
## Цепочка запроса от клиента до CMS — 10 главных доменов (snolla.com и др.)
|
||||
## Цепочка запроса от клиента до CMS (после revert 2026-05-19)
|
||||
|
||||
```
|
||||
Клиент (browser)
|
||||
@@ -25,33 +25,36 @@ updated: 2026-05-19
|
||||
→ traefik 2.6.6 на 4443/8000
|
||||
→ TLS termination, certResolver=letsEncrypt из acme.json
|
||||
→ match по Host header (file-provider rules в data/custom/*.yml)
|
||||
→ backend = http://host.docker.internal:80/ ← с 2026-05-19
|
||||
→ Native IIS на хосте :80, site MoreThenCms.Web
|
||||
→ AppPool MoreThenCms.Web (.NET v4.0 Integrated, ApplicationPoolIdentity)
|
||||
→ physicalPath C:\sites\MoreThenCms.Web
|
||||
→ ASP.NET CMS code (.NET Framework 4.8.1 на хосте)
|
||||
→ backend = http://host.docker.internal:18080/
|
||||
→ host:18080 = VBox NAT port forward → VM:80
|
||||
→ snolla-recovery VM [[snolla-recovery-vm]]
|
||||
→ IIS на :80, site MoreThenCms.Web (catch-all)
|
||||
→ ASP.NET CMS code (.NET Framework 4.8)
|
||||
→ Connection strings:
|
||||
→ MSSQL: Data Source=localhost,1433 (прямо в MSSQL container)
|
||||
→ MinIO/storage: TBD точная схема (вопрос снят пользователем)
|
||||
→ Elasticsearch: не используется CMS (там books-стек)
|
||||
→ MSSQL: Data Source=10.0.2.2:1433 (VBox NAT gateway = host)
|
||||
→ MinIO/storage: вопрос снят пользователем
|
||||
→ Elasticsearch: не используется CMS
|
||||
→ MSSQL container на host:1433
|
||||
→ 5 production DB (MoreThenCms, Stayer*, stostayer, TireService)
|
||||
← HTTP response back through chain
|
||||
```
|
||||
|
||||
## Цепочка для stostayer / stostayer.old (всё ещё на VM)
|
||||
## Цепочка для stayer'ов (тоже через VM)
|
||||
|
||||
```
|
||||
Клиент → ... → traefik
|
||||
→ backend = host.docker.internal:18180 (stostayer) или :18181 (stostayer.old)
|
||||
→ VBox NAT port forward → VM:8080 или VM:8081
|
||||
→ IIS в [[snolla-recovery-vm]] → C:\stayer\MoreThenCms.Web или C:\stayer\stostayer.old
|
||||
→ Connection strings:
|
||||
→ stostayer: Data Source=89.253.219.2,1433 (внешний production MSSQL — НЕ наш контейнер)
|
||||
→ stostayer.old subapps (calc/price/tireService) — отдельные pools, TBD source
|
||||
→ IIS в [[snolla-recovery-vm]]
|
||||
→ stostayer: Data Source=89.253.219.2,1433 (НЕ работающий внешний сервер — но stayer'ы и так не отвечают, по словам user'а)
|
||||
→ stostayer.old subapps (calc/price/tireService) — отдельные pools
|
||||
```
|
||||
|
||||
VM также имеет `Snolla.IdentityManager :8089` и неиспользуемые копии главного CMS — публично через traefik не доступны.
|
||||
**Внимание:** stostayer-DB на `89.253.219.2` мёртвая. В host-копии (`C:\sites\stostayer\Web.config`) уже patched на новый `www.stostayer.ru,1433` (user `stayer_site`) с XML-escape `&` в password — но это inert. При следующей попытке миграции — этот патч уже готов.
|
||||
|
||||
## На хосте параллельно (inert, не на prod-пути)
|
||||
|
||||
См. [[windows-recovery-host]] "Inert" — `C:\sites\{snolla, stostayer, stostayer.old, snolla-identity-manager}` + IIS sites/pools `snolla, stostayer, stostayer.old` готовы к переключению traefik, но не активны.
|
||||
|
||||
## Запущенные docker контейнеры на хосте
|
||||
|
||||
@@ -66,27 +69,30 @@ VM также имеет `Snolla.IdentityManager :8089` и неиспользу
|
||||
|
||||
Все на docker network `proxy` (external) — это позволяет traefik резолвить `minio`, `elasticsearch`, `imgproxy-nginx` напрямую по docker DNS.
|
||||
|
||||
## Traefik routes (с 2026-05-19)
|
||||
## Traefik routes (после revert 2026-05-19)
|
||||
|
||||
13 client домен-маршрутов в `data/custom/`. **11 главных переключены на хост-IIS :80** ([[iis-host-migration-2026-05-19]]), 2 stostayer остаются на VM:
|
||||
Все активные routes снова указывают на VM (как было до session). Backups сохранены для следующей попытки миграции.
|
||||
|
||||
| File | Hosts | Backend |
|
||||
|---|---|---|
|
||||
| snolla.yml | snolla.com + 10 subdomains | **host.docker.internal:80** (host-IIS) |
|
||||
| rimiz.yml | rimiz.ru, www.rimiz.ru | **host.docker.internal:80** (host-IIS, но CMS отдаёт 404 — известный issue) |
|
||||
| labtools.yml | labtools.ru, www.labtools.ru | **host.docker.internal:80** |
|
||||
| labtoolspro.yml | labtools.pro, www.labtools.pro | **host.docker.internal:80** |
|
||||
| pilorama98.yml | pilorama98.ru, www.pilorama98.ru | **host.docker.internal:80** |
|
||||
| tandemmebel.yml | tandemmebel.ru, www.tandemmebel.ru | **host.docker.internal:80** |
|
||||
| emspb.yml | emspb.ru, www.emspb.ru | **host.docker.internal:80** |
|
||||
| kupimknigi.yml | kupimknigi.spb.ru | **host.docker.internal:80** |
|
||||
| maljarka.yml | maljarka.tandemmebel.ru | **host.docker.internal:80** |
|
||||
| sestech.yml | sestech.ru, www.sestech.ru | **host.docker.internal:80** |
|
||||
| isc-artmaterials.yml | ics-artmaterials.com, www.ics-artmaterials.com | **host.docker.internal:80** |
|
||||
| oldstostayer.yml | (старый stostayer) | host.docker.internal:18181 (всё ещё VM:8081) |
|
||||
| stostayer.yml | stostayer.ru или похожий | host.docker.internal:18180 (всё ещё VM:8080) |
|
||||
| File | Hosts | Backend | Статус |
|
||||
|---|---|---|---|
|
||||
| snolla.yml | snolla.com + 10 subdomains | host.docker.internal:18080 → VM | active |
|
||||
| rimiz.yml | rimiz.ru, www.rimiz.ru | host.docker.internal:18080 → VM | active (но CMS отдаёт 404 — известное) |
|
||||
| labtools.yml | labtools.ru, www.labtools.ru | host.docker.internal:18080 → VM | active |
|
||||
| labtoolspro.yml | labtools.pro, www.labtools.pro | host.docker.internal:18080 → VM | active |
|
||||
| pilorama98.yml | pilorama98.ru, www.pilorama98.ru | host.docker.internal:18080 → VM | active |
|
||||
| tandemmebel.yml | tandemmebel.ru, www.tandemmebel.ru | host.docker.internal:18080 → VM | active |
|
||||
| emspb.yml | emspb.ru, www.emspb.ru | host.docker.internal:18080 → VM | active |
|
||||
| kupimknigi.yml | kupimknigi.spb.ru | host.docker.internal:18080 → VM | active |
|
||||
| maljarka.yml | maljarka.tandemmebel.ru | host.docker.internal:18080 → VM | active |
|
||||
| sestech.yml | sestech.ru, www.sestech.ru | host.docker.internal:18080 → VM | active |
|
||||
| isc-artmaterials.yml | ics-artmaterials.com, www.ics-artmaterials.com | host.docker.internal:18080 → VM | active |
|
||||
| stostayer.yml | stostayer.snolla.com | host.docker.internal:18180 → VM:8080 | active |
|
||||
| oldstostayer.yml | old.stostayer.ru | host.docker.internal:18181 → VM:8081 | active |
|
||||
|
||||
Backup конфигов до переключения: `*.yml.bak-phase3-2026-05-19`.
|
||||
**Backup-stamp файлы** (накопились — для следующей попытки):
|
||||
- `*.yml.bak-phase3-2026-05-19` — original state до Phase 3 (всё указывает на VM). Это **именно та конфигурация что сейчас live** (свежескопировано в active).
|
||||
- `*.yml.bak-hostip-2026-05-19` — попытка переключения на `host.docker.internal:80` (создала loop, см. [[iis-migration-2026-05-19-postmortem]]).
|
||||
- `stostayer.yml.bak-stayer-switch-2026-05-19`, `oldstostayer.yml.bak-stayer-switch-2026-05-19` — попытка stayer'ов на host :8090/:8091 (live теперь снова на VM).
|
||||
|
||||
Плюс file-provider маршруты для инфраструктурных хостов:
|
||||
|
||||
@@ -123,14 +129,14 @@ Backup конфигов до переключения: `*.yml.bak-phase3-2026-05
|
||||
|
||||
## Известные открытые баги
|
||||
|
||||
1. **X-Forwarded headers** не передаются от traefik в IIS → CMS делает редирект с `:4443` в URL. См. [[traefik-on-windows-docker-desktop]] Pitfall 5. После миграции на host-IIS актуально, fix — URL Rewrite + ARR (Phase 5 в [[iis-host-migration-2026-05-19]]).
|
||||
2. **rimiz.ru → 404** на host-IIS (и, скорее всего, до миграции на VM тоже). CMS-side, не инфра — mapping host header → CMS-сайт в БД.
|
||||
3. **stostayer / stostayer.old timeout** при прямом обращении к host-IIS на `:8090/:8091`. Phase 2 миграция выполнена технически, но рантайм не отвечает — не разбирались, prod-трафик пока на VM.
|
||||
4. **acme.json HTTP-01 renewal** будет фейлить для доменов с DNS не на нашем IP — нужен переезд на DNS-01 через REGRU до истечения сертификатов (~3 месяца).
|
||||
5. **VM один раз "повисла" в сети** через 1-2 часа uptime — лечилось `ipconfig /release/renew` через VBoxManage guestcontrol. Подтверждено повторно в сессии 2026-05-19. Нужен auto-watchdog (или вообще выключить VM после миграции stayer).
|
||||
6. **C:\inetpub\logs\** в VM растёт (6+ GB к recovery) — нужна ротация. На хосте логи начнут расти аналогично — те же меры понадобятся.
|
||||
7. **docker.sock provider в traefik** не работает — но не блокирует (всё через file-provider). См. [[traefik-on-windows-docker-desktop]] Pitfall 3.
|
||||
8. **MinIO/Azure storage** в CMS — вопрос пользователем снят (Q4 в сессии 2026-05-19), оставлено как есть.
|
||||
1. **X-Forwarded headers** не передаются от traefik в IIS → CMS делает редирект с `:4443` в URL. См. [[traefik-on-windows-docker-desktop]] Pitfall 5.
|
||||
2. **rimiz.ru → 404**. CMS-side, не инфра — mapping host header → CMS-сайт в БД.
|
||||
3. **acme.json HTTP-01 renewal** будет фейлить для доменов с DNS не на нашем IP — нужен переезд на DNS-01 через REGRU до истечения сертификатов (~3 месяца).
|
||||
4. **C:\inetpub\logs\** в VM растёт (6+ GB к recovery). На хосте та же беда если когда-то переключимся.
|
||||
5. **docker.sock provider в traefik** не работает — но не блокирует (всё через file-provider). См. [[traefik-on-windows-docker-desktop]] Pitfall 3.
|
||||
6. **stostayer DB в VM указывает на мёртвый 89.253.219.2** — stayer'ы публично возможно не работают полноценно (user сказал "стайеры и на VM не работает" — подтвердил). Host-копия уже patched на новый `www.stostayer.ru,1433`, в VM не правили.
|
||||
7. **MinIO/Azure storage** в CMS — вопрос пользователем снят, оставлено как есть.
|
||||
8. **VM network adapter "виснет"** периодически (recipe `ipconfig /release /renew` через guestcontrol в [[vbox-windows-stability-tuning]]). Подтверждено ещё раз в сессии 2026-05-19.
|
||||
|
||||
## Single Points of Failure
|
||||
|
||||
@@ -138,7 +144,7 @@ Backup конфигов до переключения: `*.yml.bak-phase3-2026-05
|
||||
- Один публичный IP / провайдер
|
||||
- Один WiFi-канал
|
||||
- Один OpenWRT-роутер
|
||||
- Один VBox VM (single instance, не replicate)
|
||||
- **Одна VBox VM `snolla-recovery`** — single instance, обслуживает весь CMS-трафик (после revert)
|
||||
- Один MSSQL контейнер (single primary, нет replica)
|
||||
- Один MinIO (single drive, не distributed)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user