Files
admin/.tasks/NEXT_SESSION.md
vitya 2e5adcf11e deploy(cms-s3): S3 FileStorage provider LIVE on RUVDS — admin↔MinIO split-brain closed
Разбор 500 на /admin/assets/<owner>/delete → корень ACL (app pool RX-only на
App_Data после scp-миграции) → полная развязка хранилища CMS:

- S3 FileStorage провайдер (MoreThenCms.FileStorage.S3) построен (координация с
  интерн-сессией) и раскатан LIVE на прод RUVDS: 6 контентных классов web.config
  → S3/MinIO, кэши остались Local. Смок 7 тенантов 200/301, 0×500, S3-read byte-parity.
  Upload-гоча: UseChunkEncoding=false (MinIO ⊥ AWSSDK aws-chunked).
- Весь локальный контент RUVDS → MinIO (galleries 5.3G, themes 2.7G, maxMind);
  imageCache-блоат (2.1G) выпилен из бакета themes.
- stostayer.old определён как stale-копия (не мигрировать).

Новый concept: snolla-admin-appdata-acl-500-after-scp-migration.
Трекеры: morethencms-s3-filestorage-provider (LIVE), reconcile-local-assets-to-minio (done).
Rollback: web.config.bak-pre-s3-2026-07-03 на хосте.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 13:47:21 +03:00

6.6 KiB
Raw Blame History

_last_updated_, session_id
_last_updated_ session_id
2026-07-03T10:45:00Z 2026-07-03-ruvds-minio-s3-provider-cutover

Next session handoff

Итог сессии — закрыт split-brain админка↔фронт: RUVDS теперь пишет/читает ассеты из MinIO

Началось с «почему /admin/assets/<owner>/delete → 500», раскрутилось в полную развязку хранилища. Всё LIVE и зелёное.

1. Разбор 500 + ACL-фикс

POST /admin/assets/<ownerId>/delete → 500 = app pool IIS AppPool\snolla имел на C:\sites\snolla\App_Data только RX после scp-миграции 23.05 → File.Delete кидал UnauthorizedAccessException. NRE-версии исключены проверкой строк Folders/Files в БД mssql.kzntsv.site. Fix: icacls App_Data /grant "IIS AppPool\snolla:(OI)(CI)(M)" /T (44293 файла). Concept: .wiki/concepts/snolla-admin-appdata-acl-500-after-scp-migration.md.

2. S3 FileStorage-провайдер — построен и LIVE на прод RUVDS (главное)

Провайдера в кодовой базе не было (только Local/Azure). Координировал разработку с интерн-сессией MoreThenCms (inbox-переписка, вся в .claude-inbox/.read/): написал ТЗ → выверил 4 расхождения по ground-truth (физ-объекты MinIO + snolla storage.js) → нашёл upload-баг.

  • Ключ-конвенция: bucket=класс, key <prefix>/<file> без ведущего слэша, id lowercase dash-free. assets→assets, galleries→galleries (плоско, без /images), images/scripts(js!)/stylesheets(css)/watermarks→bucket themes.
  • Upload-gotcha (важно): MinIO отвергает AWSSDK 3.7 aws-chunked → провайдер ставит UseChunkEncoding=false в PutObjectRequest. DisablePayloadSigning НЕ помогает.
  • Валидация: провайдер чистый (без SnollaHost) → гонял standalone-пробой в PowerShell (грузил DLL + зависимости из stostayer.old\bin, $type::new($cfgDict)), IIS/elevation не нужны. Read/key/byte-parity + self-test put→exists→download→delete — всё .
  • Прод-cutover RUVDS 2026-07-03: 3 DLL в C:\sites\snolla\bin (бандл: ~/projects/MoreThenCms/MoreThenCms.FileStorage.S3/deploy/); web.config <fileStorageClients> — 6 контентных классов → S3 (креды в конфиге, ACL SYSTEM+Admins), кэши (imageCache/uploadCache/contentCache/_imageCache-Azure) оставлены Local. Смок: 7 тенантов 200/301, 0× 500; S3-read вживую (theme CSS byte-parity).
  • ⚠️ Новая runtime-зависимость: RUVDS теперь зависит от minio.kzntsv.site (books-vds) для отдачи ВСЕХ ассетов/тем/галерей. Раньше был self-contained (локальный диск). Если MinIO/books-vds ляжет — у RUVDS-тенантов пропадут картинки/css. Учитывать.
  • ROLLBACK (мгновенный): restore C:\sites\snolla\web.config.bak-pre-s3-2026-07-03 (или IIS-снапшот pre-s3-cutover-2026-07-03) + Restart-WebAppPool snolla → вернётся Local, MinIO не трогается.
  • Провайдер закрыт с их стороны (wiki: filestorage-s3-provider, minio-awssdk-chunk-encoding-gotcha — в репо MoreThenCms). Прогер на приёме, если вылезет edge (theme-subpath / редкие content-type).

3. Весь локальный контент RUVDS → MinIO

rclone на RUVDS-хосте (gap-fill --ignore-existing): galleries 5.3 ГБ (301→9984), themes 2.7 ГБ (вкл. watermarks под themes/<id>/watermarks/), maxMind→bucket maxmind. assets уже были (13.06). Parity чистая (rclone check, все matching). imageCache-блоат (17135 obj / 2.1 ГБ) выпилен из бакета themes после cutover'а — реальный контент цел (10864 / 671 MiB).

  • Гоча: Start-Process-детач на Win Server Core НЕ переживает закрытие ssh → длинные операции гнать attached ssh + bash run_in_background.

4. stostayer.old — stale, НЕ мигрировать

C:\sites\stostayer.old (каталог stostayer, old.stostayer.ru) — старая копия. Текущий stostayer = тенант в каталоге MoreThenCms (SiteId 9cf0a8e5), уже в MinIO. Его локальные ассеты в MinIO лить нельзя (stale + коллизия owner-ID). Юзер: «неросайт, делай что хочешь». Использовался только как источник DLL-зависимостей для пробы.

Отложено (решения юзера, зафиксированы)

  • Локальный IIS на windows-recovery-host под мультитенантную админку — поднимать, когда сайты уедут с RUVDS (сам PC жив, серверная роль была декоммишнута — обновить статус в .wiki/entities/windows-recovery-host при подъёме).
  • Миграция всех сайтов на snolla — отдельный длинный трек (как labtools/pilonuxt).

⚠️ Git — закоммитить+запушить (с разрешения)

Прошлый «4 unpushed» — закрыт (origin/master..HEAD пусто). НО за эту сессию куча незакоммиченных doc-правок: .tasks/STATUS.md, NEXT_SESSION.md, 2 новых task-файла (morethencms-s3-filestorage-provider, reconcile-local-assets-to-minio), .wiki/ (новый concept snolla-admin-appdata-acl-500-after-scp-migration + правки galleries-storage-class-local-not-s3/index/log). Коммитнуть+запушить в начале след. сессии, если юзер разрешит.

Ключевые ссылки

  • Трекеры: .tasks/morethencms-s3-filestorage-provider.md (🟢 LIVE), .tasks/reconcile-local-assets-to-minio.md (🟢 done).
  • Концепты: .wiki/concepts/snolla-admin-appdata-acl-500-after-scp-migration.md, galleries-storage-class-local-not-s3.md.
  • Хост RUVDS: pass ruvds-iis/full-env, ssh key ~/.ssh/ruvds-iis-migration, я=Administrator (elevation там есть). MinIO creds pass minio-vds/full-env, alias endpoint https://minio.kzntsv.site.