Fix 2026-07-22: local .NET admin (C:\sites\stostayer\Web.config) S3 providers re-pointed to stostayer MinIO. 3 bugs in original config: wrong creds (AKIAJ2YJP72W6ZHCRE6Q = books-vds root, not stayer_minio), wrong endpoint (minio.stostayer.ru is not S3 API port; prod uses minio-api.stostayer.ru), wrong region (local -> AmazonS3Exception expecting us-west-1). Creds NOT in pass — live in stostayer.new config/default.json. Admin now shares prod storage; manual App_Data mirroring retired. + index.md, log.md. Also carries pending handoff (NEXT_SESSION) + runbook update from 2026-07-21 stostayer-web 0.3.20 deploy session. Co-Authored-By: Claude <noreply@anthropic.com>
7.7 KiB
stostayer .NET admin — MinIO S3 providers
Локальная MoreThenCms-админка stostayer (C:\sites\stostayer\Web.config, IIS :8090) переведена с битых S3-настроек на рабочий stostayer MinIO. После правки админка и боевой stostayer-web (0.3.20, Node snolla-app) читают одно хранилище — ручное зеркалирование в App_Data больше не нужно.
Контекст
- Боевой
stostayer-web:0.3.20(legacy @stostayer/web, Nuxt2) читает ассеты/галереи из stostayer MinIO, не из локальной ФС. Поток отдачи: картинки галерей/asset → 302 наimgproxy.stostayer.ru/imgproxy2→ imgproxy тянет из MinIO → webp; прочие ассеты — стримом из MinIO (см. ../entities/ruvds-iis-host ранбук). - Локальная админка = тот же движок MoreThenCms .NET 4.8, conn →
www.stostayer.ru,1433(DBstostayer, userstayer_site). S3 drop-inMoreThenCms.FileStorage.S3(+AWSSDK.Core/AWSSDK.S3) уже лежал вbin/— провайдеры вWeb.configбыли вставлены, но не работали.
Креды stostayer MinIO — НЕ в pass
Лежат в репо-конфиге ~/projects/stostayer.new/packages/web/config/default.json → секция s3:
| Параметр | Значение |
|---|---|
| accessKeyId | stayer_minio (bucket-user) |
| secretAccessKey | cXY>AVoWBv#_V-SZn6Vu6Tzx&!M[%UOod |
| endpoint | https://minio-api.stostayer.ru |
| region | us-west-1 (см. ниже — НЕ local) |
| pathStyle / ssl | true / true |
imgproxy: https://imgproxy.stostayer.ru, basePath /imgproxy2, key+salt — там же в default.json → imgproxy.
Три бага в исходном Web.config (почему "смотрит на локальное")
- Чужие креды.
accessKey=AKIAJ2YJP72W6ZHCRE6Q+secretKey=7o0Q4NjE5GL…— это books-vds/snolla MinIO root-ключ (см. minio-imgproxy-on-vds). На stostayer MinIO не зарегистрирован →The Access Key Id you provided does not exist in our records. Видимо, конфиг копипастом из snolla catch-all admin (snolla-local-admin-and-on-snolla-migration-design, тот юзает books-vdsminio.kzntsv.site), без замены ключей на stostayer-свои. - Не API-порт.
serviceURL=https://minio.stostayer.ru→ MinIO отвечаетS3 API Requests must be made to API port. Прод юзаетhttps://minio-api.stostayer.ru. Оба хоста резолвятся в один IP2a03:6f01:1:2::c66b, ноminio.stostayer.ru— не S3 API-эндпоинт. - Регион.
authenticationRegion="local"→ SigV4-подпись регионом не совпала →AmazonS3Exception: The authorization header is malformed; the region is wrong; expecting 'us-west-1'(HTTP 400) наGalleriesStorage.EnsureKeyPrefixExists→S3DirectoryInfo.ExistsWithBucketCheck(провайдер галерей падал на ините, в трассеToolsController.ImagePreview→CreatePreview). stostayer MinIO настроен на регионus-west-1. Продdefault.jsonпишетregion:"local", но то Node aws-sdk (galleries через imgproxy мимо app-S3; для .NET AWSSDK регион обязан бытьus-west-1).
Fix (2026-07-22)
9 S3-блоков в fileStorageClients (galleries/assets/images/scripts/stylesheets/imageCache/watermarks + inert-настройки contentCache/uploadCache) — 3 глобальные замены в Web.config:
accessKey: AKIAJ2YJP72W6ZHCRE6Q → stayer_minio
secretKey: 7o0Q4NjE5GLkdC48r0oZFEnqddjPNLqtCk+ZEh+S → cXY>AVoWBv#_V-SZn6Vu6Tzx&!M[%UOod (XML-escape: > → >, & → &)
serviceURL: https://minio.stostayer.ru → https://minio-api.stostayer.ru
authenticationRegion: local → us-west-1
Бэкап: C:\sites\stostayer\Web.config.bak-2026-07-22. IIS авто-recycle по Web.config-изменению. contentCache/uploadCache остались storageType="Local" (inert S3-настройки поправились, storageType не трогал — кэши локально, по рецепту snolla-local-admin-and-on-snolla-migration-design шаг 4).
bucketName уже был корректен и не менялся: galleries→galleries, assets→assets, images/scripts/stylesheets/imageCache/watermarks→themes. МинIO-бакеты (mc ListBuckets): assets, galleries, themes, contentcache, imagescache, maxmind, searchindexes, seo, sessions, uploadcache. Бакет assets/9cf0a8e52cf144619fd290606a146d35/ несёт реальные файлы (0001.png…); ownerId = siteId 9cf0a8e5-2cf1-4461-9fd2-90606a146d35 без дефисов lowercased.
Verify
mc alias set stn_api https://minio-api.stostayer.ru stayer_minio "<secret>"→mc ls stn_api/= 10 бакетов. ⚠MC_HOST_…с URL-encoded секретом в mc-урле давал signature-mismatch — юзатьmc alias setс явными аргументами.- Админка:
:8090/admin/account/login→ 200, логC:\Logs\stostayer\log.YYYYMMDD.txtчист от S3-ошибок после recycle. - Acceptance (реальный клиент, не curl — см. verify-on-real-client-not-own-curl-tests): логин → Asset Manager / превью галереи — картинки грузятся из MinIO. Подтверждено оператором 2026-07-22.
Гочи
- Секрет с XML-specials. В
Web.configvalue-атрибуте>и&обязаны быть escaped (>,&) — иначе XML не парсится / .NET получает обрезанный секрет.#,[,%,!— безопасны в double-quoted XML-атрибуте. minio.stostayer.ru≠ API-порт. Толькоminio-api.stostayer.ru.- Регион
us-west-1, неlocal. Для .NET AWSSDK админки — обязателен; прод Nodelocal— отдельная история (imgproxy + env-override). - Креды не в pass — единственный источник:
stostayer.newconfig. Если репо уедет — креды потеряются; имеет смысл переложить вpass(отдельная hardening-таска). - Кэши Local —
contentCache/uploadCacheнамеренно Local (не S3),imageCache→ S3/themes. Не унифицировано с snolla-admin (там все кэши Local) — оставлено как было.
Связанные
- galleries-storage-class-local-not-s3 — snolla-тираж: galleries/assets Local→S3 миграция, snolla catch-all admin на books-vds MinIO.
- snolla-admin-appdata-acl-500-after-scp-migration — split-brain админка(Local)↔боевой app(MinIO) на RUVDS; та же проблема «админка не переключена на S3».
- minio-imgproxy-on-vds — books-vds MinIO (root-ключ
AKIAJ2YJP72W6ZHCRE6Q), который ошибочно попал в stostayer Web.config.