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:
2026-05-19 15:08:07 +03:00
parent 117376656d
commit f3ded74674
2 changed files with 45 additions and 32 deletions

View File

@@ -1,16 +1,16 @@
---
title: Snolla Recovery VM (VirtualBox)
title: Snolla Recovery VM (VirtualBox) — active prod
type: entity
tags: [vm, virtualbox, windows, iis, cms, recovery, demoted]
sources: [../sources/nas-recovery-session-2026-05-18.md, ../sources/iis-host-migration-2026-05-19.md]
tags: [vm, virtualbox, windows, iis, cms, recovery, active]
sources: [../sources/nas-recovery-session-2026-05-18.md, ../sources/iis-host-migration-2026-05-19.md, ../concepts/iis-migration-2026-05-19-postmortem.md]
updated: 2026-05-19
---
# Snolla Recovery VM
VirtualBox-VM на [[windows-recovery-host]], в которой работала CMS-стек (IIS + .NET + код CMS). Импортирован из OVA-снапшота 2024-10-27, который лежал в Hyper Backup репо.
VirtualBox-VM на [[windows-recovery-host]], в которой работает CMS-стек (IIS + .NET + код CMS). Импортирован из OVA-снапшота 2024-10-27, который лежал в Hyper Backup репо.
**Статус с 2026-05-19 (после [[iis-host-migration-2026-05-19]]):** VM **демоут** — больше не обслуживает основной CMS-трафик. 11 главных клиентских доменов идут через traefik на нативный IIS хоста (`MoreThenCms.Web` на `C:\sites\MoreThenCms.Web`). VM продолжает обслуживать только `stostayer` и `stostayer.old` через port forwards `18180/18181`. Полное выключение — после миграции stayer-сайтов или явного решения их не мигрировать.
**Статус (вечер 2026-05-19 после revert):** VM **снова active prod**. Был attempt мигрировать на host-IIS в течение дня, через ~10 минут после "done"-объявления пользователь увидел `502 Bad Gateway` `TOO_MANY_REDIRECTS` → revert (см. [[iis-migration-2026-05-19-postmortem]]). VM поднята из savestate командой `VBoxManage startvm "snolla-recovery"`, потребовался `ipconfig /release /renew` через guestcontrol для оживления network adapter (recipe из [[vbox-windows-stability-tuning]]). Traefik backends восстановлены из `*.bak-phase3-2026-05-19` → trafic снова идёт через VM. Всё, что наработано на хосте для миграции, осталось inert на хосте для следующей попытки.
## Параметры
@@ -49,15 +49,17 @@ VirtualBox-VM на [[windows-recovery-host]], в которой работала
| Site | Path | Bindings | Прим. |
|---|---|---|---|
| **MoreThenCms.Web** | `C:\inetpub\wwwroot\MoreThenCms.Web` | `*:80` | **с 2026-05-19 не получает prod-трафика** (traefik переключён на хост) |
| **Snolla.IdentityManager** | `C:\inetpub\wwwroot\Snolla.IdentityManager` | `*:8089` | публично не используется, в host-миграцию не вошёл |
| **stostayer** | `C:\stayer\MoreThenCms.Web` | `*:8080` | **до сих пор обслуживает prod** через traefik backend `host.docker.internal:18180` |
| **stostayer.old** | `C:\stayer\stostayer.old` | `*:8081` | **до сих пор обслуживает prod** через `host.docker.internal:18181` |
| **stostayer.old/calc** | `C:\stayer\Mis.StoStayer.Calculator.Web` | (sub-app под `:8081`) | отдельный app pool `calc` |
| **stostayer.old/price** | `C:\stayer\Mis.StoStayer.Price.Api` | (sub-app под `:8081`) | отдельный app pool `price` |
| **stostayer.old/price/tireService** | `C:\stayer\Mis.StoStayer.TireService.Api` | (sub-app под `:8081`) | отдельный app pool `tireService` |
| **MoreThenCms.Web** | `C:\inetpub\wwwroot\MoreThenCms.Web` | `*:80` | **active prod** — catch-all для 11 главных доменов; traefik backend `host.docker.internal:18080` |
| **Snolla.IdentityManager** | `C:\inetpub\wwwroot\Snolla.IdentityManager` | `*:8089` | публично не используется |
| **stostayer** | `C:\stayer\MoreThenCms.Web` | `*:8080` | **active prod** traefik backend `host.docker.internal:18180`; conn → внешний `89.253.219.2,1433` (но user в session 2026-05-19 поменял на `www.stostayer.ru,1433` для host-копии; **в VM остался старый**) |
| **stostayer.old** | `C:\stayer\stostayer.old` | `*:8081` | **active prod** — traefik backend `host.docker.internal:18181` |
| **stostayer.old/calc** | `C:\stayer\Mis.StoStayer.Calculator.Web` | (sub-app под `:8081`) | существует, sub-app pool `calc` |
| **stostayer.old/price** | `C:\stayer\Mis.StoStayer.Price.Api` | (sub-app под `:8081`) | существует, sub-app pool `price` |
| **stostayer.old/price/tireService** | `C:\stayer\Mis.StoStayer.TireService.Api` | (sub-app под `:8081`) | существует, sub-app pool `tireService` |
CMS распознаёт клиента по **Host header** — 11 клиентских доменов исходно роутились внутри `MoreThenCms.Web` на `:80`. После [[iis-host-migration-2026-05-19]] этот сайт зеркалирован на хост в `C:\sites\MoreThenCms.Web` и получает весь prod-трафик там.
CMS распознаёт клиента по **Host header** все 11 клиентских доменов идут на `:80` и роутятся внутри CMS-кода.
**Важно для следующей попытки миграции:** stostayer Web.config в VM указывает на старый `89.253.219.2,1433`, а на host-копии (`C:\sites\stostayer\Web.config`) уже patched на `www.stostayer.ru,1433` с XML-escape `&amp;` в password. Если когда-то будем сводить эти конфиги — host-копия правильнее (старый сервер мёртв).
## Web.config — критичные настройки (после recovery patch)