--- _last_updated_: 2026-07-03T10:45:00Z session_id: 2026-07-03-ruvds-minio-s3-provider-cutover --- # Next session handoff ## Итог сессии — закрыт split-brain админка↔фронт: RUVDS теперь пишет/читает ассеты из MinIO Началось с «почему `/admin/assets//delete` → 500», раскрутилось в полную развязку хранилища. Всё LIVE и зелёное. ### 1. Разбор 500 + ACL-фикс ✅ `POST /admin/assets//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 `/` без ведущего слэша, 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` `` — 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//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`.