Files
admin/.tasks/iis-cutover-to-vds-services.md
vitya 86a94d7f9d tasks(vds-migration): decompose umbrella → 3 child tasks
- mssql-vds-migration : Express edition, BACKUP/RESTORE method, mssql.kzntsv.site:1433
- minio-imgproxy-vds-migration : MinIO upgrade 2020→latest, mc mirror, includes imgproxy+nginx
- iis-cutover-to-vds-services 🔵: atomic web.config repoint (1 file → 11 hosts), blocked on both migrations
- umbrella mssql-minio-migration-to-vds 🟢: decomposed (kept for history)

Discovery: 5 prod DBs ≤ 968 MB (Express OK), .ldf logs 12 GB → SHRINKFILE
pre-cutover. VDS: 79 GB free, 5.8 GB RAM avail. ownCloud capped 1G.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:02:49 +03:00

9.9 KiB
Raw Blame History

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-<date>.md.
    • Pass criteria: после cutover degradation <2x. Если worse — discuss с user перед commit.
  3. Backup configs:
    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,1433mssql.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:9000minio.vds.kzntsv.site (HTTPS) для S3 calls из CMS
    • localhost:8788imgproxy.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-<date>.md.
  8. MinIO write smoke — загрузить тестовый asset через admin UI → verify в VDS MinIO (mc ls new/<bucket>), убедиться что 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 <appSettings> или отдельный 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-stringEncrypt=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 propagationmssql.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:
    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.