- 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>
92 lines
9.9 KiB
Markdown
92 lines
9.9 KiB
Markdown
# 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.
|