- 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>
9.9 KiB
9.9 KiB
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 DBsminio-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 backendhost.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, connlocalhost,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
- snolla → likely
Acceptance
- 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.
- 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.
- Прогнать на каждом hot-path до cutover (LOCALHOST baseline): admin/assets/getList, search, каталоги. Сохранить в
- Backup configs:
Get-ChildItem C:\sites\*\web.config | %{ Copy-Item $_ "$($_.FullName).bak-pre-vds-cutover-$(Get-Date -Format yyyyMMdd)" } - 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)
- Edit MinIO/imgproxy endpoints (после step 1 audit точные места known):
localhost:9000→minio.vds.kzntsv.site(HTTPS) для S3 calls из CMSlocalhost:8788→imgproxy.kzntsv.siteдля image-proxy URL'ов (если hardcoded; idealistic — черезIMGPROXY_BASE_URLenv)
- 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.
- Post-cutover benchmark — те же запросы что в step 2, сравнить latency. Documented в same
.wiki/sources/iis-cutover-benchmark-<date>.md. - MinIO write smoke — загрузить тестовый asset через admin UI → verify в VDS MinIO (
mc ls new/<bucket>), убедиться что imgproxy его рендерит черезimgproxy.kzntsv.site. - 48ч soak:
- Monitoring через existing
vds-opsntfy topic + manual phone check 8 hosts на 24ч / 48ч марках. - Если regression — atomic revert (см. notes).
- Monitoring через existing
- Source decommission (через 48ч green):
- На windows-host:
docker stop mssql minio imgproxy imgproxy-nginx(через неделю →docker rm + volume rm). - Списать
cms-stopgap-backup-dailycron (теперь VDS backup pipeline покрывает).
- На windows-host:
- 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=truevsEncrypt=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.siteDNS должен 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:
Затем убедиться что windows-host MSSQL + MinIO + imgproxy containers всё ещё running. Если уже остановлены —
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 /restartdocker 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.