From 1f4a581ea0f45cce48a5b13e625f4a7f6593daa3 Mon Sep 17 00:00:00 2001 From: vitya Date: Tue, 19 May 2026 11:11:00 +0300 Subject: [PATCH] chore(.tasks): add iis-on-host-migration task + next-session prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes nas-recovery (status done in STATUS.md), opens iis-on-host-migration as the next active task: migrate IIS sites from VirtualBox VM to native Windows host IIS to eliminate VBox as a stability layer. NEXT-SESSION-PROMPT.md is the kickoff brief for the next conversation — context, what to read, guardrails. Note: no push possible until gitea recovery (it was on the dead synology; backup of /docker/gitea/ exists on kreknin synology but not yet restored). Co-Authored-By: Claude Opus 4.7 (1M context) --- NEXT-SESSION-PROMPT.md | 49 ++++++++++++++++++++++++ STATUS.md | 8 ++++ iis-on-host-migration.md | 82 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 NEXT-SESSION-PROMPT.md create mode 100644 iis-on-host-migration.md diff --git a/NEXT-SESSION-PROMPT.md b/NEXT-SESSION-PROMPT.md new file mode 100644 index 0000000..5498721 --- /dev/null +++ b/NEXT-SESSION-PROMPT.md @@ -0,0 +1,49 @@ +# Prompt для следующей сессии + +Скопируй этот блок и вставь как первое сообщение: + +--- + +Привет! Продолжаем после recovery. **Контекст уже зафиксирован в** `.wiki/` (читай `overview.md` для навигации) **и в** `.tasks/STATUS.md`. + +**Кратко где мы сейчас:** +- Клиентские сайты живы и доступны из публичного интернета через цепочку: client → OpenWRT NAT → traefik 4443/8000 (на этом Windows-PC) → VirtualBox VM `snolla-recovery` → IIS + .NET 4.8 CMS. +- 5 баз восстановлены в MSSQL контейнере на хосте. MinIO/Elasticsearch/imgproxy тоже работают в Docker. +- 40 LE-сертификатов валидны, traefik на file-provider routing. + +**Задача этой сессии:** запустить активную задачу `nas-recovery` → `iis-on-host-migration`. Цель — перенести IIS-сайты из VM на нативный IIS Windows-хоста, чтобы избавиться от VBox как слоя нестабильности. Все материалы есть: backup сайтов в `C:\nas-recovery\vm-sites\` (11 GB), исходники в `projects/MoreThenCms\`, контейнеры с БД и сервисами уже работают на этом хосте. + +**Старт-команда:** +1. Прочитай `.tasks/iis-on-host-migration.md` целиком. +2. Прочитай `.wiki/entities/snolla-recovery-vm.md` и `.wiki/entities/windows-recovery-host.md` — что мы переносим и куда. +3. Прочитай `.wiki/concepts/cms-config-rewrite-pattern.md` — про UTF-8 BOM ловушку. +4. Спроси меня про **открытые вопросы** из `.tasks/iis-on-host-migration.md` (CMS abs paths, IIS app pool identity, .NET update, MinIO/Azure adapter). +5. После того как откроемся в вопросах — предложи план Phase 1+2 (анализ + импорт сайтов) одной аргументированной рекомендацией, не меню. Согласую — поедем. + +**Не делай без моего "да":** +- Менять traefik backends (это переключит prod-трафик). +- Останавливать VM до полной отладки нативного IIS. +- Удалять backup-копии (vm-sites/, snolla.ova). +- Любой push в git (gitea пока недоступен — он был на мёртвой синке, восстанавливать = отдельная задача). + +**Открытое:** МinIO/Azure-адаптер в CMS — я обещал пояснить, "не так все" как считалось. Готов рассказать когда дойдёт. + +Поехали. + +--- + +## Что почитать AI-агенту перед началом (для самопроверки контекста) + +- `.wiki/overview.md` — точки входа +- `.wiki/sources/nas-recovery-session-2026-05-18.md` — что было +- `.wiki/concepts/recovery-architecture-snapshot.md` — текущее состояние, request flow +- `.wiki/concepts/future-resilient-architecture-goals.md` — куда движемся в долгую +- `.tasks/STATUS.md` — закрытая задача `nas-recovery` (status: done) +- `.tasks/iis-on-host-migration.md` — активная задача, открытые вопросы +- Это сообщение + +## Полезные пароли/ключи (хранятся в Web.config / .env, не в чате) +- MSSQL SA: см. `C:\Users\vitya\projects\docker\diskstation\mssql\.env` +- Production MSSQL для CMS: user `snolla` (production password в Web.config-ах в VM и в `production-data/docker-compose.yml`) +- MinIO access/secret keys: `C:\Users\vitya\projects\docker\diskstation\minio\docker-compose.yml` +- SSH-ключи на хосте: `~/.ssh/id_ed25519_kreknin`, `~/.ssh/id_ed25519_openwrt`, `~/.ssh/id_ed25519_snolla_vm` diff --git a/STATUS.md b/STATUS.md index 4ed6b46..f060fb9 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,6 +1,14 @@ # Task Board _Updated: 2026-05-18_ +## ⚪ [iis-on-host-migration] — перенести IIS-сайты из VM на нативный Windows-host IIS +**Status:** ready (поставлена 2026-05-19, старт следующей сессией) +**Where I stopped:** план в [`iis-on-host-migration.md`](iis-on-host-migration.md), prompt для следующей сессии в [`NEXT-SESSION-PROMPT.md`](NEXT-SESSION-PROMPT.md). Резервные копии готовы: `C:\nas-recovery\vm-sites\wwwroot\` (8.7 GB) + `stayer\` (2.2 GB). Контейнеры (MSSQL/MinIO/ES/imgproxy/traefik) уже на хосте, их не трогаем. +**Next action:** в новой сессии — открыть `iis-on-host-migration.md`, обсудить открытые вопросы (abs paths в CMS, AppPool identity, MinIO/Azure adapter), потом Phase 1+2. +**Branch:** master + +--- + ## 🟢 [nas-recovery] — клиентские сайты восстановлены, работают из публичного интернета **Status:** done (2026-05-19 ~10:00 MSK — 15 часов работы) **Final state:** OpenWRT NAT → traefik 2.6.6 (host:8000/4443) → VirtualBox VM snolla-recovery (IIS + CMS) + docker-стек на хосте (MSSQL/MinIO/ES/imgproxy/nginx). 13 client routes, 40 LE certs валидны. Проверено: пользовательский клиент из публичного интернета открывает snolla.com, pilorama98.ru, labtools.ru/pro, tandemmebel.ru, emspb.ru. diff --git a/iis-on-host-migration.md b/iis-on-host-migration.md new file mode 100644 index 0000000..7c19777 --- /dev/null +++ b/iis-on-host-migration.md @@ -0,0 +1,82 @@ +# iis-on-host-migration + +## Goal +Перенести IIS-сайты MoreThenCms из VirtualBox VM (`snolla-recovery`) на нативный IIS Windows-хоста. VM остаётся как hot fallback на первое время; после успешного нативного-запуска — выключаем VM, освобождаем 4 GB RAM + ~92 GB диска. + +**Зачем:** VM на VBox = лишний слой нестабильности (видели один network hang). Нативный IIS на хосте — проще, быстрее, без NAT-форвардов и VBox-капризов. Контейнеры MSSQL/MinIO/etc. уже на этом же хосте — устраняем сетевой роутинг. + +## Что у нас уже есть + +- ✅ IIS установлен на хосте (W3SVC running, default site empty, [`.wiki/entities/windows-recovery-host`](../.wiki/entities/windows-recovery-host.md)) +- ✅ .NET Framework 4.8.1 на хосте +- ✅ Полная копия `C:\inetpub\wwwroot\` из VM → `C:\nas-recovery\vm-sites\wwwroot\` (8.69 GB) +- ✅ Полная копия `C:\stayer\` из VM → `C:\nas-recovery\vm-sites\stayer\` (2.21 GB) +- ✅ MSSQL контейнер на host:1433 (5 production DB) +- ✅ MinIO на host:9000, Elasticsearch на host:9200, imgproxy на host:8787/8788 +- ✅ Исходники CMS в `C:\Users\vitya\projects\MoreThenCms\` (Git репо) +- ✅ Traefik с 13 client routes (сейчас target = `host.docker.internal:18080` = VM) + +## Key files +- `C:\nas-recovery\vm-sites\wwwroot\` — IIS-сайты из VM +- `C:\nas-recovery\vm-sites\stayer\` — stostayer-проекты +- `C:\inetpub\wwwroot\` — целевое расположение на хосте +- `C:\Users\vitya\projects\docker\diskstation\traefik\data\custom\*.yml` — backends, нужно переключить с `host.docker.internal:18080` на `localhost:80` (или какие-то local IIS-bindings) +- `Web.config` файлы — connection strings уже патчены на `10.0.2.2`, нужно вернуть на `localhost` или `127.0.0.1` для нативного IIS + +## План этапов + +### Phase 1 — Анализ и подготовка +- Изучить IIS site bindings в VM (MoreThenCms.Web `*:80`, Snolla.IdentityManager `*:80`, stostayer `*:8080`, stostayer.old `*:8081`) +- Решить port-mapping на хосте — оставлять 80? Или другие порты, traefik на 80/443 переадресует? +- Изучить, какие IIS modules/features нужны (URL Rewrite, ARR, обязательные .NET runtimes — может потребоваться доставить) + +### Phase 2 — Импорт сайтов на хост +- Скопировать `C:\nas-recovery\vm-sites\wwwroot\*` → `C:\inetpub\wwwroot\` (или другой root) +- Скопировать `C:\nas-recovery\vm-sites\stayer\` → `C:\stayer\` +- Создать application pools (`.NET v4.5` или эквивалент) для каждого сайта в IIS Manager +- Создать sites в IIS: + - `MoreThenCms.Web` (port 80 / другой) + - `Snolla.IdentityManager` + - `stostayer` (port 8080) + - `stostayer.old` (port 8081) +- Web.config patch: `Data Source=10.0.2.2` → `Data Source=localhost` (или `127.0.0.1` / `.\` ; UTF-8 BOM!) + +### Phase 3 — Перенос на хост IIS, тест +- Stop VM (но не удалять!) +- Update traefik backends в `data/custom/*.yml`: + - `http://host.docker.internal:18080/` → `http://host.docker.internal:80/` (или какой порт IIS использует) + - `:18180` → `:8080`, `:18181` → `:8081` +- traefik restart +- Прокликать все 11 клиентских доменов из публичного интернета +- Убедиться что .NET Framework 4.8.1 справляется, нет missing assemblies, нет permission issues на App_Data / temp folders + +### Phase 4 — Cleanup VM +- Когда стабильно ~неделя на хост-IIS — выключить VM окончательно +- `VBoxManage controlvm "snolla-recovery" poweroff` +- Удалить port forwards в OpenWRT, которые больше не нужны (host:18080, host:18180, etc.) — это уже не traefik backend +- (Опционально) удалить VM из VBox: `VBoxManage unregistervm "snolla-recovery" --delete`. Это освобождает 92 GB на C:. +- Удалить `C:\nas-recovery\backup\snolla\snolla.ova` (42.5 GB) и `C:\nas-recovery\vm-sites\` (11 GB) — backup уже не нужен. + +### Phase 5 — Бонусы +- Установить **URL Rewrite + ARR** для нормальной обработки X-Forwarded-Proto headers (fix CMS-редиректа с `:4443` в URL — см. [`.wiki/concepts/traefik-on-windows-docker-desktop`](../.wiki/concepts/traefik-on-windows-docker-desktop.md)) +- Настроить log rotation для C:\inetpub\logs\ +- Application Initialization (для warm-start CMS) — IIS Optional Feature, autostart сайтов + +## Open questions +- [ ] CMS-код использует абсолютные пути типа `C:\inetpub\wwwroot\MoreThenCms.Web\` (видели в Web.config ``)? Если да — путь должен остаться, либо обновить. +- [ ] Authentication / IIS Application Identity — какая учётка должна крутить app pool? (LocalSystem? NetworkService? IIS AppPool\?) +- [ ] Нужен ли .NET Framework Repair / SAC update перед миграцией? +- [ ] Что с storage providers (Azure-SDK adapter в CMS)? — Связано с открытым вопросом о MinIO/Azure, что пользователь обещал прояснить. + +## Decisions log +- 2026-05-19: задача поставлена после успешного recovery в VM. VM показала себя нестабильной (один network hang за день uptime), решено мигрировать на нативный IIS как более простой и предсказуемый стек. + +## Completed steps +- [x] Pulled VM sites to host (49 минут tar+ssh, 11 GB total) +- [x] IIS на хосте установлен (в рамках recovery, ещё нативно не использовался) + +## Notes + +- VM не удалять до конца Phase 3 — это working fallback. Только после двух недель стабильной работы host-IIS. +- Git push в gitea невозможен пока — gitea был на мёртвой синке. Восстановление gitea — отдельная задача (есть бэкап `/docker/gitea/` 2.6 GB на kreknin-синке, можно поднять локально или временно класть code в другое место). +- При работе с Web.config — **обязательно UTF-8 BOM** через `[System.IO.File]::WriteAllText` с `[System.Text.UTF8Encoding]::new($true)`. Иначе IIS 500.19. Детали в [`.wiki/concepts/cms-config-rewrite-pattern`](../.wiki/concepts/cms-config-rewrite-pattern.md).