feat(iis-migration): win-acme HTTP-01 auto-renewal on RUVDS IIS

Stood up a permanent self-renewing Let's Encrypt pipeline on the RUVDS
IIS host, replacing the manual traefik acme.json -> PFX import and
closing the 2026-07-22 cert-expiry deadline (new 25-SAN cert valid to
2026-09-03, SYSTEM scheduled task renews 55 days before expiry).

Key obstacle: the MoreThenCms OWIN catch-all (owin:HandleAllRequests)
swallowed /.well-known/acme-challenge/. Solved by carving the challenge
path into a separate IIS application in a No-Managed-Code app pool, plus
patching win-acme's Web_Config.xml template to remove the inherited Owin
handler. Staging + prod validation green for all 25 hostnames; live TLS
smoke confirms the new cert is served (incl degraded maljarka/rimiz).

- scripts/iis-migration-to-ruvds/03-ruvds-winacme.ps1 (idempotent setup)
- scripts/iis-migration-to-ruvds/winacme-Web_Config.xml (patched template)
- .wiki/concepts/winacme-iis-owin-catchall-http01.md (recipe + gotchas)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-05 21:08:41 +03:00
parent 9cd6d4e22c
commit 3c7ca3416b
8 changed files with 315 additions and 29 deletions

View File

@@ -1,45 +1,51 @@
---
_last_updated_: 2026-06-05T00:30:00+03:00
session_id: 2026-06-05-iis-migration-full-cutover
_last_updated_: 2026-06-05T02:00:00+03:00
session_id: 2026-06-05-iis-cutover-and-winacme-renewal
---
# Next session handoff
_Сессия: **FULL CUTOVER достигнут** — все 25 hostname (tandemmebel + вся зона snolla.com) authoritative
на RUVDS `80.64.31.36`. Source НЕ заглушен (user-decision: 7-day soak warm rollback). Зафиксировано в
`.tasks/iis-migration-to-ruvds.md`. Ничего не висит._
_Сессия: (1) full DNS cutover на RUVDS достигнут; (2) поднят постоянный win-acme HTTP-01 auto-renewal
на RUVDS IIS — дедлайн cert-expiry 2026-07-22 СНЯТ. Source НЕ заглушен (warm rollback). Всё проверено,
ничего не висит._
## Recent commits
- `539f1a07` task(iis-migration): tandemmebel DNS cutover 2026-06-05
- (+ commit этой сессии с full-cutover записью)
- `9cd6d4e2` task(iis-migration): full DNS cutover reached 2026-06-05
- (+ commit этой сессии: win-acme renewal pipeline + wiki concept)
## Что сделано (iis-migration, 05.06)
-**Full cutover:** все 25 hostname → RUVDS на authoritative ns1.reg.ru. На windows-source
(`94.19.247.14`) authoritative не осталось ничего. Вся зона `snolla.com` (apex + 10 субдоменов,
независимые A) переехала вслед за tandemmebel.
- ✅ Хвост кэша: `on.snolla.com` + `tandemmebel.snolla.com` ещё `94.19.247.14` на Google 8.8.8.8
(TTL 86400, дотекает; 1.1.1.1/Yandex уже RUVDS). Дренаж до ~24ч.
- ✅ RUVDS smoke: `snolla.com` 200, `tandemmebel.snolla.com` 200. `maljarka` 502 (pre-existing CMS, не cutover).
-**Full cutover:** все 25 hostname authoritative на RUVDS `80.64.31.36`. На windows-source ничего authoritative.
-**win-acme auto-renewal** на RUVDS: 25-SAN LE cert (до **2026-09-03**) во всех SNI-биндингах +
SYSTEM scheduled task `win-acme-renew-snolla` (renew 55д до expiry). RUVDS больше НЕ зависит от
домашнего traefik по сертификатам.
- Gotcha решён: OWIN-catch-all CMS жрал `/.well-known/acme-challenge/` → challenge вынесен в отдельное
IIS-приложение (пул «No Managed Code») + патч шаблона `C:\win-acme\Web_Config.xml`.
- Артефакты: `scripts/iis-migration-to-ruvds/03-ruvds-winacme.ps1` + `winacme-Web_Config.xml`;
recipe в `.wiki/concepts/winacme-iis-owin-catchall-http01.md`.
- Доступ к RUVDS: SSH `~/.ssh/ruvds-iis-migration``Administrator@80.64.31.36` (elevated сессия).
## Спроси user'а
- **Decommission `snolla` site** — ждём soak (~2026-06-12) + drain кэша, или форсировать раньше?
Когда решит: elevated PS → `Stop-Website snolla` → архив `C:\sites\snolla` (8.66 ГБ) → kreknin
cleanup temp SSH-ключей + FW-правил (`ssh-from-source`/`smb-from-source` на RUVDS).
- **LE-renewal на RUVDS** — теперь DNS полностью на RUVDS → можно win-acme + HTTP-01. Дедлайн ~2026-07-15
(certs expire 2026-07-22). Поднимать?
- `maljarka.tandemmebel.ru` 502 — чинить CMS-тенант отдельно? (pre-existing, не блокер).
- **Decommission `snolla` site** на windows-source — ждём soak (~2026-06-12) + drain кэша, или раньше?
Когда решит: elevated PS → `Stop-Website snolla` → архив `C:\sites\snolla` (8.66 ГБ) → kreknin +
cleanup temp SSH-ключей/FW-правил. (win-acme на RUVDS от этого не зависит — он самостоятелен.)
- `maljarka.tandemmebel.ru` 502 — чинить CMS-тенант отдельно? (pre-existing, не блокер; HTTPS-cert у него валиден).
## Не делать (preemptive guards)
- **Не `Stop-Website snolla` пока хвост кэша течёт** — `on.`/`tandemmebel.snolla.com` ещё резолвятся
на windows у части юзеров (Google). Остановка сейчас = частичный downtime до drain.
- **Не глушить до soak** без явного запроса — user выбрал 7-day warm rollback.
- IIS-правки требуют **elevated shell** (текущий `vitya` — не admin; W3SVC running).
- **branch ahead от origin** — push без явного grant'а (Rule 4). Этой сессии grant НЕ давали.
- **Не `--test` в win-acme под SSH** — включает интерактив, виснет. Для staging — `--baseuri <staging>`.
- **Не трогать `acme-challenge` IIS-приложение / пул «No Managed Code» / патченый `Web_Config.xml`** —
на них держится авто-renewal. Detail: `.wiki/concepts/winacme-iis-owin-catchall-http01.md`.
- **Не `Stop-Website snolla` пока хвост кэша течёт / без явного запроса** (warm rollback).
- IIS-правки — elevated shell. **branch ahead от origin** — push без явного grant'а (Rule 4); grant НЕ давали.
## Memory updates за сессию
- (нет нового файла)
- (нет нового файла; знание — в wiki concept + task decisions log)
## ⚠️ Sensitive (НЕ в git)
- Корневой `C:\sites\snolla\web.config` содержит plaintext-креды (MSSQL/SMTP/Azure/API-ключи). Pre-existing,
не вводилось этой сессией. Если будешь декоммишить/архивировать — не плодить копии в трекаемых местах.