# iis-cutover-to-vds-services ## Goal Перенастроить IIS на [[../entities/windows-recovery-host]] так чтобы CMS sites обращались к **MSSQL/MinIO/imgproxy на VDS** вместо localhost-контейнеров. Это **финальный шаг** ради которого всё затевалось — миграция MSSQL/MinIO бессмысленна без репойнта IIS. **Depends on:** - `mssql-vds-migration` — MSSQL должен быть live на `mssql.kzntsv.site:1433` с restored DBs - `minio-imgproxy-vds-migration` — MinIO + imgproxy live на `minio.vds.kzntsv.site` / `imgproxy.kzntsv.site` Cutover атомарный: один web.config edit + iisreset = 11 хостов мигрируют разом. Rollback = revert backup. ## Key files / refs - **Catch-all IIS site `snolla`** (`*:80` + `*:8089`, [[../.wiki/concepts/recovery-architecture-snapshot]] §"Host IIS configuration") — `C:\sites\snolla\web.config` обслуживает **11 CMS hosts** через traefik backend `host.docker.internal:8089`: - snolla.com + 10 *.snolla.com subdomains - labtools.ru / labtools.pro - pilorama98.ru, tandemmebel.ru, emspb.ru, kupimknigi.spb.ru - maljarka.tandemmebel.ru, sestech.ru, ics-artmaterials.com - **Local-only IIS sites** (не через traefik, local-only): - `stostayer` (`*:8090`) — `C:\sites\stostayer\web.config`, conn уже `www.stostayer.ru,1433` (external — может не требовать изменений) - `stostayer.old` (`*:8091`) — `C:\sites\stostayer.old\web.config`, conn `localhost,1433` → требует repoint - **Source MSSQL endpoint** (current): `Data Source=localhost,1433` (для snolla + stostayer.old) - **Target MSSQL endpoint** (new): `Data Source=mssql.kzntsv.site,1433;TrustServerCertificate=true` (self-signed cert через traefik TCP passthrough) - **MinIO/imgproxy CMS settings** — точное место в config TBD (audit step 1). Возможно `appSettings` в web.config или отдельный config-файл (CMS уровня). - **Per-DB mapping** (какой site какую DB трогает — verify через `sp_helpdb` или audit web.config'ов): - snolla → likely `MoreThenCms` + `stostayer` (один CMS на много sites) - stayer sites → `StayerCalculator` / `StayerPrice` / `TireService` ## Acceptance 1. **Audit config locations:** - `Get-ChildItem -Recurse C:\sites -Include web.config,appsettings.*.json,*.config | Select-String -Pattern 'localhost,1433|localhost:9000|localhost:8788|Data Source|connectionString'` - Документировать в task'е (или в `.wiki/concepts/cms-config-locations.md`): какой site какой config trогает, какие conn-strings, какие MinIO/imgproxy refs. 2. **Pre-cutover benchmark** (mandatory, см. risks в `mssql-vds-migration`): - Прогнать на каждом hot-path до cutover (LOCALHOST baseline): admin/assets/getList, search, каталоги. Сохранить в `.wiki/sources/iis-cutover-benchmark-.md`. - Pass criteria: после cutover degradation <2x. Если worse — discuss с user перед commit. 3. **Backup configs:** ```powershell Get-ChildItem C:\sites\*\web.config | %{ Copy-Item $_ "$($_.FullName).bak-pre-vds-cutover-$(Get-Date -Format yyyyMMdd)" } ``` 4. **Edit conn-strings** в `C:\sites\snolla\web.config` (catch-all для 11 хостов) + `C:\sites\stostayer.old\web.config`: - `localhost,1433` → `mssql.kzntsv.site,1433` - Добавить `;TrustServerCertificate=true` (self-signed TLS через traefik passthrough) - Если `Encrypt=False` явно стоит — оставить (Encrypt=True + TrustServerCertificate ОК тоже, но fewer changes safer) - `stostayer` (`www.stostayer.ru,1433`) — оставить как есть (уже external, не наш scope) 5. **Edit MinIO/imgproxy endpoints** (после step 1 audit точные места known): - `localhost:9000` → `minio.vds.kzntsv.site` (HTTPS) для S3 calls из CMS - `localhost:8788` → `imgproxy.kzntsv.site` для image-proxy URL'ов (если hardcoded; idealistic — через `IMGPROXY_BASE_URL` env) 6. **Cutover:** - `iisreset /restart` (или `Restart-WebAppPool snolla` если selective). - Smoke 8 priority hosts (verified live в `[iis-on-host-migration]` close-out): `emspb / snolla / on.snolla / pilorama98 / labtools.ru / labtools.pro / tandemmebel / kupimknigi` — каждый 200 OK + asset loading + admin login (если scope). - admin/assets/getList на одном из них — hot-path verify. 7. **Post-cutover benchmark** — те же запросы что в step 2, сравнить latency. Documented в same `.wiki/sources/iis-cutover-benchmark-.md`. 8. **MinIO write smoke** — загрузить тестовый asset через admin UI → verify в VDS MinIO (`mc ls new/`), убедиться что imgproxy его рендерит через `imgproxy.kzntsv.site`. 9. **48ч soak**: - Monitoring через existing `vds-ops` ntfy topic + manual phone check 8 hosts на 24ч / 48ч марках. - Если regression — atomic revert (см. notes). 10. **Source decommission** (через 48ч green): - На windows-host: `docker stop mssql minio imgproxy imgproxy-nginx` (через неделю → `docker rm + volume rm`). - Списать `cms-stopgap-backup-daily` cron (теперь VDS backup pipeline покрывает). 11. **Documented** в [[../.wiki/concepts/iis-cutover-to-vds-services]] (создать): pre/post architecture diagrams, edit-diff'ы конфигов, benchmark numbers, rollback recipe. ## Decisions - **Cutover style: atomic** (не gradual canary). 1 web.config edit → iisreset → 11 хостов мигрируют разом. Rationale: snolla catch-all = единая точка изменения, gradual невозможен без дублирования IIS sites (overkill). - **TLS:** `TrustServerCertificate=true` в conn-string (self-signed cert через traefik passthrough). Permanent fix позже через LE-cert extract в DBs (см. [[vds-kzntsv-bootstrap]] Open questions). - **stostayer site (external `www.stostayer.ru`)** не трогаем — уже external endpoint, отдельный scope. - **maljarka.tandemmebel.ru 502 bug** не блокер этой таски (existing issue, [[../.tasks/iis-traefik-dead-routes-cleanup]] side-finding, отдельная CMS-task'а в MoreThenCms). ## Open questions (решаются audit step 1) - [ ] **MinIO/imgproxy конфигурация** — где живёт endpoint config? В web.config `` или отдельный JSON / DLL config? Если hardcoded в скомпилированной DLL — рестарт CMS не поможет, нужен rebuild. См. [[../.wiki/concepts/cms-admin-assets-root-folder-seed]] §"Долгосрочный TODO" — это известная техдыра. - [ ] **Per-site DB mapping** — какой web.config какую MSSQL DB указывает? Audit step 1 даст карту. - [ ] **HTTPS для MSSQL conn-string** — `Encrypt=True;TrustServerCertificate=true` vs `Encrypt=False`? Текущие conn-strings в snolla web.config — unknown, audit показиет. ## Risks - **Hardcoded DLL endpoints** — если MinIO/imgproxy URLs запечены в скомпилированных CMS DLL, repoint требует rebuild → build env вопрос. **Mitigation:** audit step 1 покажет; если hardcoded — fallback вариант: оставить imgproxy-nginx на windows-host, проксировать через него на VDS MinIO (transparent для CMS). - **WAN latency** — admin/assets/getList sensitive (большие в-памяти выборки). 10-30ms vs localhost. Pre/post benchmark обязателен. Если degradation >2x — обсуждать query optimization vs retreat. - **TLS chain** — self-signed cert через traefik passthrough требует `TrustServerCertificate=true` или import cert в Windows trust store. Первое проще, второе secure-er. Choose first для migration, secure-fix позже. - **DNS propagation** — `mssql.kzntsv.site` DNS должен propagate ДО iisreset. User уже сделал A-record (2026-05-22). TTL 300s default REGRU → 5 min wait после propagate-check (`Resolve-DnsName mssql.kzntsv.site`). - **MinIO bucket policy / CORS** — если CMS делает PUT через browser-direct upload → CORS policy на VDS MinIO должна включать domain'ы клиентских сайтов. Verify в smoke step 8. - **Cutover failure rollback delay** — revert web.config + iisreset ~30 sec. Если windows-host MSSQL container остановлен — rollback fails. **Mitigation:** keep windows-host containers running 48ч (acceptance 10 это закладывает). ## Notes - **Branch:** master (per project-discipline rule 2 — no feature branches без user approval). - **Atomic revert:** ```powershell Get-ChildItem C:\sites\*\web.config.bak-pre-vds-cutover-* | %{ $orig = $_.FullName -replace '\.bak-pre-vds-cutover-\d+$','' Copy-Item $_.FullName -Destination $orig -Force } iisreset /restart ``` Затем убедиться что windows-host MSSQL + MinIO + imgproxy containers всё ещё running. Если уже остановлены — `docker start mssql minio imgproxy imgproxy-nginx`. - **Why this task exists separately from migrations:** разные skill-sets (migrations = Linux/docker/VDS; cutover = IIS/web.config/Windows), разные failure-modes, разные rollback-paths, разное окно работы (migrations можно делать в любое время; cutover = maintenance window). Splitting позволяет migrations завершиться + soak без давления на cutover-timing.