New source page documenting migration of MoreThenCms.Web from snolla-recovery VM to native host IIS. Updates: - recovery-architecture-snapshot: new chain (traefik -> host:80) + secondary chain for stostayer still on VM - snolla-recovery-vm: demoted, IdentityManager port fix (8089 not 80), sub-apps detailed - windows-recovery-host: 3 native IIS sites + C:\sites\, C:\stayer\ - log.md: ingest + decision entries Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.8 KiB
title, type, tags, ingested, raw_path, updated
| title | type | tags | ingested | raw_path | updated | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| IIS Host Migration Session 2026-05-19 | source |
|
2026-05-19 | ../../.tasks/iis-on-host-migration.md | 2026-05-19 |
IIS Host Migration Session 2026-05-19
Перенос основного CMS-сайта (MoreThenCms.Web, обслуживает 11 клиентских доменов через Host header) с IIS внутри snolla-recovery-vm на нативный IIS windows-recovery-host. Цель — убрать VBox как слой нестабильности.
Хронология
Старт сессии (после nas-recovery-session-2026-05-18) — VM один раз отвалилась сетью, оживили через VBoxManage guestcontrol + ipconfig /release /renew (recipe в vbox-windows-stability-tuning подтверждён ещё раз).
Phase 1 — discovery (read-only):
- В VM через SSH (NAT-forward 127.0.0.1:8022, не bridged 192.168.1.15 — это устарело):
appcmd list site/apppool/app/vdir /xml. - На хосте:
Get-WindowsOptionalFeature -Online IIS-*через elevated PS — все нужные фичи (IIS-WebServer,IIS-ASPNET45,IIS-NetFxExtensibility45,IIS-ISAPIFilter,IIS-ManagementConsole,IIS-IIS6ManagementCompatibility,IIS-Metabase) уже установлены.WebAdministrationPS-module грузится из admin-PS. - В источниках на хосте (
grep): hardcodedC:\inetpub\wwwroot\в коде CMS нет — всё черезConfigurationManager.AppSettings["sitePath"]. НО в prod Web.config (из backupvm-sites\) ключsitePathявно проставлен абсолютным путём — патч в Phase 2 необходим.
Phase 1 находки (важные расхождения с wiki):
Snolla.IdentityManagerв VM на :8089, не :80 (вики говорила :80). Sub-apps stostayer.old/calc,/price,/price/tireServiceсуществуют с отдельными app pools.C:\stayer\Snolla.IdentityManager\Web.configуказывает наSRV-1135520-1\SQLEXPRESS+ Integrated Security — мёртвый внешний сервер. Сайт точно не работает, deploy-артефакт без живого консьюмера.C:\stayer\MoreThenCms.Web\Web.config(stostayer) использует внешний production MSSQL89.253.219.2,1433с userstostayer— это другая инфраструктура, не наш контейнер.
Phase 2 — миграция (admin PS):
Default Web Siteостановлен (autoStart=false).robocopyизC:\nas-recovery\vm-sites\→C:\sites\MoreThenCms.Web(8.7 GB / 44.7k файлов / 1m13s) и →C:\stayer\(2.2 GB / 13.9k файлов / 21s).- Web.config patch только для
C:\sites\MoreThenCms.Web\Web.config:sitePathC:\inetpub\wwwroot\MoreThenCms.Web\→C:\sites\MoreThenCms.Web\+Data Source=10.0.2.2→Data Source=localhost. UTF-8 with BOM через[System.IO.File]::WriteAllText(паттерн из cms-config-rewrite-pattern). - 3 AppPool (
.NET v4.0Integrated,ApplicationPoolIdentity):MoreThenCms.Web,stostayer,stostayer.old. - 3 IIS-сайта:
MoreThenCms.Web *:80(catch-all),stostayer *:8090,stostayer.old *:8091. - ACL
icacls /grant 'IIS AppPool\<site>:(OI)(CI)M' /Tна каждый physical root. - Skip:
Snolla.IdentityManager(по решению — публично не нужен), 3 sub-apps stostayer.old (по решению). - Smoke test через
http://localhost/с Host header: все 11 хостов отвечают (большинство 302 redirect — CMS работает).rimiz.ru— 404 (CMS-side, не инфра). stostayer/oldstostayer на :8090/:8091 — timeout, в текущей сессии не разбирались.
Phase 3 — traefik switch (file-provider auto-reload):
- Backup
*.yml.bak-phase3-2026-05-19для 11 файлов вC:\Users\vitya\projects\docker\diskstation\traefik\data\custom\. - Patch:
host.docker.internal:18080→host.docker.internal:80(11 yml: snolla, rimiz, labtools, labtoolspro, pilorama98, tandemmebel, emspb, kupimknigi, maljarka, sestech, isc-artmaterials). UTF-8 без BOM. - Не трогали
stostayer.yml(:18180) иoldstostayer.yml(:18181) — stayer-сайты остаются на VM. - Public smoke через
https://localhost:4443/с Host header: 10/11 → HTTP 200. Толькоrimiz.ru→ 404 (как и в локальном тесте).
Результат
Production-трафик 10 главных доменов теперь идёт полностью без VM: client → OpenWRT → traefik → host-IIS native → MSSQL container на хосте. VM продолжает обслуживать только stostayer/oldstostayer через старые NAT port forwards (:18180/:18181).
Открытые вопросы / нюансы
rimiz.ruотдаёт 404 на host-IIS (и на VM до миграции тоже отдавал?). CMS-routing не знает этот host. Проверить mapping в БД / CMS-сайт-таблице.- stostayer + stostayer.old timeout на host-IIS (
http://localhost:8090/,:8091). Возможно cold-start ASP.NET, возможно реальный bug. Сейчас не разбирали — traefik для них всё ещё на VM. - Snolla.IdentityManager не мигрирован — если что-то внутри CMS дёргает его через
localhost:8089, может тихо ломаться (пока симптомов не видно). - VM можно глушить только после: либо доделать stostayer на host, либо явное решение не мигрировать stayer на этот хост.
- Phase 5 не сделан: URL Rewrite + ARR (фикс
:4443в редиректах CMS), Application Initialization (warm-start), log rotationC:\inetpub\logs\.
Технические артефакты
.tasks/iis-on-host-migration.md— детальный план фаз, обновлён со статусом Phase 1-3 = done.- Backup конфигов traefik:
*.yml.bak-phase3-2026-05-19. - Скрипты Phase 2 и Phase 3 — в истории чата сессии (не сохранены отдельным файлом, идемпотентны на повторный запуск).
Связано
recovery-architecture-snapshot обновлён под новую chain. snolla-recovery-vm — статус демоут до stayer-only. windows-recovery-host — добавлены 3 native IIS sites. cms-config-rewrite-pattern — паттерн UTF-8 BOM подтверждён ещё раз.