chore(.tasks): iis-on-host-migration -> paused after rollback
Status: done (false) -> paused (true). Миграция была сделана, сломала prod (Docker port-loop), откатили. Артефакты на хосте остались inert для следующей попытки. - STATUS: 🟢 done -> 🟡 paused с детальным where-I-stopped - iis-on-host-migration: Phase 9 rollback задокументирован, что НЕ делать в следующей попытке (cross-ref на post-mortem) - NEXT-SESSION-PROMPT: переписан для retry-сценария — обязательное чтение post-mortem перед началом, recipe из 5 пунктов Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,45 +4,54 @@
|
||||
|
||||
---
|
||||
|
||||
Привет! Продолжаем после **успешной миграции основного CMS на нативный IIS хоста** (см. `.wiki/sources/iis-host-migration-2026-05-19.md` и обновлённый `.wiki/concepts/recovery-architecture-snapshot.md`).
|
||||
Привет! Возвращаемся к **iis-on-host-migration**. **Перед началом обязательно прочти**:
|
||||
1. `.wiki/concepts/iis-migration-2026-05-19-postmortem.md` — почему предыдущая попытка сломала prod
|
||||
2. `.wiki/sources/iis-host-migration-2026-05-19.md` (Phase 9 в конце — про rollback)
|
||||
3. `.wiki/concepts/recovery-architecture-snapshot.md` (актуальный VM-chain)
|
||||
|
||||
**Кратко где мы сейчас:**
|
||||
- 10 главных клиентских доменов (snolla.com + 9 остальных) идут client → OpenWRT → traefik → **нативный IIS хоста** → MSSQL container. VM из prod-пути выведена для этих 10 доменов.
|
||||
- `MoreThenCms.Web` на хосте: `C:\sites\MoreThenCms.Web`, AppPool `MoreThenCms.Web` (.NET v4.0 Integrated, ApplicationPoolIdentity), bind `*:80`.
|
||||
- traefik backend для 11 yml пропатчен на `host.docker.internal:80` (backup `*.yml.bak-phase3-2026-05-19`).
|
||||
- VM продолжает крутить только stostayer (`:18180`) и stostayer.old (`:18181`) — их traefik backend на VM не трогали.
|
||||
**Кратко где мы сейчас (после rollback):**
|
||||
- Prod снова через VM `snolla-recovery` (как было до session 2026-05-19). 11 main routes + 2 stayer routes в traefik → `host.docker.internal:18080/18180/18181` → VM IIS.
|
||||
- На хосте есть **inert** артефакты предыдущей попытки миграции — НЕ удалять без явного решения:
|
||||
- `C:\sites\{snolla, stostayer, stostayer.old, snolla-identity-manager}` — Web.config'и уже patched (sitePath, conn-strings).
|
||||
- IIS sites/pools `snolla, stostayer, stostayer.old` готовы (.NET v4.0 Integrated, ApplicationPoolIdentity, ACL).
|
||||
- Traefik backup-stamps `*.bak-phase3-2026-05-19`, `*.bak-stayer-switch-2026-05-19`, `*.bak-hostip-2026-05-19`.
|
||||
|
||||
**Открытые задачи (выбрать одну):**
|
||||
1. **stostayer / stostayer.old** — сайты `:8090/:8091` на хосте созданы, но локальный `Invoke-WebRequest` даёт timeout. Разобраться: cold-start ASP.NET? Web.config conn-string на 89.253.219.2 не отвечает? AppPool краш? Глянуть Event Viewer + W3SVC logs. После фикса — переключить traefik (`stostayer.yml`, `oldstostayer.yml`).
|
||||
2. **rimiz.ru → 404** — host header не маппится на CMS-сайт (на host-IIS и, вероятно, до миграции тоже). Найти в БД таблицу mapping host→site, проверить запись для rimiz.ru.
|
||||
3. **Phase 5** — URL Rewrite + ARR MSI (фикс `:4443` в CMS-редиректах), Application Initialization (warm-start), log rotation `C:\inetpub\logs\`.
|
||||
4. **Cleanup VM** — только после (1). `VBoxManage controlvm "snolla-recovery" poweroff`, удалить port forwards 18080/18180/18181/18189 в OpenWRT, опционально `unregistervm --delete` (освобождает 92 GB).
|
||||
**Цель повторной попытки** — выполнить миграцию по recipe из post-mortem, без повторения 10 ошибок:
|
||||
|
||||
1. **Backend port — НЕ :80.** Использовать `:18080` на хосте (старый VM NAT port forward, теперь свободен после `unregistervm` или после остановки VM). Или другой свободный (НЕ совпадающий с traefik publish-ports `:8000, :4443, :8080`). Это избегает Docker NAT loop.
|
||||
2. **Smoke test с `-MaximumRedirection 0` / `--max-redirs 0`** + read first response. Если `Location` == request URL или близко → loop, fail fast.
|
||||
3. **Тест из НЕ-LAN сети** (телефон через мобильный интернет, VPS curl) до commit'a — не доверять local smoke.
|
||||
4. **Параллельный run VM x 24h+** — НЕ savestate'ить VM на следующий же день. Держать как hot fallback хотя бы сутки реального трафика.
|
||||
5. **Atomic revert plan ДО старта** — backup всех traefik yml, написать "если что — paste this" revert-команду заранее.
|
||||
|
||||
**Не делай без моего "да":**
|
||||
- Любые traefik patches (это меняет prod-трафик).
|
||||
- Любые destructive операции на `C:\sites\`, `C:\stayer\`, `C:\nas-recovery\vm-sites\`.
|
||||
- Глушить VM.
|
||||
- Push в git (gitea пока на мёртвой синке).
|
||||
- Любые traefik patches (меняет prod-трафик).
|
||||
- Любые destructive операции на `C:\sites\`, `C:\nas-recovery\vm-sites\`, snolla.ova.
|
||||
- Глушить VM до подтверждённой 24h+ стабильности host'а.
|
||||
- Push в git (gitea пока на мёртвой синке, и autopush не разрешён в любом случае).
|
||||
|
||||
**Контекстные пароли** (в Web.config / .env, не в чате):
|
||||
- MSSQL SA: `C:\Users\vitya\projects\docker\diskstation\mssql\.env`
|
||||
- Production MSSQL для CMS: user `snolla`, password в `C:\sites\MoreThenCms.Web\Web.config` (`fXkH4@8O%3pc`)
|
||||
- VM SSH: `~/.ssh/id_ed25519_snolla_vm` → `vitya@127.0.0.1:8022` (NAT-forward!)
|
||||
- Если ключ не подойдёт — пароль admin vitya в VM: `Pryakhin9`
|
||||
- snolla CMS conn: user `snolla`, password в `C:\sites\snolla\Web.config` (`fXkH4@8O%3pc`)
|
||||
- stostayer (новый): user `stayer_site`, password в `C:\sites\stostayer\Web.config` (`^I9D)LB)DK)8J#xBDG$t}W&_ioaT!M!LF`, XML-escape!)
|
||||
- VM SSH: `~/.ssh/id_ed25519_snolla_vm` → `vitya@127.0.0.1:8022` (NAT-forward)
|
||||
- VM admin password: `Pryakhin9`
|
||||
|
||||
Поехали.
|
||||
Поехали — но **сначала прочти post-mortem полностью**.
|
||||
|
||||
---
|
||||
|
||||
## Что почитать AI-агенту перед началом (для самопроверки контекста)
|
||||
|
||||
- `.wiki/overview.md` — точки входа
|
||||
- `.wiki/sources/iis-host-migration-2026-05-19.md` — что было сделано в прошлой сессии (актуальный source)
|
||||
- `.wiki/sources/nas-recovery-session-2026-05-18.md` — почему вообще на этом хосте всё
|
||||
- `.wiki/concepts/recovery-architecture-snapshot.md` — **обновлённая** chain после миграции
|
||||
- `.wiki/entities/snolla-recovery-vm.md` — VM в статусе demoted
|
||||
- `.wiki/entities/windows-recovery-host.md` — добавлены native IIS sites
|
||||
- `.wiki/concepts/cms-config-rewrite-pattern.md` — UTF-8 BOM ловушка
|
||||
- `.tasks/STATUS.md` — paused задача `iis-on-host-migration`
|
||||
- `.tasks/iis-on-host-migration.md` — детальный план + completed steps + решения
|
||||
- **`.wiki/concepts/iis-migration-2026-05-19-postmortem.md`** ← critical (10 ошибок + recipe)
|
||||
- `.wiki/sources/iis-host-migration-2026-05-19.md` (включая Phase 9 в конце)
|
||||
- `.wiki/sources/nas-recovery-session-2026-05-18.md` — почему вообще этот хост
|
||||
- `.wiki/concepts/recovery-architecture-snapshot.md` — актуальный VM-chain
|
||||
- `.wiki/entities/snolla-recovery-vm.md` — VM active prod
|
||||
- `.wiki/entities/windows-recovery-host.md` — host inert artifacts
|
||||
- `.wiki/concepts/cms-config-rewrite-pattern.md` — UTF-8 BOM
|
||||
- `.wiki/concepts/webconfig-password-xml-escape.md` — `&` → `&` в conn-string
|
||||
- `.tasks/STATUS.md`
|
||||
- `.tasks/iis-on-host-migration.md` — Phase 1-9 история
|
||||
- Это сообщение
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# Task Board
|
||||
_Updated: 2026-05-19_
|
||||
|
||||
## 🟡 [iis-on-host-migration] — основной CMS на хосте, stostayer ещё на VM
|
||||
**Status:** paused (Phase 1-3 для главного CMS — done 2026-05-19; stostayer + rimiz issues + Phase 4-5 — pending)
|
||||
**Where I stopped:** 10 из 11 главных доменов (snolla.com, labtools.pro/ru, pilorama98.ru, tandemmebel.ru, emspb.ru, kupimknigi.spb.ru, maljarka.tandemmebel.ru, sestech.ru, ics-artmaterials.com) идут через traefik → host-IIS (`C:\sites\MoreThenCms.Web` :80). rimiz.ru → 404 (CMS-side). stostayer/stostayer.old технически развёрнуты на хосте (`:8090/:8091`), но локальный smoke = timeout — traefik для них остался на VM (`:18180/:18181`).
|
||||
**Next action:** один из трёх — (а) починить stostayer на хосте + переключить traefik (или явно решить не мигрировать), (б) разобраться с rimiz.ru 404, (в) сделать Phase 5 (URL Rewrite + ARR, чтобы убрать `:4443` из CMS-редиректов).
|
||||
## 🟡 [iis-on-host-migration] — попытка не удалась, ROLLBACK; готов для следующей попытки по recipe
|
||||
**Status:** paused (2026-05-19 вечер — миграция была сделана, **сломала prod**, откатили на VM; post-mortem в `.wiki/concepts/iis-migration-2026-05-19-postmortem.md`).
|
||||
**What happened:** через ~10 мин после "done"-объявления пользователь увидел `502 Bad Gateway` → `TOO_MANY_REDIRECTS`. Root cause — Docker port-collision: traefik backend `host.docker.internal:80` резолвится через Docker Desktop NAT обратно в сам traefik (на его :80 HTTP entrypoint), `https.yml` http-catchall middleware отдавал 301 → loop. Реактивно ломал ещё час каскадными изменениями.
|
||||
**Where I stopped (after revert):** prod снова через VM (traefik backends восстановлены из `.bak-phase3`, VM startvm + ipconfig /release /renew). На хосте остались inert: `C:\sites\{snolla, stostayer, stostayer.old, snolla-identity-manager}` + IIS sites + AppPools + 3 backup-stamps в traefik/data/custom/.
|
||||
**Next action:** **сначала прочитать post-mortem** (`.wiki/concepts/iis-migration-2026-05-19-postmortem.md`), затем заново попробовать миграцию по recipe (избежать backend port :80, smoke с `-MaximumRedirection 0`, тест из НЕ-LAN сети, parallel VM x N часов, atomic revert plan).
|
||||
**Branch:** master
|
||||
|
||||
---
|
||||
|
||||
@@ -86,12 +86,34 @@
|
||||
- 2026-05-19: **AppPool identity = ApplicationPoolIdentity** для всех 3 пулов (default outside SCM, безопасно). ACL `:(OI)(CI)M` (Modify) рекурсивно на site root.
|
||||
- 2026-05-19: **Path strategy = C:\sites\\** (не `C:\inetpub\wwwroot\`) — пользователь выбрал (б) в Q1.
|
||||
|
||||
## Status
|
||||
- ✅ MoreThenCms.Web на хосте обслуживает 10 главных доменов через traefik.
|
||||
- ⏳ rimiz.ru → 404 (CMS-side mapping issue).
|
||||
- ⏳ stostayer / stostayer.old: технически перенесены, runtime fail на хосте, prod-трафик пока на VM.
|
||||
- ⏳ Phase 4 (cleanup VM) — пока нельзя, нужны stostayer.
|
||||
- ⏳ Phase 5 (URL Rewrite + ARR + log rotation + AppInit) — bonus, можно сразу.
|
||||
## Status — ROLLBACK (2026-05-19 вечер)
|
||||
|
||||
**Миграция сделана, сломала prod, откатили.** См. полный разбор в `.wiki/concepts/iis-migration-2026-05-19-postmortem.md`.
|
||||
|
||||
- ⚠️ Phase 1-8 выполнены технически, но Phase 3 ввёл Docker port-loop (`host.docker.internal:80` резолвится через Docker Desktop NAT обратно в сам traefik, `https.yml` redirect-to-https middleware → 301 → loop). Симптомы появились ~10 мин после моего "done" → 502 → TOO_MANY_REDIRECTS.
|
||||
- ✅ **Revert (Phase 9) успешен:** VM поднята из savestate, traefik backends восстановлены из `.bak-phase3` → trafic снова через VM (как до session).
|
||||
- ✅ Артефакты для следующей попытки **сохранены** на хосте: `C:\sites\{snolla, stostayer, stostayer.old, snolla-identity-manager}` + IIS sites + AppPools + 3 traefik backup-stamp серий.
|
||||
|
||||
## Completed Phase 4-9 (вечер 2026-05-19)
|
||||
|
||||
- [x] **Phase 4 — реорг** `C:\sites\`: rename `MoreThenCms.Web → snolla`, move `C:\stayer\MoreThenCms.Web → C:\sites\stostayer`, move `C:\stayer\stostayer.old → C:\sites\stostayer.old`, move + kebab-rename `C:\stayer\Snolla.IdentityManager → C:\sites\snolla-identity-manager`. Удалены 3 sub-app папки. `C:\stayer\` снёс полностью.
|
||||
- [x] **Phase 4 — IIS rename**: site `MoreThenCms.Web → snolla`, pool пересоздан как `snolla` (rename невозможен in-place), site rebound, физпуть обновлён на `C:\sites\<name>` для всех 3, sitePath в Web.config'ах подправлен под новые пути. ACL re-granted.
|
||||
- [x] **Phase 5 — stostayer.old DB-fix**: `Data Source=10.0.2.2` → `localhost`. После — `:8091` → 200 локально (была наша ошибка в Phase 2 — пропустили этот файл).
|
||||
- [x] **Phase 6 — stostayer DB-migration**: старый `89.253.219.2,1433` не reachable. Новые creds: `www.stostayer.ru,1433`, user `stayer_site`. Patched Web.config. Поймана и зафиксирована **новая gotcha** в [[webconfig-password-xml-escape]] — `&` в пароле нужно XML-escape как `&`.
|
||||
- [x] **Phase 7 — traefik privacy**: `stostayer.yml` и `oldstostayer.yml` переименованы в `.yml.disabled` (потом возвращены в Phase 9). Backup: `*.yml.bak-stayer-switch-2026-05-19`.
|
||||
- [x] **Phase 8 — VM savestate**: `savestate`. VMState=saved (потом возвращена в Phase 9). **БЫЛО ПРЕЖДЕВРЕМЕННЫМ.**
|
||||
- [x] **Phase 9 — ROLLBACK** (после catastrophe): `VBoxManage startvm`, ipconfig release/renew для разморозки network, traefik yml восстановлены из `.bak-phase3-2026-05-19`, stayer .yml.disabled удалены и yml восстановлены из `.bak-stayer-switch`, `docker restart traefik`. Public smoke — 7 хостов через VM-chain ответили (2× 200, 5× 301 CMS-redirect = normal), пользователь подтвердил в браузере.
|
||||
|
||||
## Что НЕ делать в следующей попытке
|
||||
|
||||
См. полный recipe в `.wiki/concepts/iis-migration-2026-05-19-postmortem.md`, кратко:
|
||||
- **НЕ** использовать backend `host.docker.internal:80` (Docker NAT loopback с traefik HTTP entrypoint :80)
|
||||
- **НЕ** тестировать только `-MaximumRedirection 5` (скрывает loop)
|
||||
- **НЕ** тестировать только из LAN (router-hairpin lying)
|
||||
- **НЕ** замораживать VM раньше чем через 24-48h стабильности host-стека
|
||||
- **НЕ** делать reorg/rename in same session as migration (атомность важна)
|
||||
- **НЕ** объявлять "done" до 24h+ uptime + теста из НЕ-LAN сети
|
||||
- При первом anomaly — **STOP, revert на known-good, понять, потом fix** (НЕ каскадные reactive changes)
|
||||
|
||||
## Notes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user