Files
admin/.tasks/mssql-minio-migration-to-vds.md
vitya fd8bb13e75 resilience(roadmap): workshop pass 1 — close design-task; file top-3 impl-tasks
- close [resilience-roadmap-design] 🟢 — roadmap expanded via interactive workshop
  with user (per-service RTO/RPO matrix for 10 services, CMS backup 2-phase plan,
  IIS migration track, 4 secondary topics documented as recommendations)
- file 3 impl-tasks  ready (spawned by roadmap-design):
  - cms-stopgap-backup-daily — Phase 1, plug RPO=∞ via daily rsync to kreknin
  - mssql-minio-migration-to-vds — Phase 2 enabler, achieves RPO 1h target
  - windows-hosting-vendor-research — design-task for IIS migration off home host
- unblock [admin-infra-project-review] 🔵 (last blocker cleared)
- expand .wiki/concepts/future-resilient-architecture-goals.md with §Workshop pass 1
  (canonical) above original §Pre-workshop placeholder (historical)

Key user-decisions zafiksirovany in workshop:
- CMS RTO 4h / RPO 1h (not 1h/15min — overkill for one-person infra)
- MSSQL+MinIO migrate to VDS (not Windows-side managed hosting)
- MSSQL Always-On AG rejected — log shipping every 60min sufficient
- IIS long-term dies with snolla-on-node; transitional via managed Windows host
- Cloud off-site = Yandex Object Storage when needed (kreknin already off-site)
- Monitoring = Uptime Kuma on VDS, high-priority among not-filed

Acceptance per spec (user confirmed plan + concrete impl-tasks top-3 + doc committed) — met.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 16:25:04 +03:00

63 lines
7.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.
# mssql-minio-migration-to-vds
## Goal
Перенести MSSQL контейнер + MinIO с [[../entities/windows-recovery-host]] на [[../entities/vds-kzntsv]] чтобы:
1. **Снять SPOF с windows-recovery-host** (домашняя машина) для критических CMS-данных
2. **Achieve target RPO 1ч** через подключение к существующему `vds-backup-rsync-kreknin` pipeline (tx log backups каждые 60 мин в существующий rsync→kreknin)
3. **Унифицировать DB park** — MSSQL рядом с pg/maria/mongo/redis в `/opt/stacks/databases/`
4. **Подготовить ground** для будущего IIS migration на managed Windows hosting ([[windows-hosting-vendor-research]] → impl-таска позже)
Это **Фаза 2** roadmap'а CMS backup'ов. После завершения — списать [[cms-stopgap-backup-daily]] pipeline.
## Key files / refs
- **Source MSSQL:** docker container на windows-host, image `mcr.microsoft.com/mssql/server:2019-latest`, volume `mssql_mssql_data`, 5 production DBs (MoreThenCms, Stayer*, stostayer, TireService) — см. [[../.wiki/concepts/recovery-architecture-snapshot]] §"Запущенные docker контейнеры"
- **Source MinIO:** docker container на windows-host, image `minio/minio:RELEASE.2020-07-13T18-09-56Z`, volume bind `./data`
- **Target MSSQL:** `/opt/stacks/databases/mssql/{data,certs,docker-compose.yml}` на VDS — паттерн как у existing DBs, см. [[../.wiki/entities/vds-kzntsv]]
- **Target MinIO:** `/opt/stacks/storage/minio/` (новый stack на VDS)
- **CMS connection strings (изменить):**
- MSSQL: `Data Source=localhost,1433``Data Source=mssql.vds.kzntsv.site,1433` (через traefik raw-TCP passthrough)
- MinIO: endpoint `localhost:9000``minio.vds.kzntsv.site:9000`
- **Existing backup pipeline для расширения:** `/opt/stacks/backup/scripts/run.sh` на VDS (см. [[../.tasks/vds-backup-rsync-kreknin]] — 🟢 done)
- **TLS pattern:** self-signed certs через traefik raw-TCP passthrough, см. [[../.wiki/concepts/db-tls-self-signed-via-traefik-raw-tcp]] + [[../.wiki/concepts/traefik-tcp-passthrough-vs-starttls]]
## Acceptance
1. **MSSQL container на VDS** запущен, 5 prod DBs восстановлены (cold cutover: stop CMS app pool → backup MSSQL host-side → restore on VDS → repoint connection strings → start CMS app pool)
2. **MinIO на VDS** запущен, content мигрирован (`mc mirror` от source к target)
3. **CMS connection strings updated** в web.config (или эквиваленте), sites функциональны (smoke test 8 hosts: 200 OK + asset loading + admin/assets/getList — это известный hot-path)
4. **Pre-cutover benchmark выполнен** — admin assets UI / search / catalog response times измерены до и после миграции, **latency degradation <2x** (target). Если worse — discussed с user перед commit'ом cutover (возможно retreat или оптимизация query patterns)
5. **Backup pipeline на VDS расширен:** добавлены в `run.sh`:
- `mssql_dump_full` ежедневно (как pg_dumpall pattern)
- `mssql_tx_log_backup` ежечасно (новая нога — `BACKUP LOG` через `docker exec mssql sqlcmd ...`)
- `minio_mirror` ежедневно (`mc mirror` либо rsync data dir)
6. **ntfy push verified** для расширенного pipeline (включает MSSQL+MinIO size/duration)
7. **`cms-stopgap-backup-daily` cron на windows-host отключён** после первого успешного VDS-pipeline run (atomic swap, не parallel-running, чтобы не оставлять confusing-state двух pipelines)
8. **Documented** в [[../.wiki/concepts/mssql-minio-on-vds]] (создать) с:
- architecture diagram (IIS → traefik VDS → MSSQL/MinIO containers)
- rollback recipe (если cutover failed — vernut' connection strings + reactivate stop-gap pipeline)
- migration runbook (что делал, в каком порядке)
## Decisions log
- 2026-05-21: создана из roadmap-workshop'а ([[../.wiki/concepts/future-resilient-architecture-goals]] §Фаза 2). User-confirmed: MSSQL+MinIO мигрируют на VDS (vs alternative — оставить на managed Windows host рядом с IIS). Reasons:
- DB park уже на VDS, unified backup operation
- Linux containers стабильнее и дешевле в обслуживании чем Windows-side MSSQL
- VDS уже работает, не плодим хосты
- Подготавливает ground для IIS-migration (после неё IIS host сможет быть thin — только web layer)
## Open questions
- [ ] **MSSQL Express vs Developer vs Standard на Linux container** — TBD по licensing. Production size MoreThenCms — проверить, помещается ли в Express limits (10GB per DB, 1410MB RAM). Если нет — Developer (бесплатно для non-prod, формально не для прод) или Standard ($$$$). Альтернатива — migration MSSQL → PostgreSQL (упомянуто в roadmap как long-term option) — отдельный major project.
- [ ] **MinIO migration approach**`mc mirror` overnight (zero-downtime если кратко) или maintenance window (cleaner)?
- [ ] **Cutover timing** — нужен ли downtime window клиентам, или можно zero-downtime через MSSQL log shipping (source → target replay, потом final switch)?
- [ ] **CMS connection-string change** — где живёт config (web.config? отдельный appsettings? hardcoded в DLL?). Если hardcoded — нужен DLL rebuild который требует build env, отложен в [[../.wiki/concepts/cms-admin-assets-root-folder-seed]] §"Долгосрочный TODO"
- [ ] **Hermes service на windows-host?** (упомянут как defer в [[../.wiki/entities/vds-kzntsv]] Open issues) — проверить не зависит ли от MSSQL/MinIO, если да — мигрируется заодно или ломается
## Risks
- **WAN latency IIS→MSSQL:** теперь 10-30ms vs localhost. Большинство CMS-операций batchey, не latency-sensitive. **Pre-cutover benchmark обязателен** для hot-paths (admin assets UI / search / каталоги) — flag если round-trip-heavy. См. acceptance item 4.
- **MSSQL Linux compat:** некоторые edge-case T-SQL features differ (CLR, FileStream, full-text search). Smoke test обязателен — `EXEC sp_helpdb` + проверить что нет CLR assemblies / FileStream filegroups в prod DBs.
- **TLS overhead:** rawTCP through traefik adds minor latency vs direct connection. Negligible (<1ms) но проверить.
- **Cutover rollback:** если CMS не работает после repoint — quick revert connection strings возможен **только** если MSSQL на windows-host оставлен running parallel ~24-48ч после cutover. План: stop receiving writes на windows-MSSQL (read-only), но container running, для emergency rollback. Через 48ч uptime — stop windows-MSSQL container, через неделю — `docker rm + docker volume rm`.
## Notes
Эта таска — major (1-2 недели работы realistic). Можно разбить на sub-phases при impl: (a) MSSQL container deploy + restore from backup, (b) connection string change + smoke, (c) MinIO migration, (d) backup pipeline integration. Каждая sub-phase = свой commit с atomic revert recipe.
Atomic revert (full): revert CMS web.config → windows-host MSSQL/MinIO; восстановить cms-stopgap-backup-daily cron; на VDS — `docker compose down -v` для mssql + minio stacks; удалить новые ноги из `run.sh`.