feat(snolla-local-admin): RESTORE DONE — local .NET admin live (6 /admin URLs)

Task A complete. Local catch-all IIS site `snolla` restored from RUVDS:
- Selective tar-copy ~100MB (excluded stale App_Data assets/galleries/themes
  8.76GB — now in MinIO), NOT the full 8.66GB.
- Web.config already pointed at mssql.kzntsv.site MoreThenCms (user snolla)
  + MinIO S3 drop-in with real keys (placeholder_count=0) — repoint not needed.
- Elevated setup script (ASCII-only, PS5.1 BOM-less-safe):
  scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1
- AppPool snolla (.NET v4.0, AppPoolIdentity, recycle@200MB), IIS site *:80,
  ACL, hosts-override (6 aliases -> 127.0.0.1), FW block inbound 80.
- Smoke GREEN: tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on
  .snolla.com/admin/account/login -> 200, real MoreThenCms login form.

Unblocks Task B (on-snolla-vds-migration). MinIO upload-acceptance = manual
operator follow-up. Records: .tasks/snolla-local-admin-restore.md + STATUS.md.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-20 10:10:44 +03:00
parent d4278e79f9
commit c196964d03
4 changed files with 113 additions and 13 deletions

View File

@@ -11,24 +11,29 @@ Catch-all `*:80` + `hosts`-override → `127.0.0.1 <alias>.snolla.com`. Один
- tandemmebel.snolla.com/labtools.snolla.com/labtoolspro.snolla.com/emspb.snolla.com/kupimknigi.snolla.com/on.snolla.com
## Plan / phases
- [ ] **0. Verify source (read-only SSH RUVDS)**`pass show ruvds-iis/full-env`; проверить `C:\sites\snolla\` есть, `Web.config` несёт `FileStorage.S3`+`minio.kzntsv.site`, IIS site `snolla` жив. Если MinIO НЕ применён → fallback: build из MoreThenCms source + drop-in `MoreThenCms.FileStorage.S3/deploy/`.
- [ ] **1. Копировать `C:\sites\snolla\`** RUVDS→локально (~8.66 GB, scp/rclone).
- [ ] **2. Репойнт conn-string** `mssql.kzntsv.site,1433;Catalog=MoreThenCms;TrustServerCertificate=True` (DB-креды из `pass`; уточнить app-аккаунт vs SA).
- [ ] **3. MinIO-ключи** в `<fileStorageClients>``minio.kzntsv.site`, бакеты assets/galleries/themes, ключи из `pass show minio-vds/full-env` (если плейсхолдеры). Кэши оставить Local.
- [ ] **4. IIS-сайт `snolla`** — AppPool `snolla` (.NET v4.0 Integrated, AppPoolIdentity), binding `*:80` catch-all. ACL `IIS AppPool\snolla:(OI)(CI)(M)` на `C:\sites\snolla`.
- [ ] **5. hosts-override**`127.0.0.1 <6 aliases>.snolla.com` (elevation).
- [ ] **6. FW**блок inbound 80 (локальный только). URL Rewrite rule НЕ ставить.
- [ ] **7. Smoke**`curl -H "Host: tandemmebel.snolla.com" http://127.0.0.1/admin/account/login`200; on.snolla.com同理; MinIO upload-цикл.
- [x] **0. Verify source (read-only SSH RUVDS)** plink `-hostkey` (fingerprint `SHA256:r/vSKU5WzH4B8T7RiXyXlg0D8XZ9hlBxzmdrPzuPWzE`, креды `pass show ruvds-iis/full-env`). `C:\sites\snolla\` есть, IIS site `snolla` Started, catch-all `*:80` + SNI `*.snolla.com`/real-domains. **Web.config уже → `mssql.kzntsv.site,1433;Catalog=MoreThenCms;User Id=snolla;Password=...` (тот же snolla SQL-user что stostayer.old).** MinIO drop-in применён: assets/galleries/images/scripts/stylesheets/watermarks → `FileStorage.S3.*`, endpoint `minio.kzntsv.site`, **ключи реальные** (placeholder_count=0, accessKey=20/secretKey=40). Кэши Local.
- [x] **1. Копировать `C:\sites\snolla\`** RUVDS→локально **selective tar-over-SSH ~100MB** (НЕ 8.76GB): `bin`(53MB, вкл S3 DLLs)+`Admin`(6MB)+`Areas`+`Views`+`Web.config`+`App_Data/{maxMind,searchIndexes,contentCache}`, исключая stale `App_Data/{assets(215MB),galleries(5.5GB),themes(2.8GB),uploadCache(145MB)}` + `bin.old`. Команда: `plink ... "tar -C C:/sites/snolla -cf - --exclude=App_Data/assets --exclude=App_Data/galleries --exclude=App_Data/themes --exclude=App_Data/uploadCache --exclude=bin.old --exclude=App_Data/imageCache ." | tar -C /c/sites/snolla -xf -`.
- [x] **2. Репойнт conn-string** НЕ НУЖНО, RUVDS-Web.config уже на `mssql.kzntsv.site` (cutover 2026-05). DB-креды `snolla`/`fXkH4@8O%3pc` (plaintext в Web.config, тот же user работает для MoreThenCms+stostayer catalogs). Q2 закрыта.
- [x] **3. MinIO-ключи** — уже реальные в скопированном Web.config (см. step 0). Pass-lookup не понадобился.
- [x] **4. IIS-сайт `snolla`** elevated `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1` (ASCII-only, PS5.1 BOM-less-safe): AppPool `snolla` (.NET v4.0, AppPoolIdentity, recycling.memory 200MB), IIS site `*:80` catch-all, ACL `IIS AppPool\snolla:(OI)(CI)(M)`.
- [x] **5. hosts-override**`127.0.0.1 tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com` в `hosts` (marker `# snolla-local-admin`, idempotent).
- [x] **6. FW**`New-NetFirewallRule block-inbound-80-snolla-local` (Action Block, loopback не фильтруется → local-only). URL Rewrite rule НЕ ставил (скопированный inert).
- [x] **7. Smoke**`curl --noproxy '*' -H "Host: <alias>.snolla.com" http://127.0.0.1/admin/account/login`**200 для всех 6** (tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on). HTML = реальная MoreThenCms-логинформа (`<title>SNOLLA</title>`, `<form action="/admin/login">`). hosts + IIS listening confirmed.
## Status
⚪ ready (ждёт отмашки оператора на SSH RUVDS + креды). Branch: master.
🟢 DONE (2026-07-20). Branch: master. Local .NET-админ поднят, 6 адресов `/admin` живые.
## Verify-факт
- Catch-all routing: `appSettings` = `sitePath=C:\sites\snolla\`, `primaryDomain=snolla.com`, `primaryAlias=on` (default-site = on.snolla.com "Internal Site"); siteId резолвится из Host-header (нет siteId в appSettings, в отличие от per-site stostayer.old). `customErrors mode="Off"`.
- bin/ несёт `MoreThenCms.FileStorage.S3.dll` + `AWSSDK.Core.dll` + `AWSSDK.S3.dll` (drop-in).
## Depends on / blocks
- Блокирует: [[on-snolla-vds-migration]] (нужен админ для контент-инспекции on.snolla.com).
## Open Q
- MoreThenCms DB app-аккаунт + путь в `pass` (SA есть `mssql-vds/sa-password`, но админ юзает app-аккаунт).
- Включать все ~60 сайтов или только тираж(5)+on.snolla.com — catch-all даёт все, решает hosts-список.
- ~~MoreThenCms DB app-аккаунт~~ — ЗАКРЫТА: `snolla` SQL-user уже в Web.config (plaintext), работает для MoreThenCms catalog.
- Включать все ~60 сайтов или только тираж(5)+on.snolla.com — пока 6 в hosts; catch-all даёт все, расширить = дописать `<alias>.snolla.com` в hosts.
- **MinIO upload-acceptance** (не автотест): оператор логинится в админку, заливает тест-ассет → проверяет объект в MinIO `minio.kzntsv.site` (bucket assets). S3-провайдер был admin-self-test green на RUVDS, Web.config скопирован 1:1 → должен работать.
## Rollback
Удалить IIS-сайт `snolla` + `C:\sites\snolla\` + откатать hosts. Прод-RUVDS не тронут.
Удалить IIS-сайт `snolla` + `C:\sites\snolla\` + откатать hosts (снести marker `# snolla-local-admin`). FW-block-rule можно оставить. Прод-RUVDS не тронут.