docs(.wiki): ingest iis-host-migration attempt 2 (success) + docker-host-loopback-detect
Phase 10 успех — recipe из post-mortem применён полностью: backend port :8089, bak-pre-attempt2 серия, IIS binding + Stop+Start, loop-detect через docker exec wget, 2 canary phone-tests от мобильного интернета, batch 9 cms; stayer routes user-ом подтверждены internal → .yml.disabled. Touched: - sources/iis-host-migration-2026-05-19.md — append Phase 10 - concepts/iis-migration-2026-05-19-postmortem.md — footer attempt-2-succeeded с маппингом recipe A-G - concepts/recovery-architecture-snapshot.md — major rewrite, chain через host-IIS:8089, VM = parallel fallback - entities/snolla-recovery-vm.md — status parallel-fallback, 24-48h soak - entities/windows-recovery-host.md — IIS sites active prod - NEW concepts/docker-host-loopback-detect.md — recipe loop-detect + WinHTTP-proxy gotcha - index.md, log.md
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Recovery architecture — текущая инфраструктура (2026-05-19)
|
||||
title: Recovery architecture — текущая инфраструктура (2026-05-19, attempt 2)
|
||||
type: concept
|
||||
tags: [architecture, current-state, snapshot, recovery]
|
||||
sources: [../sources/nas-recovery-session-2026-05-18.md, ../sources/iis-host-migration-2026-05-19.md]
|
||||
@@ -8,15 +8,19 @@ updated: 2026-05-19
|
||||
|
||||
# Recovery Architecture Snapshot
|
||||
|
||||
Снимок 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]].
|
||||
Снимок production-инфраструктуры на конец **второй (успешной) попытки** миграции 2026-05-19. 14 cms hostnames теперь идут через native IIS на [[windows-recovery-host]] напрямую. VM `snolla-recovery` — **parallel-fallback**, running но больше не на prod-пути (24h+ soak, потом savestate). 2 stayer routes окончательно **disabled** через traefik (host IIS sites живут для прямого доступа).
|
||||
|
||||
## Цепочка запроса от клиента до CMS (после revert 2026-05-19)
|
||||
История: attempt 1 в этот же день сломал prod, был revert; recipe — в [[iis-migration-2026-05-19-postmortem]]. Attempt 2 выполнен по recipe — см. [[iis-host-migration-2026-05-19]] Phase 10.
|
||||
|
||||
Это **рабочее, но всё ещё временное** состояние — single-point-of-failure на бытовом железе. Замечания по улучшению — [[future-resilient-architecture-goals]].
|
||||
|
||||
## Цепочка запроса от клиента до CMS (host-IIS chain, attempt 2)
|
||||
|
||||
```
|
||||
Клиент (browser)
|
||||
→ DNS resolve (REGRU): *.kzntsv.site, snolla.com, labtools.pro/ru, pilorama98.ru,
|
||||
tandemmebel.ru, emspb.ru, kupimknigi.spb.ru, maljarka.tandemmebel.ru,
|
||||
sestech.ru, ics-artmaterials.com (rimiz.ru — резолвится, но CMS отдаёт 404)
|
||||
→ DNS resolve (REGRU): *.snolla.com (включая on.snolla.com — default subdomain),
|
||||
labtools.ru/pro, pilorama98.ru, tandemmebel.ru, emspb.ru, kupimknigi.spb.ru,
|
||||
maljarka.tandemmebel.ru, sestech.ru, ics-artmaterials.com, rimiz.ru (404 CMS-side)
|
||||
→ 94.19.247.14 (public IP, статический у провайдера)
|
||||
→ router OpenWRT (192.168.1.1) [[openwrt-router]]
|
||||
→ NAT 443 → 192.168.1.143:4443
|
||||
@@ -25,13 +29,14 @@ 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:18080/
|
||||
→ host:18080 = VBox NAT port forward → VM:80
|
||||
→ snolla-recovery VM [[snolla-recovery-vm]]
|
||||
→ IIS на :80, site MoreThenCms.Web (catch-all)
|
||||
→ backend = http://host.docker.internal:8089/
|
||||
→ host:8089 → IIS site `snolla` (binding *:8089)
|
||||
→ IIS native на хосте
|
||||
→ site `snolla`, .NET Framework 4.8.1, AppPoolIdentity
|
||||
→ C:\sites\snolla\, sitePath patched, conn → localhost
|
||||
→ ASP.NET CMS code (.NET Framework 4.8)
|
||||
→ Connection strings:
|
||||
→ MSSQL: Data Source=10.0.2.2:1433 (VBox NAT gateway = host)
|
||||
→ MSSQL: Data Source=localhost,1433 (host:1433 = MSSQL container)
|
||||
→ MinIO/storage: вопрос снят пользователем
|
||||
→ Elasticsearch: не используется CMS
|
||||
→ MSSQL container на host:1433
|
||||
@@ -39,22 +44,21 @@ updated: 2026-05-19
|
||||
← HTTP response back through chain
|
||||
```
|
||||
|
||||
## Цепочка для stayer'ов (тоже через VM)
|
||||
**VM `snolla-recovery`:** running parallel, no traffic (24h+ soak fallback). NAT port forwards `:18080/:18180/:18181/:18189` холостые. Будет savestate'ena после стабильности → потом unregistervm для освобождения ~92 GB.
|
||||
|
||||
## Stayer chain — DISABLED через traefik
|
||||
|
||||
```
|
||||
Клиент → ... → traefik
|
||||
→ backend = host.docker.internal:18180 (stostayer) или :18181 (stostayer.old)
|
||||
→ VBox NAT port forward → VM:8080 или VM:8081
|
||||
→ IIS в [[snolla-recovery-vm]]
|
||||
→ stostayer: Data Source=89.253.219.2,1433 (НЕ работающий внешний сервер — но stayer'ы и так не отвечают, по словам user'а)
|
||||
→ stostayer.old subapps (calc/price/tireService) — отдельные pools
|
||||
stostayer.snolla.com / old.stostayer.ru
|
||||
→ DNS → 94.19.247.14
|
||||
→ router → traefik
|
||||
→ match Host → нет routes (stostayer.yml.disabled, oldstostayer.yml.disabled)
|
||||
→ traefik 404 "no route"
|
||||
```
|
||||
|
||||
**Внимание:** 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, но не активны.
|
||||
Host IIS sites `stostayer (:8090)` и `stostayer.old (:8091)` **живут** для прямого/локального доступа. Conn-strings:
|
||||
- `stostayer`: `Data Source=www.stostayer.ru,1433`, user `stayer_site`, password XML-escaped см. [[webconfig-password-xml-escape]]
|
||||
- `stostayer.old`: `Data Source=localhost` (наш MSSQL контейнер)
|
||||
|
||||
## Запущенные docker контейнеры на хосте
|
||||
|
||||
@@ -67,32 +71,34 @@ updated: 2026-05-19
|
||||
| **imgproxy-nginx** | `nginx:alpine` | 8788 | bind: `./nginx/cache`, `./nginx/nginx.conf` |
|
||||
| **elasticsearch** | `elasticsearch:7.10.1` | 9200 | bind: `./data` |
|
||||
|
||||
Все на docker network `proxy` (external) — это позволяет traefik резолвить `minio`, `elasticsearch`, `imgproxy-nginx` напрямую по docker DNS.
|
||||
Все на docker network `proxy` (external).
|
||||
|
||||
## Traefik routes (после revert 2026-05-19)
|
||||
## Traefik routes (после attempt 2)
|
||||
|
||||
Все активные routes снова указывают на VM (как было до session). Backups сохранены для следующей попытки миграции.
|
||||
11 cms yml репойнтены на host IIS:8089. 2 stayer yml — `.disabled`.
|
||||
|
||||
| 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 |
|
||||
| snolla.yml | snolla.com + 10 *.snolla.com subdomains (rule explicit) | host.docker.internal:8089 | active → host IIS |
|
||||
| rimiz.yml | rimiz.ru, www.rimiz.ru | host.docker.internal:8089 | active (но CMS-side 404 — known) |
|
||||
| labtools.yml | labtools.ru, www.labtools.ru | host.docker.internal:8089 | active → host IIS |
|
||||
| labtoolspro.yml | labtools.pro, www.labtools.pro | host.docker.internal:8089 | active → host IIS |
|
||||
| pilorama98.yml | pilorama98.ru, www.pilorama98.ru | host.docker.internal:8089 | active → host IIS |
|
||||
| tandemmebel.yml | tandemmebel.ru, www.tandemmebel.ru | host.docker.internal:8089 | active → host IIS |
|
||||
| emspb.yml | emspb.ru, www.emspb.ru | host.docker.internal:8089 | active → host IIS (canary 1, phone-test ✅) |
|
||||
| kupimknigi.yml | kupimknigi.spb.ru | host.docker.internal:8089 | active → host IIS |
|
||||
| maljarka.yml | maljarka.tandemmebel.ru | host.docker.internal:8089 | active → host IIS |
|
||||
| sestech.yml | sestech.ru, www.sestech.ru | host.docker.internal:8089 | active → host IIS |
|
||||
| isc-artmaterials.yml | ics-artmaterials.com, www.ics-artmaterials.com | host.docker.internal:8089 | active → host IIS (CMS-side 404 — known) |
|
||||
| **stostayer.yml.disabled** | stostayer.snolla.com | (n/a, route disabled) | **DISABLED**, host IIS :8090 локально |
|
||||
| **oldstostayer.yml.disabled** | old.stostayer.ru | (n/a, route disabled) | **DISABLED**, host IIS :8091 локально |
|
||||
|
||||
**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).
|
||||
**Backup-stamp файлы** (накопились за обе попытки):
|
||||
- `*.yml.bak-2026-05-19` — самый ранний backup (до session).
|
||||
- `*.yml.bak-phase3-2026-05-19` — rollback baseline (attempt 1 → revert state, всё на VM `:18080`).
|
||||
- `*.yml.bak-hostip-2026-05-19` — failed attempt 1 (host.docker.internal:80 ⇒ Docker NAT loop).
|
||||
- `*.yml.bak-stayer-switch-2026-05-19` — stayer switch attempt artefact (Phase 5/6 prev session).
|
||||
- **`*.yml.bak-pre-attempt2-2026-05-19`** — текущая live conf attempt 2 (host:8089 backend). Это baseline для **atomic revert** этой попытки.
|
||||
|
||||
Плюс file-provider маршруты для инфраструктурных хостов:
|
||||
|
||||
@@ -106,18 +112,30 @@ updated: 2026-05-19
|
||||
- `disk.yml` → 192.168.1.10:5005 (Synology disk на мёртвой синке)
|
||||
- `dsm.yml` → 192.168.1.10:5000 (DSM мёртвой синки)
|
||||
|
||||
## Host IIS configuration (active prod)
|
||||
|
||||
| Site | Bindings | Physical path | Pool identity | Прим. |
|
||||
|---|---|---|---|---|
|
||||
| **snolla** | `*:80`, `*:8089` | `C:\sites\snolla` | `ApplicationPoolIdentity` (.NET v4.0 Integrated) | **active prod** — catch-all для 11 cms hosts, traefik backend `:8089` |
|
||||
| **stostayer** | `*:8090` | `C:\sites\stostayer` | `ApplicationPoolIdentity` | local-only (traefik route disabled), conn → `www.stostayer.ru,1433` |
|
||||
| **stostayer.old** | `*:8091` | `C:\sites\stostayer.old` | `ApplicationPoolIdentity` | local-only (traefik route disabled), conn → `localhost,1433` |
|
||||
| Default Web Site | (stopped, autoStart=false) | — | — | — |
|
||||
|
||||
ACL: `IIS AppPool\<site>:(OI)(CI)M` рекурсивно на каждом site root.
|
||||
|
||||
## DNS
|
||||
|
||||
Все домены остались указывать на **94.19.247.14** (public IP, статический). REGRU как registrar/DNS. Никаких DNS-изменений во время recovery не требовалось — only router NAT перенастроен.
|
||||
Все домены остались указывать на **94.19.247.14** (public IP, статический). REGRU как registrar/DNS.
|
||||
|
||||
## Backup инфраструктура
|
||||
|
||||
Текущая (на момент 2026-05-19):
|
||||
Текущая (на момент 2026-05-19, после attempt 2):
|
||||
|
||||
- [[kreknin-synology]] держит Hyper Backup репо мёртвой синки (~430 GB). Новых бэкапов с recovered Windows-PC **НЕТ** — рабочее состояние на Windows-PC не бэкапится никуда.
|
||||
- Локально на Windows-PC: `C:\nas-recovery\vm-sites\` (~11 GB, дамп IIS sites из VM) — резерв если VM полностью умрёт.
|
||||
- [[kreknin-synology]] держит Hyper Backup репо мёртвой синки (~430 GB). Новых бэкапов с recovered Windows-PC **НЕТ**.
|
||||
- Локально на Windows-PC: `C:\nas-recovery\vm-sites\` (~11 GB, дамп IIS sites из VM до patches) — резерв если host-IIS сломается катастрофически. После 48h+ uptime можно почистить.
|
||||
- `C:\nas-recovery\backup\snolla\snolla.ova` (42.5 GB) — оригинал OVA. После cleanup VM можно удалить.
|
||||
|
||||
**Дыра:** если Windows-PC сгорит — ВСЁ ляжет. Никакой репликации, никакого off-site backup для нового рабочего состояния.
|
||||
**Дыра:** если Windows-PC сгорит — всё ляжет. Никакой репликации, никакого off-site backup для нового рабочего состояния.
|
||||
|
||||
## SSH ключи и доступ
|
||||
|
||||
@@ -129,14 +147,13 @@ updated: 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.
|
||||
1. **X-Forwarded headers** не передаются от traefik в IIS → CMS делает redirect с `:4443` в URL. См. [[traefik-on-windows-docker-desktop]] Pitfall 5.
|
||||
2. **rimiz.ru → 404**. CMS-side, не инфра.
|
||||
3. **ics-artmaterials.com → 404**. Аналогично — CMS-side (`www.ics-artmaterials.com → 301 → ics-artmaterials.com → 404`).
|
||||
4. **acme.json HTTP-01 renewal** будет фейлить для доменов с DNS не на нашем IP → переезд на DNS-01 через REGRU до истечения сертификатов (~3 месяца).
|
||||
5. **C:\inetpub\logs\** растёт — нужна ротация.
|
||||
6. **docker.sock provider в traefik** не работает — но не блокирует (всё через file-provider). См. [[traefik-on-windows-docker-desktop]] Pitfall 3.
|
||||
7. **WinHTTP proxy на хосте strips response headers** для `curl.exe http://localhost:...` — для loop-detect/IIS confirmation использовать `docker exec traefik wget` или `Invoke-WebRequest`. См. [[docker-host-loopback-detect]].
|
||||
|
||||
## Single Points of Failure
|
||||
|
||||
@@ -144,7 +161,7 @@ updated: 2026-05-19
|
||||
- Один публичный IP / провайдер
|
||||
- Один WiFi-канал
|
||||
- Один OpenWRT-роутер
|
||||
- **Одна VBox VM `snolla-recovery`** — single instance, обслуживает весь CMS-трафик (после revert)
|
||||
- Один **host IIS instance** обслуживает весь cms-трафик (VM остаётся parallel fallback ещё 24-48h)
|
||||
- Один MSSQL контейнер (single primary, нет replica)
|
||||
- Один MinIO (single drive, не distributed)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user