Files
admin/iis-host-migration-2026-05-19.md
vitya 5000ebe0a3 docs(.wiki): ingest iis-host-migration 2026-05-19 session
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>
2026-05-19 12:51:35 +03:00

6.8 KiB
Raw Blame History

title, type, tags, ingested, raw_path, updated
title type tags ingested raw_path updated
IIS Host Migration Session 2026-05-19 source
migration
iis
windows
recovery
traefik
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) уже установлены. WebAdministration PS-module грузится из admin-PS.
  • В источниках на хосте (grep): hardcoded C:\inetpub\wwwroot\ в коде CMS нет — всё через ConfigurationManager.AppSettings["sitePath"]. НО в prod Web.config (из backup vm-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 MSSQL 89.253.219.2,1433 с user stostayer — это другая инфраструктура, не наш контейнер.

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: sitePath C:\inetpub\wwwroot\MoreThenCms.Web\C:\sites\MoreThenCms.Web\ + Data Source=10.0.2.2Data Source=localhost. UTF-8 with BOM через [System.IO.File]::WriteAllText (паттерн из cms-config-rewrite-pattern).
  • 3 AppPool (.NET v4.0 Integrated, 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:18080host.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 rotation C:\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 подтверждён ещё раз.