Разбор 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>
43 lines
6.6 KiB
Markdown
43 lines
6.6 KiB
Markdown
---
|
||
_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/<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`.
|