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>
This commit is contained in:
@@ -1,47 +1,42 @@
|
||||
---
|
||||
_last_updated_: 2026-07-02T09:45:00Z
|
||||
session_id: 2026-07-02-labtools-pro-and-ru-vds-cutover
|
||||
_last_updated_: 2026-07-03T10:45:00Z
|
||||
session_id: 2026-07-03-ruvds-minio-s3-provider-cutover
|
||||
---
|
||||
|
||||
# Next session handoff
|
||||
|
||||
## Итог сессии — весь snolla-тираж выехал на VDS ✅
|
||||
`emspb.ru` + `labtools.pro` + `labtools.ru` — все LIVE на [[vds-kzntsv]] (`89.253.255.94`) за traefik. RUVDS IIS (`80.64.31.36`) — rollback, живой.
|
||||
## Итог сессии — закрыт split-brain админка↔фронт: RUVDS теперь пишет/читает ассеты из MinIO
|
||||
|
||||
## Recent commits (⚠️ 4 ЛОКАЛЬНЫХ, НЕ ЗАПУШЕНЫ — автопуш не выдавался)
|
||||
- `a9f4f3a6` deploy(labtools): 43e28ba LIVE — cutover labtools.ru done
|
||||
- `ed99f222` deploy(labtools-pro): 7bd9fae LIVE — cutover labtools.pro done
|
||||
- `531d7f0f` deploy(labtools-pro): staging GREEN, stack 19
|
||||
- `253f427a` decommission(emspb): сняты emspb.ru/www SNI-биндинги с RUVDS IIS
|
||||
→ **Первое действие след. сессии если разрешат: `git push`** (4 коммита ждут).
|
||||
Началось с «почему `/admin/assets/<owner>/delete` → 500», раскрутилось в полную развязку хранилища. Всё LIVE и зелёное.
|
||||
|
||||
## Состояние треков
|
||||
| Трек | Статус | Стек | Образ |
|
||||
|---|---|---|---|
|
||||
| `[emspb-web-vds-deploy]` | 🟢 closed (LIVE + RUVDS decommissioned) | 18 | emspb:b6e361a |
|
||||
| `[labtools-pro-web-vds-deploy]` | 🟢 closed (LIVE) | 19 | labtools-pro:7bd9fae |
|
||||
| `[labtools-web-vds-deploy]` | 🟢 closed (LIVE) | 17 | labtools:43e28ba |
|
||||
### 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`.
|
||||
|
||||
Рунбуки: `.wiki/concepts/{emspb,labtools,labtools.pro}-vds-deploy-runbook.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).
|
||||
|
||||
## DNS-факты (на будущее)
|
||||
- Зоны на РАЗНЫХ провайдерах: `emspb.ru`/`labtools.pro` — **reg.ru** (`ns1/ns2.reg.ru`); `labtools.ru` — **Yandex DNS** (`dns1/dns2.yandex.net`). Проверять авторитетный NS того провайдера.
|
||||
- labtools.ru siteUrl = **non-www** (`https://labtools.ru`, sitemap host без www); emspb/labtools.pro = www (R3). Разные тенанты — разный canonical.
|
||||
### 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`.
|
||||
|
||||
## Открытые follow-up (не блокеры, по решению оператора)
|
||||
- **RUVDS-биндинги labtools.ru/www + labtools.pro/www** ещё на IIS (rollback). Снять как для emspb (`Remove-WebBinding` + backup config) — когда оператор скажет. Ключ: `~/.ssh/ruvds-iis-migration`, `Administrator@80.64.31.36`. См. [[../.wiki/entities/ruvds-iis-host]].
|
||||
- **`emspb.snolla.com`** — НЕ мигрирован (DNS→IIS), биндинг оставлен намеренно. Отдельная миграция если понадобится.
|
||||
- **www.labtools.ru** — на момент wrap ещё split-brain (публичный кэш RUVDS, TTL до 6ч); авторитетные оба уже VDS, LE-cert на www выпущен. Доедет сам. Спот-чек внешним резолвером позже.
|
||||
- **Косметика labtools.pro:** стартовый баннер лога = `labtools.ru (snolla)` (константа app-name из скаффолда). У workshop, не блокер.
|
||||
### 4. stostayer.old — stale, НЕ мигрировать
|
||||
`C:\sites\stostayer.old` (каталог `stostayer`, `old.stostayer.ru`) — старая копия. Текущий stostayer = тенант в каталоге `MoreThenCms` (SiteId `9cf0a8e5`), уже в MinIO. Его локальные ассеты в MinIO лить нельзя (stale + коллизия owner-ID). Юзер: «неросайт, делай что хочешь». Использовался только как источник DLL-зависимостей для пробы.
|
||||
|
||||
## Guards
|
||||
- RUVDS IIS НЕ выводить целиком (общий catch-all, ещё держит ~22 хоста + rollback).
|
||||
- НЕ добавлять `Host(...)` в traefik ДО подтверждения флипа на **всех** авторитетных NS зоны (LE rate-limit).
|
||||
- Стеки на VDS — только через Portainer (env сохранять при PUT, pullImage=false для label-only правок).
|
||||
## Отложено (решения юзера, зафиксированы)
|
||||
- **Локальный IIS на [[windows-recovery-host]]** под мультитенантную админку — поднимать, когда сайты уедут с RUVDS (сам PC жив, серверная роль была декоммишнута — обновить статус в `.wiki/entities/windows-recovery-host` при подъёме).
|
||||
- **Миграция всех сайтов на snolla** — отдельный длинный трек (как labtools/pilonuxt).
|
||||
|
||||
## Инфра-заметки
|
||||
- Сборка образов — на VDS из `git archive <sha>` (обход traefik-499), push с VDS. VERDACCIO_CI_TOKEN + PORTAINER_API_KEY в `pass vds-kzntsv/full-env`.
|
||||
- Env всех snolla-тенантов идентичен (8 секретов) — при новом стеке брать verbatim из соседнего (`GET /api/stacks/<id>|.Env`).
|
||||
## ⚠️ 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`). Коммитнуть+запушить в начале след. сессии, если юзер разрешит.
|
||||
|
||||
## Memory updates за сессию
|
||||
- Дополнена `operator-dns-flip-verify-domain-before-cutover`: проверять АВТОРИТЕТНЫЙ NS (не публичный кэш), гейт = ВСЕ auth-NS согласны (dns1/dns2 расходятся mid-propagation), идентифицировать провайдера зоны.
|
||||
## Ключевые ссылки
|
||||
- Трекеры: `.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`.
|
||||
|
||||
Reference in New Issue
Block a user