B4 endpoint flip + pre-existing S3-provider KeyNotFoundException bug (gallery preview
ownerId) fixed via drop-in DLL. Preview confirmed live by user. Runbook §B4 + NEXT_SESSION
updated with root cause + fix reference.
Co-Authored-By: Claude <noreply@anthropic.com>
5-й сайт тиража v3 (после on-snolla, kupimknigi, labtools.ru, labtools.pro). Тот же паттерн, отработан чисто. **5/6 GREEN.** emspb = стек 18, in-place bump (DNS на VDS с 2026-07-02).
6-й и последний сайт тиража v3 (после on-snolla, kupimknigi, labtools.ru, labtools.pro, emspb).
Тот же паттерн, отработан чисто. **6/6 v3 сайтов GREEN.** tandemmebel = стек 20, in-place bump (DNS на VDS с 2026-07-12).
NB: handoff от prev-сессий флагал tandemmebel «BLOCKED на sharp-staging визуальном дефекте» — **STALE**.
tandemmebel LIVE на VDS с 2026-07-12 (commit afb6e5f0 это фиксил в борде, memory тоже). User подтвердил
в этой сессии: «да с чего ты взял что блокер, сайт уже давно на бою». Бамп прошёл чисто, без блокера.
### Что сделано
- **Bump:** `@snollajs/snolla 0.42.1→0.43.2` в `apps/web/package.json` (commit `5afd8a1`) + resolutions-блок в root `package.json` (verbatim labtools.ru) + реген `yarn.lock` (single `@smithy/signature-v4@5.3.11` deduped). Pushed victor/emspb.ru master `218c3ae..5afd8a1`. Endpoint fix `218c3ae` (s3.endpoint→minio.vds.kzntsv.site) был в master с 2026-07-29, но в бегущем образе `95a5c42` (v2) его не было — v3 cutover заодно перевёл S3-direct read на vds minio.
- **Build на VDS:** `git archive 5afd8a1` → `~/build/emspb` → `docker build -f deploy/Dockerfile --build-arg VERDACCIO_TOKEN` → `registry.kzntsv.site/emspb:5afd8a1`(+latest), digest `sha256:72bb59fc355d…`, EXIT=0. `yarn install --immutable` в Docker прошёл (yarn.lock matches, no YN0028).
- **Portainer PUT stack 18 LIVE:** node in-memory `put-stack` (Node 22 global fetch, compose в JS-var; GET `/stacks/18` для Env + `/stacks/18/file` для StackFileContent — `StackFileContent`НЕ на `/stacks/{id}`, только на `/stacks/{id}/file`), env 8/8 preserved, `prune:false pullImage:true mem_limit 512m`. PUT 200. Контейнер `5afd8a1` healthy ~1s.
- **Скрипт-баг поймал и исправил:** `$"\n"` в bash = literal backslash-n, не newline → locs загрязнялись trailing `\n` → фейковые 404/301. Переписал gate на `while read -r` + temp-файлы (gate2.sh). Урок: всегда verify locs чистые перед status-чексом.
- **Portainer PUT stack 20 LIVE:** node in-memory `put-stack` (НЕ PS — кириллица compose; Node 22 global fetch, GET `/stacks/20` для Env + `/stacks/20/file` для StackFileContent), env 8/8 preserved, `prune:false pullImage:true mem_limit 512m`. PUT 200. Контейнер `9d51c09` healthy ~9s.
4-й сайт тиража v3 (после on-snolla, kupimknigi, labtools.ru). Тот же паттерн, отработан чисто. **4/6 GREEN.** labtools.pro = English-twin (`Culture=en`) labtools.ru, отдельный репо `victor/labtools.pro`, image name `labtools-pro` (НЕ`labtools`), стек 19.
### Что сделано
- **Bump:** `@snollajs/snolla 0.42.1→0.43.2` в `apps/web/package.json` (commit `12f8992`) + resolutions-блок в root `package.json` (verbatim labtools.ru) + реген `yarn.lock` (commit `a106622`, single `@smithy/signature-v4@5.3.11` deduped). Pushed victor/labtools.pro master `6c7ea88..a106622`. Endpoint fix `6c7ea88` (s3.endpoint→minio.vds.kzntsv.site) был в master с 2026-07-29, но в бегущем образе `0610432` (v2) его не было — v3 cutover заодно перевёл S3-direct read на vds minio.
Третий сайт тиража (после on-snolla + kupimknigi). Тот же паттерн, отработан чисто. 3/6 GREEN.
### Что сделано
- **Bump:** `@snollajs/snolla 0.42.1→0.43.2` в `apps/web/package.json` + resolutions-блок в root `package.json` (commit `0dc0b4e`, pushed victor/labtools.ru master). yarn install: single `@smithy/signature-v4@5.3.11` (deduped). Endpoint fix `4f3314f` (s3.endpoint→minio.vds.kzntsv.site) был в master с 2026-07-29, но в бегущем образе `566d41c` (v2) его не было — v3 cutover заодно перевёл S3-direct read на vds minio.
- **Staging :5079 parity-gate GREEN:** throwaway контейнер из env живого стека 21. `/` byte-identical с real Host (`Host: kupimknigi.spb.ru`), theme asset `toolbox.css` 200 35799 B byte-identical (v3 aws-sdk v3 S3-direct read из vds MinIO 2025), robots 200, `/callback-order/`→301. 3-байт diff без Host = form hidden `url`=request-URL (benign request-context).
- **Portainer PUT stack 21 LIVE:** node in-memory `put-stack` (НЕ PS — кириллица compose), JWT re-auth перед PUT, env-preserving 8/8, `prune:false pullImage:true mem_limit 512m`. PUT 200. Source-of-truth compose синхронно закоммичен (admin `6f6fab1d`).
- **Live smoke GREEN:** `/` 200 17708 B, H1 «Скупка книг на дому в СПб…», robots/sitemap 200, `/callback-order/`→301, theme asset 200 35799 B. Контейнер `5364353` healthy. TLS LE до Oct 3 (не тронут). **Rollback = `9608ff6`** (v2, жив в registry).
- **Bundles a83e2a9 endpoint fix** (minio.kzntsv.site→minio.vds.kzntsv.site) — был в репо с 2026-07-29, но в бегущем образе 9608ff6 его не было; v3 cutover заодно перевёл S3-direct read на vds minio.
User разворот 2026-07-30: v3 (aws-sdk v2→v3) — **конечная цель**, v2-пилот был промежуточным
доказательством. on.snolla.com = v3-пилот. Скоординировано с snolla-сессией (peer, inter-session):
snolla опубликовала v3, admin зарезал боевой cutover.
| books-task-runner-registry-auth-cred | 🔵 blocked — cred в config-volume, рабочий образ содержит СТАРЫЙ registryGc; тега master-a3734d5 в реестре нет | `.tasks/STATUS.md` §books-task-runner |
## Спроси user'а
- **Следующий сайт тиража v3** — 5/6 GREEN (on-snolla, kupimknigi, labtools.ru, labtools.pro, **emspb**). Остался: **tandemmebel** (стек 20 — был BLOCKED на sharp-staging визуальном дефекте, проверить перед бампом). Паттерн отработан x5: bump `@snollajs/snolla→0.43.2` + resolutions + реген `yarn.lock` (иначе Dockerfile `yarn install --immutable` падает) → build на VDS → staging :50XX parity-gate → Portainer PUT (node in-memory `put-stack`, env-preserving). NB: yarn.lock реген — обязателен; Portainer `StackFileContent` брать с`/stacks/{id}/file`, не `/stacks/{id}`.
-stostayer v3-трек (0.43.1/0.7.8/0.17.2) — HOLD, snolla-scope, НЕ подхватывать без GO user (snolla ждёт stostayer-specific).
- **v3 тираж завершён (6/6 GREEN).** Что дальше? Открытые MinIO-split треки: Track A (books-vds minio 2020→2025 migration — transparent). B4 (.NET catch-all админ s3 endpoint) ✅ закрыт этой сессией (login 200; Asset Manager preview — confirm в админке). B5 (Obsidian Remotely Save) ✅ закрыт. ИЛИ stostayer v3-трек (HOLD, snolla-scope — ждёт stostayer-specific, НЕ подхватывать без GO user).
-B4 ✅ закрыт. Track A — последний transparent фоновый шаг, закрывает распад books-vds minio.
## Не делать (preemptive guards)
- **verify end-to-end против живой цели, НЕ trust halted-bisect гипотезе** — и НЕ лепи «CONFIRMED» без live-теста (косяк этой сессии, см. memory `aws-sdk-v3-smithy-sigv4-minio-regression`).
- **resolutions OPTIONAL, НЕ mandatory** — live verify доказал: 5.6.12 работает vs vds MinIO 2025. Resolutions = determinism-hardening, не SigV4-необходимость.Не пугать framing «упадёт без resolutions».
- **verify end-to-end против живой цели, НЕ trust halted-bisect гипотезе** — и НЕ лепи «CONFIRMED» без live-теста (memory `aws-sdk-v3-smithy-sigv4-minio-regression`).
- **resolutions OPTIONAL, НЕ mandatory** — live verify доказал: 5.6.12 работает vs vds MinIO 2025. Resolutions = determinism-hardening, не SigV4-необходимость.
- **НЕ пушить образы в `docker.stostayer.ru:443`** (VPN-бан). Registry = `registry.kzntsv.site` (vds), build на VDS — ок.
- **НЕ лезть в прод-БД** stostayer — user остановил. Диагностика через логи контейнера + исходники.
- **Portainer PUT: node in-memory, НЕ PS Invoke-RestMethod** (корраптит кириллицу compose). API-key работает для PUT (200), JWT только для stack CREATE.
- **curl `/tmp/` vs node `/tmp/` на Windows расходятся** — in-memory в одном node-скрипте, без temp-файлов.
- **Дисциплина: runbook'и → `.wiki/concepts/<slug>-runbook.md`**, не `scripts/`. `scripts/` только для executable. Креды →`pass`, не plaintext в git.
- **VDS gitea-SSH нет** (Permission denied publickey) — сборка на VDS через `git archive` (локально) → transfer → extract, не `git clone` на VDS.
- **Portainer PUT: node in-memory, НЕ PS Invoke-RestMethod** (корраптит кириллицу compose). `StackFileContent` брать с`/stacks/{id}/file`, не `/stacks/{id}`.
- **bash `$"\n"` ≠ newline** — это locale-translation, даёт literal `\n`. Для newline в bash: `$'\n'` или `while read -r`. Иначе locs загрязняются → фейковые status-коды в parity-gate.
- **VDS gitea-SSH нет** — сборка на VDS через `git archive` (локально) → scp → extract, не `git clone` на VDS.
- **VDS SSH:** `ssh -i ~/.ssh/id_ed25519 vitya@89.253.255.94` (креды `pass show vds-kzntsv/full-env`, PORTAINER_API_KEY там же).
- **Дисциплина: runbook'и → `.wiki/concepts/<slug>-runbook.md`**, не `scripts/`. Креды → `pass`, не plaintext в git.
## Memory updates за сессию
- UPDATE `aws-sdk-v3-smithy-sigv4-minio-regression.md` — «CONFIRMED» секция исправлена: dual-instance реален, но 5.6.12 работает vs vds MinIO 2025 (live verify end-to-end); resolutions = optional determinism НЕ mandatory; v3 опубликована (snolla 0.43.2). Урок: не лепи CONFIRMED без live-теста.
- UPDATE `aws-sdk-v2-minio-2025-works-no-smithy-pin.md` — путь runbook'а → `.wiki/concepts/`.
- MEMORY.md index обновлён (v3 строка + corrected framing).
- (runbook migration + per-site v3 секция — в `.wiki/`, не memory.)
- UPDATE `aws-sdk-v2-minio-2025-works-no-smithy-pin.md` — «remaining 5 CMS sites» теперь STALE: **все 6 v3 сайтов GREEN на 0.43.2**, тираж завершён 2026-07-30. Строка про «config-endpoint bump only» устарела.
| B5 Obsidian Remotely Save endpoint | ⏳ TODO | после B1 миррора obsidian (готово) — менять endpoint |
| B4 .NET catch-all админ s3 endpoint | ✅ DONE 2026-07-30 | `C:\sites\snolla\Web.config``<fileStorageClients>` 6/6 endpoint `minio.kzntsv.site`→`minio.vds.kzntsv.site` (galleries/assets/themes×4). region `us-east-1`, forcePathStyle (bin: AWSSDK.Core/S3 v3 модульный, bindingRedirect AWSSDK 1.3.19 — legacy-мусор). Pre-flip verify: `MINIO_ROOT_USER`==Web.config accessKey `AKIAJ2YJP72W6ZHCRE6Q` (reuse, no rotation) → mc alias Web.config-кредами → `minio.vds.kzntsv.site` → galleries/assets/themes читаются (B1 mirror жив). IIS auto-recycle по Web.config; login 200. **Превью:** оказался pre-existing баг S3-провайдера (НЕ от flip): `GalleriesStorage`/`AssetsStorage` ctor падал `KeyNotFoundException` на `config["ownerId"]` — контроллер-пути gallery preview/upload/delete и media-assets передавали только `siteContext`. Self-test провайдера gap — покрывал `GalleryImagesService` + unit-тесты `S3Ids`/`S3ObjectKey`, но preview-контроллер не тестировался. Фикс в провайдере (drop-in 1 DLL, MoreThenCms.FileStorage.S3.dll — `ToolsController` в `MoreThenCms.Web.dll` не собирается на боксе): `S3CloudStorage.ReadOwnerId` null-safe (explicit ownerId винит; иначе `siteContext.AssetsOwnerId`==SiteId; пусто → null без throw). Тесты 21/21 (4 новых). Live-verified: превью грузятся против vds MinIO. Коммит MoreThenCms `09cb072d`. Backup: `Web.config.b4.bak` + `MoreThenCms.FileStorage.S3.dll.b4.bak`. |
| B5 Obsidian Remotely Save endpoint | ✅ DONE 2026-07-30 | endpoint flipped `minio.kzntsv.site`→`minio.vds.kzntsv.site` в vault `C:\Users\vitya\obsidian\main\.obsidian\plugins\remotely-save\data.json` (rev+base64 обфускация), bucket `obsidian`, s3Region `us-east-1`, forcePathStyle. Verified деобфускацией config-блока. См. memory `obsidian-remotely-save-endpoint-after-mirror` (менять ТОЛЬКО после B1 миррора — что и было). |
**Решение user (2026-07-30):** сплит без бампа snolla-пакетов — сайты остаются на 0.42.1 + aws-sdk v2, только config endpoint. snolla-евый v3-трек (0.43.1/0.7.8/0.17.2) — HOLD, отдельная история (stostayer). Пилот on-snolla подтвердил: **v2 vs MinIO 2025 работает** (без @smithy pin) — SignatureDoesNotMatch нет.
- kupimknigi (21), **tandemmebel (20)** — 0.42.0 cutover, tandemmebel in-place bump до 0.42.1 2026-07-12. (kupimknigi остался на 0.42.0 по решению оператора — см. `NEXT_SESSION.md`.)
- kupimknigi (21), **tandemmebel (20)** — 0.42.0 cutover, tandemmebel in-place bump до 0.42.1 2026-07-12. (kupimknigi остался на 0.42.0 по решению оператора — см. `NEXT_SESSION.md`.)
6-й сайт тиража v3 (после on-snolla, kupimknigi, labtools.ru, labtools.pro, emspb — 5 GREEN). In-place bump стека 20 (DNS на VDS с 2026-07-12, не трогали). Рецепт — [[minio-split-cutover-runbook]] §B3-v3. **6/6 v3 сайтов GREEN = тираж завершён.**
- **Bump:** `@snollajs/snolla 0.42.1→0.43.2` в `apps/web/package.json` (commit `9d51c09`) + `resolutions`-блок в root `package.json` (verbatim labtools.ru: `@aws-sdk/client-s3 3.1005.0` + `@smithy` chain 5.3.11 — optional determinism, live verify доказал 5.6.12 работает vs vds MinIO 2025) + реген `yarn.lock` (single `@smithy/signature-v4@5.3.11` deduped, no dual-instance). Pushed victor/tandemmebel.ru master `f4ddce6..9d51c09`. Endpoint fix `f4ddce6` (s3.endpoint→minio.vds.kzntsv.site) был в master с 2026-07-29, но в бегущем образе `8df10ee` (v2) его не было — v3 cutover заодно перевёл S3-direct read на vds minio.
- **Build на VDS:** `git archive 9d51c09` → `~/build/tandemmebel` → `docker build -f deploy/Dockerfile --build-arg VERDACCIO_TOKEN` → `registry.kzntsv.site/tandemmebel:9d51c09`(+latest), digest `sha256:d14982c24dc7c61a334c8973e6f1c48147c7d3cbcc772b28af6c629431947b16`, 476MB (v2 8df10ee был 583MB — v3 leaner), EXIT=0. `yarn install --immutable` в Docker прошёл (yarn.lock matches).
- **Portainer PUT stack 20 LIVE:** node in-memory `put-stack` (НЕ PS — кириллица compose; Node 22 global fetch, GET `/stacks/20` для Env + `/stacks/20/file` для StackFileContent), env 8/8 preserved, `prune:false pullImage:true mem_limit 512m`. PUT 200. Контейнер `9d51c09` healthy ~9s.
mem_limit: 512m # guardrail от runaway:snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only).
environment:
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.