diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index ce13f17..0325846 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,44 +1,55 @@ --- -_last_updated_: 2026-08-03T13:08:14Z -session_id: 2026-08-03-labtools-catalog-provider-live -prev_session_id: 2026-08-03-labtools-cylindrical-rootcause-handoff +_last_updated_: 2026-08-03T14:29:08Z +session_id: 2026-08-03-minio-split-track-a-done +prev_session_id: 2026-08-03-labtools-catalog-provider-live --- # Next session handoff -## Эта сессия — labtools cylindrical ЗАКРЫТ (catalog provider core 0.26.6, LIVE GREEN). Крекнин — завтра (Алексей готов). MinIO split Track A — следующая сессия (директива user'а). +## MinIO split Track A — ✅ DONE 2026-08-03. Оба books-vds minio на 2025. Крекнин — завтра (Алексей). Бэкапы вернуть после ремонта. -### 1. labtools.ru cylindrical — 🟢 CLOSED, LIVE GREEN -Отмашка snolla (core 0.26.5, store-only) НЕ чинила: labtools — **catalog-модуль**, store нет, provider = `LinkedCatalogProductsProvider`. Реализован полный диспетчер `packages/core/lib/viewModels/linkedItemResolver.js` (порт legacy `ILinkedEntitiesProvider`): dispatch по provider-строке → catalog (`CatalogsService.findProductById`) / blog (`findPostByGlobalId`) / page (`getPageById`) / store (fallback). **core 0.26.6** published (verdaccio), сьют **263/263**, commit `5f0f996`. labtools `yarn.lock` → 0.26.6 (`d263e1c`), стек 17 swap (env 8/8), **LIVE GREEN**: cylindrical 0 empty href/src, 8 карточек гидратированы (round-xrf/vacuum-ir/…). Таска `content-page-linked-products-hydration` закрыта; snolla подтвердил + вики-ингест (`related-products-linked-items.md`). **Rollback = `0dc0b4e`.** +### 1. MinIO split Track A — ЗАКРЫТ (live GREEN, прозрачный апгрейд) +Оба инстанса books-vds переведены `RELEASE.2020-07-13` → `RELEASE.2025-09-07T16-13-09Z` (тот же digest что vds minio, креды `AKIAJ2…` не тронуты): +- **shared `minio` (стек 30, minio.kzntsv.site):** зеркало 17 бакетов → `/usr/docker/minio/data-new`, Portainer swap, traefik/imgproxy/books-api/task-runner/job-scheduler — GREEN. Rollback: старый `/usr/docker/minio/data` жив. +- **`bookva-minio` (стек 49):** зеркало `books` (38692 obj) → том **`bookva-minio-data-new`** (rename НЕдоступен — старый docker daemon прячет `volume rename`; имя осталось `-new`). bookva-api/task-runner GREEN. Rollback: `bookva-minio-data` (2020) + 2020 image. +- **Бэкап-скрипт обновлён** (репо + хост `/opt/stacks/backup/run.sh`) на новые пути: `/usr/docker/minio/data-new`, `/var/lib/docker/volumes/bookva-minio-data-new`. +- Gotchas записаны в runbook Track A (§ прогресс): mc multipart-баг → `--disable-multipart`; параллельные зеркала → транзиентные сбои на 3.8G хосте → **последовательно + retry**; CRLF compose → `tr -d '\r'`; 2025 minio на kernel 3.10 (CentOS 7 EOL) — WARN о perf, работает. -### 2. Крекнин-ремонт — ЗАВТРА (координация с Алексеем) -План готов (`.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`): power-off → перетык SATA (sdb питание+data) → power-on → Repair md3 → btrfs scrub → VMM. **Бэкапы выключены с 31.07** (vds-backup 05:00 + books-vds-backup 06:00, cron закомментированы) — вернуть после ремонта, это критичный хвост. Rescue-диск `/mnt/rescue` (1.1TB) — НЕ отключать до конца ремонта. Решение: оставить как доп. копию или отключить — после ремонта. +### 2. Retire старых данных — ⏳ ЧЕРЕЗ 48ч (≈ 2026-08-05) +Старые 2020-данные держать как откат до ~2026-08-05, потом: +- `rm -rf /usr/docker/minio/data` (12G, shared 2020) — ТОЛЬКО после подтверждения стабильности. +- `docker volume rm bookva-minio-data` (2020) — после подтверждения. +- До этого: rollback = Portainer PUT стека 30/49 на 2020 image + старый путь/том. -### 3. MinIO split Track A — СЛЕДУЮЩАЯ СЕССИЯ (user directive) -books-vds 2020 → vds 2025. Сделано: bucket `variant-cache` (2026-07-31). Остальное TODO. Runbook: `.wiki/concepts/minio-split-cutover-runbook.md`. +### 3. Крекнин-ремонт — ЗАВТРА (2026-08-04, координация с Алексеем) +План: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`. Power-off → перетык SATA → Repair md3 → scrub → VMM. **Бэкапы выключены с 31.07** (vds-backup 05:00 + books-vds-backup 06:00) — **вернуть после ремонта** (критичный хвост). Rescue `/mnt/rescue` не отключать. Примечание: бэкап-скрипт books-vds уже указывает на новые minio-пути — ок. ### 4. Кэш тасков стейл — refresh ОТЛОЖЕН -projects-meta `tasks.json` synced 2026-07-22 (12 дней, `stale: true`). `meta_restart_poller force=false` отказал: 4 активных агента (victor/tandemmebel.ru, victor/O_C-Phazerville, victor/snolla, victor/pilorama98.ru). **force=true убьёт их работу — НЕ делать.** Когда агенты освободятся → graceful restart → кэш обновится. +projects-meta tasks.json sync 2026-07-22 (stale). `meta_restart_poller force=false` отказал (4 активных агента). НЕ force-restart пока агенты заняты. ### Спроси user'а -- Крекнин: подтвердить время power-off с Алексеем (завтра). Rescue-диск после ремонта — оставить/отключить? +- Retire старых minio-данных: подтвердить через ~48ч (или сделать это самому, если GREEN держится). +- books-vds imgproxy (стек 29) — вывести из эксплуатации? (P3; сейчас imgproxy.kzntsv.site → vds, books-vds imgproxy читает minio:9000, кажется мёртвым грузом). +- A3: чистка bookva-дублей в shared `books` (минор, не срочно). ### Открытые треки | Трек | Готовность | Entry-point | |---|---|---| -| MinIO split Track A | открыт | `minio-split-cutover-runbook` | +| Retire старых minio-данных (48ч) | ⏳ до 2026-08-05 | `minio-split-cutover-runbook` §P3 | | kreknin-repair-md3-rebuild | завтра | `.tasks/kreknin-repair-md3-rebuild.md` | +| Бэкапы (vds+books-vds) вернуть | после kreknin-ремонта | cron на хостах | +| P3 imgproxy stack 29 retire / A3 дубли | опционально | runbook §P3 | | Кэш тасков refresh | отложен | `meta_restart_poller` после освобождения агентов | ### Не делать (preemptive guards) -- **НЕ force-restart поллера** пока активные агенты — убивает чужую работу. -- **НЕ лезть в snolla-код самому** — через snolla-сессию (таска/инбокс), .admin только деплоит (память admin-hands-snolla-repo-work-to-snolla-session). -- Ребутить kreknin пока sda-кабель не зафикшен; не трогать rescue-диск; не забыть вернуть бэкапы. +- **НЕ force-restart поллера** пока активные агенты. +- **НЕ лезть в snolla-код самому** — через snolla-сессию (.admin деплоит). +- НЕ трогать rescue-диск; НЕ забыть вернуть бэкапы после ремонта. +- НЕ удалять старые minio-данные до 48ч окна (и без подтверждения). - НЕ PS для Portainer (кириллица); креды → `pass`. ### Коммиты сессии (.admin) -- `61f6afd2` compose → d263e1c; `c0a8d12b` cylindrical CLOSED; (с этим хэндоффом: on-snolla-vds-migration CLOSED + NEXT_SESSION). +- `scripts/books-vds-backup-daily-kreknin/{run.sh,README.md}`, `.wiki/entities/books-vds.md`, `.wiki/concepts/minio-split-cutover-runbook.md` — Track A done + пути бэкапа на новые тома. (с этим хэндоффом). ### Memory updates -- `snolla-two-product-modules-store-vs-catalog` — catalog-сайты без store; linked-item dispatch по provider-строке. -- `admin-hands-snolla-repo-work-to-snolla-session` — snolla-код не трогать, через snolla-сессию. +- `books-vds-minio-upgraded-2025-volume-names` — новые пути живых данных (data-new, bookva-minio-data-new), rename недоступен, mc `--disable-multipart`, последовательные зеркала. diff --git a/.wiki/concepts/minio-split-cutover-runbook.md b/.wiki/concepts/minio-split-cutover-runbook.md index 4672cca..73d608f 100644 --- a/.wiki/concepts/minio-split-cutover-runbook.md +++ b/.wiki/concepts/minio-split-cutover-runbook.md @@ -37,7 +37,7 @@ updated: 2026-07-30 | **B3v3 labtools.pro** | ✅ LIVE 2026-07-30 | bump `@snollajs/snolla 0.42.1→0.43.2` + resolutions (commits `12f8992` bump + `a106622` yarn.lock реген — обязателен, иначе `yarn install --immutable` падает YN0028). Endpoint fix `6c7ea88` в master, но в бегущем образе `0610432` (v2) его не было. Build на VDS (archive → `~/build/labtools-pro`) → `registry.kzntsv.site/labtools-pro:a106622`(+latest), digest `2152642c4b17`. Throwaway staging :5081 parity-gate GREEN: `/`+nav+catalog 4-байт diff = `og:url`/`og:image` request-host (benign), redirects IDENT, robots/sitemap IDENT (7 детей == live), theme `lato.css` 200 9994B md5-identical (v3 S3-direct), order-parity press-forms 12 изделий. Portainer PUT stack 19 env-preserving (8/8, node in-memory put-stack), `prune:false pullImage:true mem_limit 512m`. Live smoke GREEN: nav+каталог+продукты 200, theme 200 9994B, TLS CN=labtools.pro не тронут (LE до Sep 30). **Rollback = `0610432`** (v2, жив). См. [[labtools.pro-vds-deploy-runbook]] §0.43.2. | | **B3v3 emspb.ru** | ✅ LIVE 2026-07-30 | bump `@snollajs/snolla 0.42.1→0.43.2` + resolutions (commit `5afd8a1`, apps/web + root). Endpoint fix `218c3ae` в master, но в бегущем образе `95a5c42` (v2) его не было — v3 cutover заодно перевёл S3-direct read на vds minio. Build на VDS (archive → `~/build/emspb`) → `registry.kzntsv.site/emspb:5afd8a1`(+latest), digest `72bb59fc…`. Throwaway staging :5082 parity-gate GREEN: robots md5 identical (31B), sitemap 29 locs == live, 29/29 routes 200 (+2B host-context benign), theme assets 7/7 md5 IDENTICAL (v3 S3-direct: snolla-framework/bootstrap/toolbox/theme/slick + images/2.jpg + /images/3.jpg 115618B). Portainer PUT stack 18 env-preserving (8/8, node in-memory put-stack), `prune:false pullImage:true mem_limit 512m`. Live smoke GREEN: nav 200, /services+/index.php 404, theme assets md5 LIVE==staging, redirects 301 byte-identical post-cutover, apex 200. TLS не тронут. **Rollback = `95a5c42`** (v2, жив). См. [[emspb-vds-deploy-runbook]] §0.43.2. | | **B3v3 tandemmebel.ru** | ✅ LIVE 2026-07-30 | bump `@snollajs/snolla 0.42.1→0.43.2` + resolutions (commit `9d51c09`, apps/web + root) + реген `yarn.lock` (single `@smithy/signature-v4@5.3.11`). Endpoint fix `f4ddce6` в master, но в бегущем образе `8df10ee` (v2) его не было — v3 cutover заодно перевёл S3-direct read на vds minio. Build на VDS (archive → `~/build/tandemmebel`) → `registry.kzntsv.site/tandemmebel:9d51c09`(+latest), digest `d14982c24dc7…`, 476MB (v2 8df10ee 583MB — v3 leaner). Throwaway staging :5020 parity-gate GREEN: robots md5 `a01e4c60…` identical (87B), sitemap 5 sub-sitemaps → **184 locs == live 184 IDENTICAL** (0 prod-only/new-only), self-consistency 183×200 + 1×404 (`/articles` parity benign), `/` +557B host-context benign, theme `Gotham-Pro.css` 200 4436B (v3 S3-direct). Portainer PUT stack 20 env-preserving (8/8, node in-memory put-stack — кириллица compose), `prune:false pullImage:true mem_limit 512m`. Live smoke GREEN: `/` 200 45742B, `/projects` 200, sitemap 184 locs, robots md5 identical, theme 200 4436B. TLS CN=tandemmebel.ru не тронут (LE до Oct 10). **Rollback = `8df10ee`** (v2, жив). См. [[tandemmebel-vds-deploy-runbook]] §0.43.2. **6/6 v3 сайтов GREEN — тираж v3 ЗАВЕРШЁН.** | -| Track A (books-vds minio 2020→2025) | ⏳ TODO | transparent, отдельно от Track B | +| Track A (books-vds minio 2020→2025) | ✅ DONE 2026-08-03 | **Оба инстанса переведены** на `RELEASE.2025-09-07T16-13-09Z` (тот же digest что vds). Shared `minio` (стек 30): зеркало всех 17 бакетов → `/usr/docker/minio/data-new`, Portainer swap, traefik/imgproxy работают. `bookva-minio` (стек 49): зеркало `books` (38692 obj) → том `bookva-minio-data-new` (docker volume rename НЕдоступен — старый daemon API; живёт на -new, бэкап-скрипт обновлён). Старые данные (`/usr/docker/minio/data`, `bookva-minio-data`) сохранены 48ч. Gotchas: (1) mc multipart-баг `ContentLength=16777216` на крупных файлах → `--disable-multipart`; (2) транзиентные `Connection closed by foreign host` при дефиците памяти (3.8G) при ПАРАЛЛЕЛЬНЫХ зеркалах → последовательно + retry-цикл; (3) compose файлы CRLF → `\r` в секрете ломает Authorization → `tr -d '\r'`; (4) Portainer stack file — через API `/api/stacks/{id}/file`. | | **variant-cache bucket на vds 2025** | ✅ DONE 2026-07-31 | v3 cutover перевёл сайты на vds MinIO 2025, но `variant-cache` bucket не создали там (был на books-vds 2020). NoSuchBucket → 500 на ALL sharp gallery-images всех 6 v3 сайтов с 2026-07-30 (gate проверял theme CSS, не gallery URLs). Fix: `mc mb vds/variant-cache` (пустой, регенерируем). maljarka portfolio 34/34 → 200. См. memory `variant-cache-bucket-missing-on-vds-2025` + [[maljarka-vds-deploy-runbook]] §Гочи. | | B4 .NET catch-all админ s3 endpoint | ✅ DONE 2026-07-30 | `C:\sites\snolla\Web.config` `` 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 миррора — что и было). | diff --git a/.wiki/entities/books-vds.md b/.wiki/entities/books-vds.md index f7de7a8..cc3e3c8 100644 --- a/.wiki/entities/books-vds.md +++ b/.wiki/entities/books-vds.md @@ -80,7 +80,7 @@ Post-migration 2026-05-25 (см. [[../concepts/portainer-stack-management-books- | 27 | `chrome` | chrome | — | Puppeteer browser for PDFs / scraping | | 28 | `proxy-chain` | proxy-chain | `/usr/docker/proxy-chain/config` | upstream HTTP-proxy chain, internal-only | | 29 | `imgproxy` | imgproxy + imgproxy-nginx | `/usr/docker/imgproxy/nginx/{cache,nginx.conf}` | serves `imgproxy.kzntsv.site`, S3→minio | -| 30 | `minio` | minio | `/usr/docker/minio/data` | S3 blob store, `minio.kzntsv.site` | +| 30 | `minio` | minio | `/usr/docker/minio/data-new` | S3 blob store, `minio.kzntsv.site` (MinIO 2025 upgrade 2026-08-03; old `/usr/docker/minio/data` kept 48h for rollback) | | 31 | `mongo` | mongo | `/usr/docker/mongo/data/{db,configdb}` | shared MongoDB 4.2 | | 32 | `books-db` | books-db | `/usr/docker/books-db/data` | MariaDB latest, books application DB | | 33 | `elasticsearch` | elasticsearch | `/usr/docker/elasticsearch/{data,snapshots}` | ES 7.10.0 + `path.repo=/snapshots` для backup + `reindex.remote.whitelist=elasticold.kzntsv.site:443` (added 2026-05-25 для migration) | @@ -116,7 +116,7 @@ Daily 06:00 MSK → kreknin. См. [[../sources/books-vds-backup-daily-kreknin-2 - DB dumps (slovo): books-db (mariadb), mongo (shared), books-job-scheduler-mongo - DB dumps (bookva, added 2026-06-12): bookva-db (mariadb, тот же root pw что books-db), bookva-mongo (no-auth) - ES snapshots via REST API (file repo `kreknin`): slovo `elasticsearch` + `bookva-es` (раздельные репо/каталоги) -- rsync bind paths + dumps + `bookva-minio-data` (named volume, raw) + `/usr/docker/bookva-es` (snapshot repo) + `/opt/books/` + `/etc/{ssh,hosts,cron.d}` + `/root/.ssh` → `vitya@kreknin:/volume1/NetBackup/books-vds//` +- rsync bind paths + dumps + `bookva-minio-data-new` (named volume, raw; live after 2026-08-03 upgrade — old `bookva-minio-data` kept 48h) + `/usr/docker/bookva-es` (snapshot repo) + `/opt/books/` + `/etc/{ssh,hosts,cron.d}` + `/root/.ssh` → `vitya@kreknin:/volume1/NetBackup/books-vds//` - ntfy `BOOKS-VDS backup OK ` + email - Retention 7 daily snapshots diff --git a/scripts/books-vds-backup-daily-kreknin/README.md b/scripts/books-vds-backup-daily-kreknin/README.md index 222ce5b..40217f6 100644 --- a/scripts/books-vds-backup-daily-kreknin/README.md +++ b/scripts/books-vds-backup-daily-kreknin/README.md @@ -12,7 +12,7 @@ Schedule: `0 6 * * *` Europe/Moscow (after VDS-infra at 05:00, after windows-hos | Mongo (shared) | `mongodump --archive` w/ root auth | container `mongo` | | Mongo (job-scheduler) | `mongodump --archive` no-auth | container `books-job-scheduler-mongo` | | Elasticsearch | REST snapshot API → fs repo `kreknin` → rsync | container `elasticsearch` (path.repo=/snapshots) | -| MinIO blobs | rsync direct (immutable content-addressed) | `/usr/docker/minio/data` | +| MinIO blobs | rsync direct (immutable content-addressed) | `/usr/docker/minio/data-new` | | App configs | rsync | `/opt/books/{api,job-scheduler,task-runner,ntfy,books-ops-mcp}` | | Traefik state | rsync | `/usr/docker/traefik/{letsencrypt,data}` (acme.json + config) | | System config | rsync | `/etc/{ssh,hosts,cron.d}`, `/root/.ssh` | diff --git a/scripts/books-vds-backup-daily-kreknin/run.sh b/scripts/books-vds-backup-daily-kreknin/run.sh index 4bb2ab0..ca5c87e 100644 --- a/scripts/books-vds-backup-daily-kreknin/run.sh +++ b/scripts/books-vds-backup-daily-kreknin/run.sh @@ -202,8 +202,8 @@ rsync -aHh --info=stats2 --delete $LINK_DEST_ARG \ /opt/books \ /usr/docker/elasticsearch/snapshots \ /usr/docker/bookva-es \ - /usr/docker/minio/data \ - /var/lib/docker/volumes/bookva-minio-data \ + /usr/docker/minio/data-new \ + /var/lib/docker/volumes/bookva-minio-data-new \ /usr/docker/traefik/letsencrypt \ /usr/docker/traefik/data \ /etc/ssh \ @@ -244,11 +244,11 @@ Dest: kreknin:$DEST_PATH Components: - /opt/books/{api,job-scheduler,task-runner,ntfy,books-ops-mcp} -- /usr/docker/{minio/data, elasticsearch/snapshots, traefik/{letsencrypt,data}} +- /usr/docker/{minio/data-new, elasticsearch/snapshots, traefik/{letsencrypt,data}} - /etc/{ssh,hosts,cron.d} - /root/.ssh - DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo, bookva-db (mariadb), bookva-mongo -- bookva-minio: raw volume (bookva-minio-data) +- bookva-minio: raw volume (bookva-minio-data-new) - ES snapshots: $ES_SNAP (slovo elasticsearch + bookva-es, separate repos) Log: $LOG"