Files
admin/.wiki/concepts/stostayer-admin-minio-config.md
vitya 23b1a47c14 wiki(stostayer): ingest stostayer-admin-minio-config — :8090 admin on stostayer MinIO
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>
2026-07-22 10:45:13 +03:00

7.7 KiB
Raw Blame History

title: stostayer .NET admin — MinIO S3 providers config (creds/endpoint/region) type: concept tags: [stostayer, morethencms, iis, admin, minio, s3, config, windows] related: ../entities/ruvds-iis-host, galleries-storage-class-local-not-s3, snolla-admin-appdata-acl-500-after-scp-migration, minio-imgproxy-on-vds, snolla-local-admin-and-on-snolla-migration-design updated: 2026-07-22

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 (DB stostayer, user stayer_site). S3 drop-in MoreThenCms.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.jsonimgproxy.

Три бага в исходном Web.config (почему "смотрит на локальное")

  1. Чужие креды. 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-vds minio.kzntsv.site), без замены ключей на stostayer-свои.
  2. Не API-порт. serviceURL=https://minio.stostayer.ru → MinIO отвечает S3 API Requests must be made to API port. Прод юзает https://minio-api.stostayer.ru. Оба хоста резолвятся в один IP 2a03:6f01:1:2::c66b, но minio.stostayer.ru — не S3 API-эндпоинт.
  3. Регион. authenticationRegion="local" → SigV4-подпись регионом не совпала → AmazonS3Exception: The authorization header is malformed; the region is wrong; expecting 'us-west-1' (HTTP 400) на GalleriesStorage.EnsureKeyPrefixExistsS3DirectoryInfo.ExistsWithBucketCheck (провайдер галерей падал на ините, в трассе ToolsController.ImagePreviewCreatePreview). 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&gt;AVoWBv#_V-SZn6Vu6Tzx&amp;!M[%UOod   (XML-escape: > → &gt;, & → &amp;)
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.config value-атрибуте > и & обязаны быть escaped (&gt;, &amp;) — иначе XML не парсится / .NET получает обрезанный секрет. #, [, %, ! — безопасны в double-quoted XML-атрибуте.
  • minio.stostayer.ru ≠ API-порт. Только minio-api.stostayer.ru.
  • Регион us-west-1, не local. Для .NET AWSSDK админки — обязателен; прод Node local — отдельная история (imgproxy + env-override).
  • Креды не в pass — единственный источник: stostayer.new config. Если репо уедет — креды потеряются; имеет смысл переложить в pass (отдельная hardening-таска).
  • Кэши LocalcontentCache/uploadCache намеренно Local (не S3), imageCache → S3/themes. Не унифицировано с snolla-admin (там все кэши Local) — оставлено как было.

Связанные