diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index f98cb70..573c0fb 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,58 +1,46 @@ --- -_last_updated_: 2026-08-02T10:00:00Z -session_id: 2026-08-02-kreknin-rescue-sdd-restore -prev_session_id: 2026-07-31-maljarka-restore-variantcache-labtools +_last_updated_: 2026-08-03T10:05:00Z +session_id: 2026-08-03-labtools-cylindrical-rootcause-handoff +prev_session_id: 2026-08-02-kreknin-rescue-sdd-restore --- # Next session handoff -## Эта сессия — kreknin rescue + sdd/VM-volume restore. ДЕЛА ЗАВЕРШЕНЫ (кроме физики). См. `.tasks/kreknin-repair-md3-rebuild.md` +## Эта сессия — labtools.ru cylindrical: root-cause найден в коде snolla, таска поставлена. Крекнин-ремонт не тронут (ждёт координации). -User: «срочная разовая задача — Алексей продул синологию компрессором, проблемы с дисками». **Xpenology** (обычный ПК-корпус, DSM 7.1.1), пром-компрессор снёс SATA-кабели. +### 1. labtools.ru cylindrical — 🔵 → корень найден, отдано snolla. ✅ сделано +Симптом (live): `/products/press-forms/cylindrical` — 8 карточек `href=""`/`src=""`. `cylindrical.liquid:30-31` единственный из 9 читает Linked-item accessor `product_link.product.item` (остальные 8 — прямой `product`, работают). НЕ v3-регрессия (v2-образ 0.42.1 тоже пустой). -### 1. Диагноз (диск-раскладка, Xpenology = НЕ настоящий Synology, обычные SATA-кабели) -| Диск | Порт | Модель | Роль | Статус | -|---|---|---|---|---| -| sda | ata1 | WD40EFPX 4TB | md3 slot 3 | жив, **213 UDMA CRC + линк 6→1.5 Gbps = кабель** (CRC не растёт при чтении) | -| sdb | — | WD-WX32D12L8HTE 4TB | md3 slot 0 | **не определяется** = отвал кабеля (не доказан мёртвым) | -| sdc | ata3 | WD40EFAX 4TB SMR | md3 slot 1 | жив; WRITE FPDMA bursts **только при ручном трясе кабелей** (09:58, 12:09), без тряса стабилен | -| sdd | ata4 | Kingston SA400S37 120G SSD | md2 raid1 = **VMM-том /volume2** | восстановлен | +**Корень в коде snolla:** `packages/core/lib/viewModels/contentPages.js` `getPageViewModel` зовёт `fillViewModel(...)` **БЕЗ `fillOpts`** → `viewModels/index.js:696` `resolveLinkedItem = async () => null` → у `linkedItemEditorTemplate`-полей `buildLinkedItemField` даёт `{id,title,link,item}` с `item:null` → `.product.item` пуст. Образец фикса: ecommerce.js:107-117 + blogs.js:142 (это фикс `blog-related-hydration` core 0.13.6). -md3 = `/volume1` (btrfs, все бэкапы), degraded `[_UU]`, держится на sda+sdc. **Массив за 2 суток чтения — 0 новых ошибок.** +**Сделано:** +- Таска `victor/snolla/content-page-linked-products-hydration` (ready, needs-claude) — закоммичена в snolla `.tasks/STATUS.md` +- Инбокс-письмо: `snolla/.claude-inbox/2026-08-03T09-53-51Z-admin.md` +- Локальная доска `.admin/.tasks/STATUS.md` — 🔵 запись связана с таской snolla -### 2. sdd / VM-том восстановлен ✅ (сделано 2026-07-31) -DSM выкинул sdd из md2 при загрузочной тряске (07:47) → `/volume2` ушёл в **ro** (btrfs transient EIO). Восстановление: DSM Storage Manager → **Repair пула** → sdd вернулся (но `faulty active sync`) → затем в DSM на /volume2 кнопка **«Преобразовать в чтение/запись»** → **rw**, scrub 53GiB 0 ошибок. VMM-виртуалки целы (`@Repository`, `vdsm_repo.conf`). -**Урок: «Convert to read/write» в DSM снимает ro после transient EIO — без mdadm-ручнины.** +**Хвост:** ждать релиз core → передеплой стека 17 (labtools, Portainer) → смоук cylindrical (8 непустых href/src). Тему НЕ править (parity движка), прод-стек 17 healthy. -### 3. Rescue полный ✅ — USB 2TB WD20EARX отформатирован в один btrfs, смонтирован `/mnt/rescue` -Все `.tar` (GNU tar **`--numeric-owner`**, хардлинки preserved): -- `/mnt/rescue/netbackup/`: `diskstation_1.hbk.tar` **430G** (мёртвая синка = безвозвратное), `windows-host.tar` 160G, `vds-kzntsv.tar` 84G, `ruvds-iis.tar` 62G, `books-vds.tar` 24G, `openwrt.tar` 20K -- `/mnt/rescue/userdata/`: `docker.tar` 130G (rc=1 — файлы менялись при чтении, архив валиден), `homes.tar` 118G, `work.tar` 32G, `downloads.tar` 25G, `documents.tar` 5.9G -- Итого 1.1TB / 726G free. Скрипты и логи: `/mnt/rescue/copy-combined.sh`, `copy*.log`. -- **Урок: GNU tar `--numeric-ids` — НЕ GNU-флаг (это bsdtar), падает rc=64 unrecognized option.** - -### 4. Ежедневные бэкапы DISABLED ⚠️ — ВЕРНУТЬ после ремонта (шаг 8 repair-таски) -- vds-kzntsv: `/etc/cron.d/vds-backup` (05:00, `/opt/stacks/backup/scripts/run.sh`) — строка закомментирована `#DISABLED-kreknin-sick`, бэкап `.bak.20260731` -- books-vds: `/etc/cron.d/books-vds-backup` (06:00, `/opt/stacks/backup/run.sh`) — тоже, бэкап `.bak.20260731` -- Остальные источники (ruvds-iis 22.07, windows-host 08.06, openwrt 12.06) — не ежедневные, не трогал. - -### 5. Задача на ремонт создана: `.tasks/kreknin-repair-md3-rebuild.md` ⚪ -План: power-off (graceful `synopoweroff`) → перетык SATA (sda/sdc **свежие кабели**, sdb питание+data, sdd контакт) → power-on → все диски в `/dev/sd?`, sda 6 Gbps, CRC не растёт → **sdb ожил** → DSM Storage Manager → **Repair md3** → ребилд (мониторить `/proc/mdstat`, НЕ трогать кабели до конца) / **sdb дохлый** → 4TB замена → `btrfs scrub /volume1` → проверить VMM → **вернуть бэкапы** → ручной rsync-прогон green → снять `.bak.20260731`. +### 2. Крекнин-ремонт — НЕ в этой сессии, открыто (⚪, из прошлого хэндоффа). Подробности: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md` +- **Ремонт:** power-off (graceful) → перетык SATA (sda/sdc свежие кабели, sdb питание+data) → power-on → если sdb ожил → DSM Storage Manager Repair md3 → ребилд (мониторить `/proc/mdstat`, не трогать кабели) / sdb дохлый → 4TB замена → `btrfs scrub /volume1` → проверить VMM. +- **Вернуть бэкапы** (шаг 8): vds-kzntsv `/etc/cron.d/vds-backup` 05:00 + books-vds `/etc/cron.d/books-vds-backup` 06:00 — раскомментировать строки `#DISABLED-kreknin-sick`, снять `.bak.20260731`, прогнать ручной rsync green. **Бэкапы выключены с 31.07 — это критичный хвост.** +- Rescue-диск `/mnt/rescue` (1.1TB, полная копия) — НЕ отключать до конца ремонта. ### Спроси user'а -- **Когда power-off для перетыка кабелей?** (координация с Алексеем). План готов, данные спасены — риск cold-start приемлем. -- Rescue-диск `/mnt/rescue` — судьба после ремонта (оставить как доп. копию / отключить)? +- **Когда power-off для перетыка кабелей kreknin?** (координация с Алексеем). План готов, данные спасены. +- Rescue-диск `/mnt/rescue` после ремонта — оставить как доп. копию / отключить? -### Открытые треки (из прошлых сессий) -- `labtools.ru cylindrical` — передан workshop (victor/snolla), ждёт их фикс Linked-item VM. Prod stack 17 не тронут. 🔵 на доске. -- `on-snolla-vds-migration` — помечен ⚪ ready на доске, но on.snolla LIVE с 07-20 → **обновить на closed**. -- MinIO split Track A (books-vds 2020→2025 full migration) — variant-cache bucket создан, остальное TODO. +### Открытые треки +- `labtools.ru cylindrical` → таска `victor/snolla/content-page-linked-products-hydration` (ready). Ждём релиза core. +- `on-snolla-vds-migration` — помечен ⚪ ready на доске, но on.snolla LIVE с 07-20 → **обновить на closed** (не забыть). +- MinIO split Track A (books-vds 2020→2025) — variant-cache bucket создан, остальное TODO. +- Кросс-проектный кэш тасков стейл (последний sync 2026-07-22) — при обзоре «что ещё» освежить. ### Не делать (preemptive guards) -- **Ребутить kreknin пока sda-кабель не зафикшен** — cold-start риск, что sda не поднимется → md3 умрёт. (Данные спасены, но ребилд — стрессовый момент: кабели зафиксировать ДО Repair md3.) -- **НЕ трогать/отключать rescue-диск пока ремонт не закончен** — единственная полная копия. +- **Ребутить kreknin пока sda-кабель не зафикшен** — cold-start риск, что md3 умрёт. Кабели зафиксировать ДО Repair md3. +- **НЕ трогать/отключать rescue-диск пока ремонт не закончен.** - **НЕ забыть вернуть бэкапы** (vds-backup + books-vds-backup раскомментировать). -- НЕ PS для Portainer (кириллица), креды → `pass`. kreknin: `pass kreknin/full-env` (vitya / Pryakhin9), ключ `id_ed25519_kreknin`. +- **НЕ править тему labtools** для cylindrical — parity движка, фикс на стороне snolla. +- НЕ PS для Portainer (кириллица), креды → `pass`. kreknin: `pass kreknin/full-env`, ключ `id_ed25519_kreknin`. ### Коммиты сессии (.admin) -- (этот хэндофф + wiki entity `kreknin-synology` §Диски/Инцидент/Ремонт/Rescue/План + `STATUS.md` board line + `.tasks/kreknin-repair-md3-rebuild.md`) +- (не коммичено: `.tasks/STATUS.md` изменён — связать 🔵 cylindrical с таской snolla. Закоммитить с хэндоффом.) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 72d8523..789f3a1 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,6 +1,6 @@ # Admin Task Board +_Updated: 2026-08-03 — 🔵 **[labtools.ru cylindrical] → таска `victor/snolla/content-page-linked-products-hydration` (ready) + инбокс-письмо.** Корень найден в коде: `contentPages.js getPageViewModel` зовёт `fillViewModel` БЕЗ `fillOpts` → `resolveLinkedItem=()=>null` (index.js:696) → linked-item `item:null` → `product_link.product.item` пуст. Образец: ecommerce.js:107-117 / blogs.js:142 (blog-related-hydration core 0.13.6). Ждём релиз core → передеплой стека 17 (labtools) + смоук. Детали: таска snolla + `.claude-inbox/snolla`._ _Updated: 2026-08-02 — ⚪ **[kreknin-repair-md3-rebuild] заведена.** Xpenology kreknin деградед после продувки компрессором 2026-07-31: sdb выпал (md3 `[_UU]`), кабели sda/sdc срыв. **Rescue полный DONE 2026-08-02** (USB 2TB `/mnt/rescue`, 1.1TB: netbackup/*.tar включая diskstation_1.hbk 430G + userdata 5 шар Алексея), массив за 2 суток чтения — 0 новых ошибок. sdd/VM-том восстановлен (md2, `/volume2` rw). **Ежедневные бэкапы DISABLED** (vds-kzntsv 05:00 + books-vds 06:00, cron закомментированы, `.bak.20260731`). Осталось: power-off → перетык SATA (sda/sdc свежие, sdb питание+data) → Repair md3 (реборн) → вернуть бэкапы. Всё: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`._ -_Updated: 2026-07-31 (3) — 🔵 **labtools.ru /products/press-forms/cylindrical — пустые product-cards → handoff workshop (victor/snolla).** User: «куда картинки делись?». НЕ v3-регрессия (v2 0.42.1 образ `566d41c` throwaway-staging тоже пустые). `cylindrical.liquid` единственный использует Linked-item accessor `product_link.product.item` (.NET-паттерн), остальные 8 шаблонов — прямой `product` (работает). Вывод владельца архитектуры: **snolla неправильно рендерит viewModel типа Linked item** — фикс на стороне victor/snolla. Мой фикс (прямой `product`) откат: `victor/labtools.ru` коммиты `5ae87fd`+`ec9eb1e`(revert), gitea master = оригинал `0dc0b4e`. Prod stack 17 НЕ тронут (healthy). Воспроизведение: `https://labtools.ru/products/press-forms/cylindrical` — cards с пустыми href/src. Файл-якорь: `victor/labtools.ru/apps/web/views/cylindrical.liquid:30-31`. См. NEXT_SESSION.md._ _Updated: 2026-07-31 (2) — 🟢 **variant-cache bucket fix.** maljarka portfolio фото 500 → root cause: v3 minio-split перевёл сайты на vds MinIO 2025, но `variant-cache` bucket не создали там (был только на старом minio.kzntsv.site/books-vds 2020). snolla sharp-pipeline (`variantCache.js` DEFAULT_NAMESPACE=`variant-cache`) → NoSuchBucket → 500 на ALL sharp gallery-images ВСЕХ 6 v3 сайтов с 2026-07-30 (тихо — v3-gate проверял theme CSS из `themes` bucket (themeFiles, без sharp), не gallery-image URLs). Fix: `mc mb vds/variant-cache` (пустой, кэш регенерируем). После: maljarka portfolio 34/34 → 200 image/webp, full-size 920x600 200, tandemmebel logs NoSuchBucket ушли. **minio-split Track A gap** — при endpoint-flip проверять ВСЕ runtime-buckets (`galleries`/`themes`/`assets`/`variant-cache`), и gate должен хитить gallery-image URL. Memory `variant-cache-bucket-missing-on-vds-2025`._ _Updated: 2026-07-31 — 🟢 **[maljarka-vds-restore] CLOSED.** `maljarka.tandemmebel.ru` восстановлен как 7-й сайт тиража snolla на VDS. Сайт был потерян 2026-07-21 при декоммишне RUVDS IIS (единственный публичный хост maljarka; в v3 тираж не входила, осталась на RUVDS). DNS перебросили на VDS, но `Host()`-правила + snolla-app с siteId `A2476738` не было → traefik 404. Аудит 21.07 «VDS=200» = false-positive с локального IIS воркстейшна. **Контент цел** в shared `MoreThenCms` DB (5 Pages, 4 StaticPages, тема Reversal `4881FC7F` уже в MinIO themes bucket). Восстановление = клон `victor/on.snolla.com` → `victor/maljarka.tandemmebel.ru` (snolla 0.43.2/aws-sdk v3), swap siteId `A2476738`+siteUrl, `layout.liquid` **byte-identical** рендеру локального .NET-admin (43730B, sha256 match, `{{ item.content }}` inline — content пуст), error-страницы Reversal-бренд. Build на VDS (`7f03d67`, digest df4e3642, regen yarn.lock под переименованный workspace), throwaway-staging :5081 gate GREEN (byte-parity `/`, 4 staticpages 200 sizes==DB, theme asset 200 103320B, unpublished 404 parity), Portainer стек **Id 23** (node create-stack, НЕ PS — кириллица), env 8/8 shared, mem_limit 512m, `Host(maljarka.tandemmebel.ru)`. DNS уже VDS → LE issued on first hit (CN=maljarka.tandemmebel.ru, YR1, до 2026-10-29). Live smoke GREEN: `/` 200 43730B byte-identical, title «Малярка от Тандеммебель», 4 staticpages 200, theme asset 200, robots/sitemap 200. **Тираж 7/7**: labtools(17)/emspb(18)/labtools-pro(19)/tandemmebel(20)/kupimknigi(21)/on-snolla(22)/maljarka(23). Runbook: `maljarka-vds-deploy-runbook`. Rollback = образ-тег в registry (RUVDS DECOMM, не DNS)._ _Updated: 2026-07-20 (2) — 🟢 **[snolla-local-admin-restore] CLOSED.** Локальный .NET-админ поднят: selective tar-copy `C:\sites\snolla\` ~100MB с RUVDS (исключил stale App_Data 8.76GB — assets/galleries/themes теперь в MinIO), Web.config уже → `mssql.kzntsv.site,1433` Catalog=MoreThenCms (user `snolla`) + MinIO S3 drop-in (ключи реальные, placeholder_count=0). Elevated setup `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1` (ASCII-only, PS5.1 BOM-less-safe): AppPool `snolla` (.NET v4.0, AppPoolIdentity, recycle@200MB), IIS site `*:80` catch-all, ACL `IIS AppPool\snolla:(OI)(CI)(M)`, hosts-override `127.0.0.1 <6 aliases>.snolla.com`, FW block inbound 80. Smoke GREEN: `tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com/admin/account/login` → 200, реальная MoreThenCms-логинформа (`