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:
2026-05-19 15:08:17 +03:00
parent 3d6a3e8c15
commit acb1c8e126
3 changed files with 69 additions and 37 deletions

View File

@@ -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 как `&amp;`.
- [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