Files
admin/recovery-architecture-snapshot.md
vitya ae56813c8d docs(.wiki): ingest iis-host-migration 2026-05-19 session
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>
2026-05-19 12:51:35 +03:00

146 lines
10 KiB
Markdown
Raw 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.
---
title: Recovery architecture — текущая инфраструктура (2026-05-19)
type: concept
tags: [architecture, current-state, snapshot, recovery]
sources: [../sources/nas-recovery-session-2026-05-18.md, ../sources/iis-host-migration-2026-05-19.md]
updated: 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-страницы.
## Известные открытые баги
1. **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]]).
2. **rimiz.ru → 404** на host-IIS (и, скорее всего, до миграции на VM тоже). CMS-side, не инфра — mapping host header → CMS-сайт в БД.
3. **stostayer / stostayer.old timeout** при прямом обращении к host-IIS на `:8090/:8091`. Phase 2 миграция выполнена технически, но рантайм не отвечает — не разбирались, prod-трафик пока на VM.
4. **acme.json HTTP-01 renewal** будет фейлить для доменов с DNS не на нашем IP — нужен переезд на DNS-01 через REGRU до истечения сертификатов (~3 месяца).
5. **VM один раз "повисла" в сети** через 1-2 часа uptime — лечилось `ipconfig /release/renew` через VBoxManage guestcontrol. Подтверждено повторно в сессии 2026-05-19. Нужен auto-watchdog (или вообще выключить VM после миграции stayer).
6. **C:\inetpub\logs\** в VM растёт (6+ GB к recovery) — нужна ротация. На хосте логи начнут расти аналогично — те же меры понадобятся.
7. **docker.sock provider в traefik** не работает — но не блокирует (всё через file-provider). См. [[traefik-on-windows-docker-desktop]] Pitfall 3.
8. **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]].