Разбор 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>
6.6 KiB
_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→bucketthemes. - 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 + bashrun_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 credspass minio-vds/full-env, alias endpointhttps://minio.kzntsv.site.