wiki(snolla): ingest local admin HTTPS binding — self-signed wildcard *.snolla.com on IIS :443
Локальный .NET-админ snolla на HTTPS: pilorama98.snolla.com/admin 404 (не в hosts → VDS) → ERR_CONNECTION_CLOSED (HSTS upgrade, нет 443). Fix: IIS-native self-signed wildcard *.snolla.com на :443 + Trusted Root (без traefik — acme.json пуст, лишний слой). Рабочий entry-point /admin/account/login (голый /admin → canonical на public — предсуществующее поведение CMS). +index.md (2 строки, design-док ранее не индексирован) + log. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
58
.wiki/concepts/snolla-local-admin-https-binding.md
Normal file
58
.wiki/concepts/snolla-local-admin-https-binding.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: Локальный .NET-админ snolla — HTTPS на IIS :443 (self-signed wildcard)
|
||||
type: concept
|
||||
tags: [snolla, morethencms, iis, admin, https, self-signed, certificate, local, pilorama98]
|
||||
related: [[snolla-local-admin-and-on-snolla-migration-design]], [[traefik-on-windows-docker-desktop]], [[docker-host-loopback-detect]], [[stostayer-admin-minio-config]]
|
||||
updated: 2026-07-29
|
||||
---
|
||||
|
||||
# Локальный .NET-админ snolla — HTTPS на IIS :443 (self-signed wildcard)
|
||||
|
||||
Реализация 2026-07-29 поверх design-дока [[snolla-local-admin-and-on-snolla-migration-design]] (Task A). Design предполагал **http-only** локальную админку (нет traefik → без URL Rewrite → ходим по http). На практике браузер апгрейдил `http`→`https` (HSTS, закешированный с прошлых заходов на VDS, или Chrome/Edge «Always use secure connections») → локальный IIS без 443 → `ERR_CONNECTION_CLOSED`. Постановка wildcard self-signed прямо на IIS-сайт `snolla` :443 решает это без traefik.
|
||||
|
||||
## Решение: IIS-native HTTPS, НЕ traefik
|
||||
|
||||
Рассматривали оживление локального traefik ([[traefik-on-windows-docker-desktop]]). Отклонено:
|
||||
- Локальный `acme.json` пуст — LE-сертификата на `snolla.com` нет → traefik ради self-signed не нужен (IIS умеет сам).
|
||||
- Traefik как TLS-терминатор перед локальным IIS = лишний слой со всеми готчами: NAT-loopback ([[docker-host-loopback-detect]]), сломанный docker.sock provider, file-provider не watch'ит, `SERVER_PORT` leak → нужен URL Rewrite, acme.json perms 0777.
|
||||
- Бэкенд теперь на том же хосте (локальный IIS), не в VBox-VM — reverse-proxy не несёт смысла.
|
||||
|
||||
IIS сам терминирует TLS → `SERVER_PORT=443` чисто, X-Forwarded не нужен, port-leak'ов нет.
|
||||
|
||||
## Что сделано
|
||||
|
||||
### 1. hosts — добавлен pilorama98.snolla.com
|
||||
Symptom: `https://pilorama98.snolla.com/admin` → 404. Корень: `pilorama98.snolla.com` **не был в hosts-override** → реальный DNS → VDS `89.253.255.94` → traefik без роута → 404 (404 прилетал с VDS, не с локального). Системный прокси `127.0.0.1:10808` (xray) маскировал «server 127.0.0.1» в curl, но реальный backend был VDS.
|
||||
|
||||
`pilorama98` — реальный сайт в `dbo.Sites` (Alias=`pilorama98`, PrimaryDomain=`pilorama98.ru`, Live=True, Production=False, SiteId `37e67fc4-…`), просто не входил в тираж-5 из design-дока. Catch-all обслужит любой сайт из DB при добавлении в hosts.
|
||||
|
||||
Строка hosts теперь:
|
||||
```
|
||||
127.0.0.1 tandemmebel.snolla.com labtools.snolla.com labtoolspro.snolla.com emspb.snolla.com kupimknigi.snolla.com internal.snolla.com pilorama98.snolla.com
|
||||
```
|
||||
(правка hosts требует elevation — через `Start-Process -Verb RunAs`; `Set-Content` из не-elevated шелла = `UnauthorizedAccess`; по памяти `Get-Content -Raw` мог опустошить файл → читаем по строкам).
|
||||
|
||||
### 2. Self-signed wildcard cert на IIS :443
|
||||
Скрипт (elevated, UAC):
|
||||
- `New-SelfSignedCertificate -Subject '*.snolla.com' -DnsName '*.snolla.com','snolla.com' -CertStoreLocation Cert:\LocalMachine\My -NotAfter +10y -TextExtension @('2.5.29.37={text}1.3.6.1.5.5.7.3.1')` — гоча: `-DnsName` конфликтует с ручным SAN TextExtension `2.5.29.17` (параметр противоречит SAN) → SAN генерится через `-DnsName`, оставляем только EKU serverAuth.
|
||||
- Копия в `Cert:\LocalMachine\Root` (Trusted Root) через `X509Store('Root','LocalMachine')` → браузер доверяет, HSTS удовлетворён.
|
||||
- `New-WebBinding -Name snolla -Protocol https -Port 443 -IPAddress '*'` + `$bind.AddSslCertificate($thumb,'My')` + Stop/Start-Website (без restart binding не активируется).
|
||||
- Cert thumbprint: `6E2212B4C13BD28E2FF680322F11741193E8C619`, SAN `DNS:*.snolla.com, DNS:snolla.com`, 10 лет.
|
||||
|
||||
Wildcard покрывает **все** alias'ы сразу — pilorama98, kupimknigi, internal, tandemmebel, labtools, labtoolspro, emspb и любой будущий.
|
||||
|
||||
### 3. Доступ
|
||||
- `https://<alias>.snolla.com/admin/account/login` → 200, форма входа SNOLLA (title `SNOLLA`, password-поле, `<form action="/admin/login">`). Покрытие верифицировано: pilorama98, kupimknigi, internal, tandemmebel → 200.
|
||||
- **Голый `/admin` → 302 `/login` → 301 `https://www.<PrimaryDomain>/`** (canonical на public-домен). Это **предсуществующее поведение CMS** (подтверждено оператором: «так и было» на RUVDS), не поломка миграции. Рабочий entry-point = `/admin/account/login` напрямую (закладка).
|
||||
- `on.snolla.com` → 404: в hosts стоит `internal.snolla.com` (реальный alias сайта `on` в DB = `internal`, Title="Internal Site"), не `on`. Design-док писал `on` — фактический alias `internal`.
|
||||
|
||||
## Trade-off
|
||||
Self-signed, не LE. Допустимо: админка локальная, FW inbound 80/443 закрыт, публично не торчит. Если позже нужен real-LE — traefik DNS-01 через REGRU (креды `OpeItcLoc03` в compose-env, см. [[traefik-on-windows-docker-desktop]] § DNS-01), но это отдельная задача и весь traefik-стек.
|
||||
|
||||
## Повторяемость
|
||||
Cert в Trusted Root переживает перезагрузку. При регенерации (например, истёк/потерян) — тот же скрипт: почистить старые `*.snolla.com` в My/Root, создать заново, бинд. `SslFlags=0` (без SNI) — один catch-all сайт, один wildcard cert на все Host-header'ы.
|
||||
|
||||
## Связано
|
||||
- [[snolla-local-admin-and-on-snolla-migration-design]] — исходный design (Task A http-only, Task B on.snolla.com→VDS).
|
||||
- [[stostayer-admin-minio-config]] — родственный локальный .NET-админ (:8090), тот же движок MoreThenCms.
|
||||
- [[traefik-on-windows-docker-desktop]] — почему traefik отклонён.
|
||||
@@ -41,6 +41,8 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever
|
||||
- [minio-imgproxy-on-vds](concepts/minio-imgproxy-on-vds.md) — MinIO+imgproxy stack на VDS, миграция с upgrade 2020→2025 + DNS swap pending
|
||||
- [morethencms-null-settingsdata-https-502](concepts/morethencms-null-settingsdata-https-502.md) — MoreThenCms тенант с `Sites.SettingsData=NULL` → 502 только на HTTPS (нет `httpSecure` → KeyNotFound); fix = UPDATE + recycle. maljarka 2026-06-08
|
||||
- [snolla-admin-appdata-acl-500-after-scp-migration](concepts/snolla-admin-appdata-acl-500-after-scp-migration.md) — админский delete/upload ассета → 500: app pool имел на `App_Data` только RX после scp-миграции → `File.Delete` UnauthorizedAccessException. Fix = icacls Modify. + split-brain: админка пишет Local, боевой app читает MinIO
|
||||
- [snolla-local-admin-and-on-snolla-migration-design](concepts/snolla-local-admin-and-on-snolla-migration-design.md) — design: Task A восстановить локальный .NET-админ (catch-all IIS `snolla`, hosts-override, MinIO drop-in) + Task B on.snolla.com → VDS как Node snolla-app
|
||||
- [snolla-local-admin-https-binding](concepts/snolla-local-admin-https-binding.md) — реализация 2026-07-29: HTTPS на локальном IIS-админе `snolla` :443 (self-signed wildcard `*.snolla.com` в Trusted Root, без traefik) + pilorama98.snolla.com в hosts; рабочий entry-point `/admin/account/login` (голый `/admin` → canonical на public-домен, предсуществующее поведение CMS)
|
||||
- [mssql-container-data-restore](concepts/mssql-container-data-restore.md) — MSSQL контейнер с восстановленными production data — паттерн
|
||||
- [mssql-on-vds](concepts/mssql-on-vds.md) — MSSQL Express 2022 Linux на VDS — миграция + login orphan fix + traefik TCP gotchas
|
||||
- [ocis-on-vds-deploy-recipe](concepts/ocis-on-vds-deploy-recipe.md) — oCIS на VDS — deploy recipe + non-obvious gotchas (UID 1001 vs 1000, basic auth, LibreGraph user-create)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
Append-only log of wiki operations (ingests, promotions, lints, migrations).
|
||||
|
||||
## [2026-07-29] implement | NEW concepts/snolla-local-admin-https-binding.md + UPDATE index.md (concepts +2 строки) — локальный .NET-админ snolla (catch-all IIS `snolla`) переведён на HTTPS. Повод: `https://pilorama98.snolla.com/admin` → 404 → ERR_CONNECTION_CLOSED. Корень 404: `pilorama98.snolla.com` не был в hosts-override → реальный DNS → VDS `89.253.255.94` → traefik без роута (системный прокси `127.0.0.1:10808` маскировал «server 127.0.0.1» в curl). pilorama98 — реальный сайт в `dbo.Sites` (Alias=pilorama98, PrimaryDomain=pilorama98.ru, Live), вне тиража-5 из design-дока. Корень ERR_CONNECTION_CLOSED: браузер HSTS-апгрейдил http→https, а локальный IIS без 443. Решение: **IIS-native self-signed wildcard `*.snolla.com` на :443 + Trusted Root**, НЕ traefik (локальный acme.json пуст → LE на snolla.com нет; traefik-as-TLS-terminator = NAT-loopback/docker.sock/URL-Rewrite/SERVER_PORT-leak готчи без выгоды). Скрипт elevated (UAC): `New-SelfSignedCertificate -Subject '*.snolla.com' -DnsName '*.snolla.com','snolla.com' -TextExtension EKU serverAuth` (гоча: `-DnsName` конфликтует с ручным SAN `2.5.29.17` → SAN через `-DnsName`) → копия в `Cert:\LocalMachine\Root` → `New-WebBinding snolla https 443 *` + `AddSslCertificate` + restart. Cert thumb `6E2212B4C13BD28E2FF680322F11741193E8C619`, SAN `*.snolla.com,snolla.com`, 10 лет — покрывает все alias'ы. hosts: добавлен `pilorama98.snolla.com` (elevated, построчно — `Get-Content -Raw` мог опустошить файл). Результат: `https://<alias>.snolla.com/admin/account/login` → 200 форма SNOLLA (pilorama98/kupimknigi/internal/tandemmebel верифицированы). **Голый `/admin` → 302 `/login` → 301 `https://www.<PrimaryDomain>/`** — предсуществующее поведение CMS (оператор подтвердил: «так и было» на RUVDS), не поломка миграции; рабочий entry-point `/admin/account/login`. `on.snolla.com` → 404: hosts стоит `internal.snolla.com` (реальный alias сайта `on` = `internal`), не `on` (design-док писал `on`). Trade-off: self-signed не LE — допустимо (админка локальная, FW закрыт). +index.md (2 строки: design-док ранее не был индексирован + новый page). Cross-ref [[snolla-local-admin-and-on-snolla-migration-design]], [[traefik-on-windows-docker-desktop]], [[stostayer-admin-minio-config]].
|
||||
|
||||
## [2026-07-22] fix | NEW concepts/stostayer-admin-minio-config.md — локальная .NET-админка stostayer (`C:\sites\stostayer\Web.config`, IIS :8090) переведена на рабочий stostayer MinIO. Исходно S3-провайдеры (`MoreThenCms.FileStorage.S3` в `bin/`) уже стояли, но с 3 багами: (1) чужие креды `AKIAJ2YJP72W6ZHCRE6Q` = books-vds/snolla root-ключ (копипаст из snolla catch-all admin, не заменён на stostayer-свои → "Access Key Id does not exist"); (2) `serviceURL=https://minio.stostayer.ru` — НЕ S3 API-порт ("S3 API Requests must be made to API port"), прод юзает `minio-api.stostayer.ru`; (3) `authenticationRegion="local"` → SigV4 регион-мismatch → `AmazonS3Exception: the region is wrong; expecting 'us-west-1'` (400) на `GalleriesStorage.EnsureKeyPrefixExists` (`ToolsController.ImagePreview` → `CreatePreview`). Креды stostayer MinIO **не в pass** — лежат в `~/projects/stostayer.new/packages/web/config/default.json` → `s3`: accessKey `stayer_minio`, endpoint `https://minio-api.stostayer.ru`, region `us-west-1`. Fix: 3 глобальные замены × 9 S3-блоков в Web.config (accessKey/secretKey[XML-escaped `>`/`&`]/serviceURL) + region `local`→`us-west-1`; бэкап `Web.config.bak-2026-07-22`; IIS recycle, лог чист. mc `alias set` + ListBuckets OK (10 бакетов: assets/galleries/themes/…); `assets/9cf0a8e52cf144619fd290606a146d35/` несёт реальные файлы. Acceptance оператором: картинки грузятся. Админка=прод единое хранилище, ручное зеркалирование в `App_Data` упразднено. +index.md concepts-строка. Cross-ref [[galleries-storage-class-local-not-s3]], [[snolla-admin-appdata-acl-500-after-scp-migration]], [[minio-imgproxy-on-vds]].
|
||||
|
||||
## [2026-07-14] ingest | sources/de-vds-3xui-setup-2026-07-14.md (new) + entities/de-vds-3xui.md (sources: привязан) — полноценный ingest DE-сессии: sources-хроника с борьбой против 3x-ui 3.5.0 (CSRF-403 на login → `CSRFMiddleware`/`X-CSRF-Token`/`GET {BP}csrf-token`; прямой DB-insert в `inbounds` не рендерит → client-tables `clients`/`client_inbounds`/`client_traffics` заполняются только `AddInbound` → panel API `POST {BP}panel/api/inbounds/add` с stringified settings/streamSettings/sniffing; wrapper `x-ui setting` не применяет креды → бинарник). Эталон JSON снят с рабочего nl-vds 32030. +index.md sources-строка. Real RF-client confirmed.
|
||||
|
||||
Reference in New Issue
Block a user