New source page documenting migration of MoreThenCms.Web from snolla-recovery VM to native host IIS. Updates: - recovery-architecture-snapshot: new chain (traefik -> host:80) + secondary chain for stostayer still on VM - snolla-recovery-vm: demoted, IdentityManager port fix (8089 not 80), sub-apps detailed - windows-recovery-host: 3 native IIS sites + C:\sites\, C:\stayer\ - log.md: ingest + decision entries Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
10 KiB
title, type, tags, sources, updated
| title | type | tags | sources | updated | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Recovery architecture — текущая инфраструктура (2026-05-19) | concept |
|
|
2026-05-19 |
Recovery Architecture Snapshot
Снимок production-инфраструктуры на 2026-05-19, после миграции основного CMS на нативный IIS хоста (iis-host-migration-2026-05-19). Это рабочее, но временное состояние — single-point-of-failure на бытовом железе. Замечания по улучшению — future-resilient-architecture-goals.
Цепочка запроса от клиента до CMS — 10 главных доменов (snolla.com и др.)
Клиент (browser)
→ DNS resolve (REGRU): *.kzntsv.site, snolla.com, labtools.pro/ru, pilorama98.ru,
tandemmebel.ru, emspb.ru, kupimknigi.spb.ru, maljarka.tandemmebel.ru,
sestech.ru, ics-artmaterials.com (rimiz.ru — резолвится, но CMS отдаёт 404)
→ 94.19.247.14 (public IP, статический у провайдера)
→ router OpenWRT (192.168.1.1) [[openwrt-router]]
→ NAT 443 → 192.168.1.143:4443
→ NAT 80 → 192.168.1.143:8000
→ Windows-PC (192.168.1.143) [[windows-recovery-host]]
→ traefik 2.6.6 на 4443/8000
→ TLS termination, certResolver=letsEncrypt из acme.json
→ match по Host header (file-provider rules в data/custom/*.yml)
→ backend = http://host.docker.internal:80/ ← с 2026-05-19
→ Native IIS на хосте :80, site MoreThenCms.Web
→ AppPool MoreThenCms.Web (.NET v4.0 Integrated, ApplicationPoolIdentity)
→ physicalPath C:\sites\MoreThenCms.Web
→ ASP.NET CMS code (.NET Framework 4.8.1 на хосте)
→ Connection strings:
→ MSSQL: Data Source=localhost,1433 (прямо в MSSQL container)
→ MinIO/storage: TBD точная схема (вопрос снят пользователем)
→ Elasticsearch: не используется CMS (там books-стек)
→ MSSQL container на host:1433
→ 5 production DB (MoreThenCms, Stayer*, stostayer, TireService)
← HTTP response back through chain
Цепочка для stostayer / stostayer.old (всё ещё на VM)
Клиент → ... → traefik
→ backend = host.docker.internal:18180 (stostayer) или :18181 (stostayer.old)
→ VBox NAT port forward → VM:8080 или VM:8081
→ IIS в [[snolla-recovery-vm]] → C:\stayer\MoreThenCms.Web или C:\stayer\stostayer.old
→ Connection strings:
→ stostayer: Data Source=89.253.219.2,1433 (внешний production MSSQL — НЕ наш контейнер)
→ stostayer.old subapps (calc/price/tireService) — отдельные pools, TBD source
VM также имеет Snolla.IdentityManager :8089 и неиспользуемые копии главного CMS — публично через traefik не доступны.
Запущенные docker контейнеры на хосте
| Container | Image | Port (host) | Volume |
|---|---|---|---|
| traefik | traefik:v2.6.6 |
4443, 8000, 8080 | named: traefik_traefik_letsencrypt; bind: data/traefik.yml, data/custom/ |
| mssql | mcr.microsoft.com/mssql/server:2019-latest |
1433 | named: mssql_mssql_data (filled from production tar) |
| minio | minio/minio:RELEASE.2020-07-13T18-09-56Z |
9000 | bind: ./data |
| imgproxy | darthsim/imgproxy:latest |
8787 | (нет state) |
| imgproxy-nginx | nginx:alpine |
8788 | bind: ./nginx/cache, ./nginx/nginx.conf |
| elasticsearch | elasticsearch:7.10.1 |
9200 | bind: ./data |
Все на docker network proxy (external) — это позволяет traefik резолвить minio, elasticsearch, imgproxy-nginx напрямую по docker DNS.
Traefik routes (с 2026-05-19)
13 client домен-маршрутов в data/custom/. 11 главных переключены на хост-IIS :80 (iis-host-migration-2026-05-19), 2 stostayer остаются на VM:
| File | Hosts | Backend |
|---|---|---|
| snolla.yml | snolla.com + 10 subdomains | host.docker.internal:80 (host-IIS) |
| rimiz.yml | rimiz.ru, www.rimiz.ru | host.docker.internal:80 (host-IIS, но CMS отдаёт 404 — известный issue) |
| labtools.yml | labtools.ru, www.labtools.ru | host.docker.internal:80 |
| labtoolspro.yml | labtools.pro, www.labtools.pro | host.docker.internal:80 |
| pilorama98.yml | pilorama98.ru, www.pilorama98.ru | host.docker.internal:80 |
| tandemmebel.yml | tandemmebel.ru, www.tandemmebel.ru | host.docker.internal:80 |
| emspb.yml | emspb.ru, www.emspb.ru | host.docker.internal:80 |
| kupimknigi.yml | kupimknigi.spb.ru | host.docker.internal:80 |
| maljarka.yml | maljarka.tandemmebel.ru | host.docker.internal:80 |
| sestech.yml | sestech.ru, www.sestech.ru | host.docker.internal:80 |
| isc-artmaterials.yml | ics-artmaterials.com, www.ics-artmaterials.com | host.docker.internal:80 |
| oldstostayer.yml | (старый stostayer) | host.docker.internal:18181 (всё ещё VM:8081) |
| stostayer.yml | stostayer.ru или похожий | host.docker.internal:18180 (всё ещё VM:8080) |
Backup конфигов до переключения: *.yml.bak-phase3-2026-05-19.
Плюс file-provider маршруты для инфраструктурных хостов:
| File | Host | Backend |
|---|---|---|
| elasticsearch.yml | elasticold.kzntsv.site | http://elasticsearch:9200 + basicAuth books:... |
| minio.yml | minio.kzntsv.site | http://minio:9000 |
| imgproxy.yml | imgproxy.kzntsv.site | http://imgproxy-nginx:80 |
И мёртвые (не отключены, но смотрят в никуда):
disk.yml→ 192.168.1.10:5005 (Synology disk на мёртвой синке)dsm.yml→ 192.168.1.10:5000 (DSM мёртвой синки)
DNS
Все домены остались указывать на 94.19.247.14 (public IP, статический). REGRU как registrar/DNS. Никаких DNS-изменений во время recovery не требовалось — only router NAT перенастроен.
Backup инфраструктура
Текущая (на момент 2026-05-19):
- kreknin-synology держит Hyper Backup репо мёртвой синки (~430 GB). Новых бэкапов с recovered Windows-PC НЕТ — рабочее состояние на Windows-PC не бэкапится никуда.
- Локально на Windows-PC:
C:\nas-recovery\vm-sites\(~11 GB, дамп IIS sites из VM) — резерв если VM полностью умрёт.
Дыра: если Windows-PC сгорит — ВСЁ ляжет. Никакой репликации, никакого off-site backup для нового рабочего состояния.
SSH ключи и доступ
- windows-recovery-host → kreknin-synology:
id_ed25519_kreknin(vitya@195.19.90.188) - windows-recovery-host → openwrt-router:
id_ed25519_openwrt(root@192.168.1.1) - windows-recovery-host → snolla-recovery-vm:
id_ed25519_snolla_vm(vitya@127.0.0.1:8022)
После recovery — отозвать публичные ключи Claude из этих 3 машин (~/.ssh/authorized_keys или эквивалент). См. соответствующие entity-страницы.
Известные открытые баги
- X-Forwarded headers не передаются от traefik в IIS → CMS делает редирект с
:4443в URL. См. traefik-on-windows-docker-desktop Pitfall 5. После миграции на host-IIS актуально, fix — URL Rewrite + ARR (Phase 5 в iis-host-migration-2026-05-19). - rimiz.ru → 404 на host-IIS (и, скорее всего, до миграции на VM тоже). CMS-side, не инфра — mapping host header → CMS-сайт в БД.
- stostayer / stostayer.old timeout при прямом обращении к host-IIS на
:8090/:8091. Phase 2 миграция выполнена технически, но рантайм не отвечает — не разбирались, prod-трафик пока на VM. - acme.json HTTP-01 renewal будет фейлить для доменов с DNS не на нашем IP — нужен переезд на DNS-01 через REGRU до истечения сертификатов (~3 месяца).
- VM один раз "повисла" в сети через 1-2 часа uptime — лечилось
ipconfig /release/renewчерез VBoxManage guestcontrol. Подтверждено повторно в сессии 2026-05-19. Нужен auto-watchdog (или вообще выключить VM после миграции stayer). - *C:\inetpub\logs* в VM растёт (6+ GB к recovery) — нужна ротация. На хосте логи начнут расти аналогично — те же меры понадобятся.
- docker.sock provider в traefik не работает — но не блокирует (всё через file-provider). См. traefik-on-windows-docker-desktop Pitfall 3.
- MinIO/Azure storage в CMS — вопрос пользователем снят (Q4 в сессии 2026-05-19), оставлено как есть.
Single Points of Failure
- Один Windows-PC (если сгорит — всё ляжет)
- Один публичный IP / провайдер
- Один WiFi-канал
- Один OpenWRT-роутер
- Один VBox VM (single instance, не replicate)
- Один MSSQL контейнер (single primary, нет replica)
- Один MinIO (single drive, не distributed)
Каждый SPOF — кандидат на улучшение в future-resilient-architecture-goals.