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

92 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:**
```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-<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-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.