meta(handoff): kreknin rescue session — sdd/VM-volume restore + full rescue to USB + backups paused (→ repair)

- kreknin Xpenology degraded after compressor dusting (sdb cable lost, md3 degraded, sda/sdc flaky cables)
- sdd/VM-volume (md2, /volume2) restored: DSM Repair + "Convert to read/write", scrub 0 errors
- full rescue 2026-08-02 → USB 2TB btrfs /mnt/rescue (netbackup/*.tar incl. diskstation_1.hbk 430G + 5 user shares)
- daily backups DISABLED (vds-kzntsv 05:00 + books-vds 06:00) — re-enable after repair
- wiki entity kreknin-synology: disk inventory, incident, repair, rescue, plan
- task kreknin-repair-md3-rebuild created (power-off → reseat cables → Repair md3 → re-enable backups)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-03 12:40:51 +03:00
parent 0346d5243b
commit 1a901b1396
4 changed files with 160 additions and 137 deletions

View File

@@ -1,151 +1,58 @@
--- ---
_last_updated_: 2026-07-31T10:00:00Z _last_updated_: 2026-08-02T10:00:00Z
session_id: 2026-07-31-maljarka-restore-variantcache-labtools session_id: 2026-08-02-kreknin-rescue-sdd-restore
prev_session_id: 2026-07-30-tandemmebel-v3-cutover prev_session_id: 2026-07-31-maljarka-restore-variantcache-labtools
--- ---
# Next session handoff # Next session handoff
## Эта сессия — maljarka restore + variant-cache fix + labtools cylindrical (расследование). ЗАВЕРШЕНА ## Эта сессия — kreknin rescue + sdd/VM-volume restore. ДЕЛА ЗАВЕРШЕНЫ (кроме физики). См. `.tasks/kreknin-repair-md3-rebuild.md`
### 1. maljarka.tandemmebel.ru восстановлен ✅ — 7-й сайт тиража (стек 23) LIVE GREEN User: «срочная разовая задача — Алексей продул синологию компрессором, проблемы с дисками». **Xpenology** (обычный ПК-корпус, DSM 7.1.1), пром-компрессор снёс SATA-кабели.
User: «проебали сайт maljarka.tandemmebel.ru». Root cause: .NET MoreThenCms tenant, **не входил в v3 тираж**, остался на RUVDS IIS → потерян при **decomm RUVDS 2026-07-21** (DNS перебросили на VDS, но Host-правила+snolla-app с siteId `A2476738` не было → traefik 404; аудит 21.07 «VDS=200» = false-positive с локального IIS воркстейшна). Восстановлен как Node snolla-app 0.43.2 (клон on.snolla.com → `victor/maljarka.tandemmebel.ru` `7f03d67`, layout.liquid byte-identical рендеру .NET-admin 43730B sha256-match, Reversal тема уже в MinIO, regen yarn.lock под переименованный workspace). Portainer стек **Id 23**, env 8/8 shared, mem_limit 512m, LE issued (CN=maljarka.tandemmebel.ru, до Oct 29). Live smoke GREEN. **Тираж 7/7.** Runbook `.wiki/concepts/maljarka-vds-deploy-runbook.md`. Memory `maljarka-lost-on-ruvds-decomm-restored`.
### 2. variant-cache bucket fix ✅ — shared v3-регрессия (остров sharp-images на 6 сайтах) ### 1. Диагноз (диск-раскладка, Xpenology = НЕ настоящий Synology, обычные SATA-кабели)
maljarka `#portfolio` фото 500 → root cause: v3 minio-split перевёл сайты на vds MinIO 2025, но **`variant-cache` bucket не создали там** (был на books-vds 2020). snolla sharp-pipeline (`variantCache.js` DEFAULT_NAMESPACE=`variant-cache`, `storage.js: bucket=storageClient`) → NoSuchBucket → 500 на ALL sharp gallery-images **всех 6 v3 сайтов с 2026-07-30** (gate проверял theme CSS из `themes` bucket (themeFiles, без sharp), не gallery-image URLs — пропустил). Fix: `mc mb vds/variant-cache` (пустой, кэш регенерируем — миграция старых entries НЕ нужна). maljarka portfolio 34/34 → 200 image/webp, tandemmebel logs NoSuchBucket ушли. **minio-split Track A gap.** Memory `variant-cache-bucket-missing-on-vds-2025`. Runbook `maljarka-vds-deploy-runbook` §Гочи + `minio-split-cutover-runbook`. | Диск | Порт | Модель | Роль | Статус |
|---|---|---|---|---|
| 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** | восстановлен |
### 3. labtools.ru/products/press-forms/cylindrical — пустые product-cards. РАССЛЕДОВАНИЕ → workshop (victor/snolla) md3 = `/volume1` (btrfs, все бэкапы), degraded `[_UU]`, держится на sda+sdc. **Массив за 2 суток чтения — 0 новых ошибок.**
User: «куда картинки делись?» на cylindrical. Найдено:
- **НЕ v3-регрессия** — v2 (0.42.1, образ `566d41c`) тоже отдаёт пустые карты (throwaway-staging проверил). ### 2. sdd / VM-том восстановлен ✅ (сделано 2026-07-31)
- **Pre-existing template + snolla-VM баг**: `cylindrical.liquid` — единственный шаблон использует accessor `{% assign product = product_link.product.item %}` (Linked-item viewModel, .NET-паттерн). Остальные 8 шаблонов (accessories/presses/milling_bowl/pet_film/…) используют прямой `{% for product in product_list %}``product.path` (работает). 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`).
- Эмпирически: прямой `product` даёт `title` («Пресс-форма»), но `path`/`list_image` пустые; `product_link.product.item` даёт всё пусто. Из кода `catalogCategory.products``catalogProductList``getProductViewModel` напрямую возвращает product-VM с `path`/`title`/content-полями (`list_image` — content-field из `fillViewModel`). **Урок: «Convert to read/write» в DSM снимает ro после transient EIO — без mdadm-ручнины.**
- **Вывод user'а (владельца архитектуры): snolla неправильно рендерит viewModel типа Linked item.** Фикс на стороне workshop (victor/snolla) — не infra.
- **Мой фикс (прямой `product`) откат** — коммиты `5ae87fd` (фикс) + `ec9eb1e` (revert) в `victor/labtools.ru` master, gitea чист (оригинал `0dc0b4e`). Prod stack 17 НЕ тронут (0dc0b4e, healthy). Staging-контейнер + образ 5ae87fd вычищены, `latest` retag на 0dc0b4e. ### 3. Rescue полный ✅ — USB 2TB WD20EARX отформатирован в один btrfs, смонтирован `/mnt/rescue`
- **Handoff workshop:** snolla Node не резолвит Linked-item accessor `product_link.product.item` (работал в .NET). Воспроизведение: `https://labtools.ru/products/press-forms/cylindrical` — product-cards с пустыми href/src (v2 тоже). Каталог=Catalog (не Store). `.NET-шаблон был правильный` (по владельцу) — snolla должен поддержать Linked-item VM. Файл-якорь: `victor/labtools.ru/apps/web/views/cylindrical.liquid:30-31`. Все `.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`.
### Спроси user'а ### Спроси user'а
- maljarka восстановлена, variant-cache починен, labtools-cylindrical передан workshop (victor/snolla). Что дальше? Открытые треки: MinIO split Track A (books-vds 2020→2025 full migration — variant-cache bucket создан, остальное TODO). `on-snolla-vds-migration` task в .tasks помечен ⚪ ready, но on.snolla LIVE с 07-20 — обновить на closed. - **Когда power-off для перетыка кабелей?** (координация с Алексеем). План готов, данные спасены — риск cold-start приемлем.
- 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.
### Не делать (preemptive guards) ### Не делать (preemptive guards)
- **decomm-audit smoke = targeted host/VDS**, не воркстейшн с локальным catch-all (false-positive «VDS=200»). - **Ребутить kreknin пока sda-кабель не зафикшен** — cold-start риск, что sda не поднимется → md3 умрёт. (Данные спасены, но ребилд — стрессовый момент: кабели зафиксировать ДО Repair md3.)
- **yarn.lock workspace-rename** — переименование root/app package требует regen yarn.lock. - **НЕ трогать/отключать rescue-диск пока ремонт не закончен** — единственная полная копия.
- **variant-cache bucket** — при minio endpoint-flip проверять ВСЕ runtime-buckets (`galleries`/`themes`/`assets`/`variant-cache`); gate должен хитить gallery-image URL (sharp), не только theme CSS. - **НЕ забыть вернуть бэкапы** (vds-backup + books-vds-backup раскомментировать).
- НЕ PS для Portainer (кириллица), НЕ push в docker.stostayer.ru:443, НЕ git clone на VDS (archive+scp). Креды → pass. - НЕ PS для Portainer (кириллица), креды → `pass`. kreknin: `pass kreknin/full-env` (vitya / Pryakhin9), ключ `id_ed25519_kreknin`.
### Коммиты сессии (.admin) ### Коммиты сессии (.admin)
- `494b1010` feat(maljarka): restore as 7th snolla site (stack 23) — compose+runbook+STATUS+index - (этот хэндофф + wiki entity `kreknin-synology` §Диски/Инцидент/Ремонт/Rescue/План + `STATUS.md` board line + `.tasks/kreknin-repair-md3-rebuild.md`)
- `22f9748b` meta(handoff): maljarka restore session
- `d82361d1` fix(minio-split): create variant-cache bucket on vds 2025
- (этот хэндофф)
### Коммиты victor/labtools.ru (расследование, оба откат)
- `5ae87fd` fix(cylindrical) — откат `ec9eb1e` (gitea master = оригинал 0dc0b4e)
### Memory updates сессии
- `maljarka-lost-on-ruvds-decomm-restored`
- `variant-cache-bucket-missing-on-vds-2025`
---
## (prev) maljarka restore — см. выше (этот же файл, секция выше)
## Эта сессия — восстановление maljarka.tandemmebel.ru (7-й сайт тиража). ЗАВЕРШЁН ✅ — LIVE GREEN
User: «Мы где-то в тираже или раньше проебали сайт https://maljarka.tandemmebel.ru/. Давай найдем и попробуем восстановить». Полный тираж (по on-snolla Task B паттерну).
### Root cause (найден)
`maljarka.tandemmebel.ru`**.NET MoreThenCms tenant** (тема Reversal `4881FC7F`, siteId `A2476738-E26C-49D5-95AD-958F42DCCDD0`), служила на **RUVDS IIS catch-all**. В v3 тираж (6 Node сайтов) **не входила** — осталась на RUVDS. **RUVDS декоммишнен 2026-07-21** → maljarka потеряла единственный хост; DNS перебросили на VDS, но `Host()`-правила+snolla-app с тем siteId не было → traefik 404. Аудит 21.07 «VDS=200» = **false-positive** с локального IIS воркстейшна (LAN-DNS, local .NET-admin catch-all поднят 20.07). **Тираж v3 (30.07) не виноват** — сайт потерян 21.07 на decomm RUVDS.
### Что сделано (всё GREEN)
- **Репо:** `victor/maljarka.tandemmebel.ru` создан на gitea, клон `victor/on.snolla.com` (lean-база, snolla 0.43.2/aws-sdk v3). Swap `production.json` (siteId A2476738, siteUrl, appName) + package names + **regen yarn.lock** под переименованный workspace (`yarn install --immutable` падал на старом `on.snolla.com@workspace:.` дескрипторе). Pushed, SHA `7f03d67`.
- **Тема Reversal** `4881FC7F`**уже была в MinIO** `themes` bucket (78 файлов), заливать не понадобилось (ключевой риск снят).
- **Реконструкция:** `views/layout.liquid` = **byte-identical** рендеру локального .NET-admin (43730B, `curl --noproxy '*' --resolve :80:127.0.0.1`, sha256 `64011be6…`), `{{ item.content }}` inline после `</section>` (content пуст = parity). error_404/500 → Reversal+maljarka-бренд. 4 StaticPages отдаются из DB verbatim.
- **Build на VDS:** `git archive 7f03d67` → scp → `docker build --build-arg VERDACCIO_TOKEN=<vitya JWT>``registry.kzntsv.site/maljarka:7f03d67`(+latest), digest `df4e3642…`. Push OK.
- **Throwaway-staging :5081** (8 shared секретов из live tandemmebel, network proxy) → completeness-gate GREEN: `/` byte-identical oracle, 4 staticpages 200 (sizes==DB clen), theme asset 200 103320B, unpublished /about/services/contacts/intro → 404 parity, sitemap-pages-1 1 loc `/` (+пустой blog-index benign).
- **Portainer стек 23** создан node-скриптом (JWT, НЕ PS — кириллица compose), env 8/8, 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. Лог чист.
- **Коммит .admin** `494b1010`: compose + `maljarka-vds-deploy-runbook.md` + index + STATUS + pushed. Memory `maljarka-lost-on-ruvds-decomm-restored`.
### Тираж snolla теперь 7/7
| Сайт | Стек | Image | Snolla |
|---|---|---|---|
| on.snolla.com | 22 | eb8c143 | 0.43.2 |
| kupimknigi.spb.ru | 21 | 5364353 | 0.43.2 |
| labtools.ru | 17 | 0dc0b4e | 0.43.2 |
| labtools.pro | 19 | a106622 | 0.43.2 |
| emspb.ru | 18 | 5afd8a1 | 0.43.2 |
| tandemmebel.ru | 20 | 9d51c09 | 0.43.2 |
| **maljarka.tandemmebel.ru** | **23** | **7f03d67** | **0.43.2** |
### Спроси user'а
- maljarka восстановлена и LIVE. Что дальше? Открытые треки: MinIO split Track A (books-vds 2020→2025, transparent). Или stostayer v3 (HOLD, ждёт GO user). Или закрыть `on-snolla-vds-migration` task (статус ⚕ ready в .tasks, но фактически on.snolla LIVE с 07-20 — обновить на closed).
### Не делать (preemptive guards)
- **decomm-audit smoke = targeted host/VDS**, не воркстейшн с локальным catch-all (false-positive «VDS=200»).
- **yarn.lock workspace-rename** — переименование root/app package требует regen yarn.lock (`yarn install` локально), иначе `--immutable` падает.
- НЕ PS для Portainer (кириллица), НЕ push в docker.stostayer.ru:443, НЕ git clone на VDS (archive+scp).
- Креды → pass (mssql-vds/sa-password, vds-kzntsv/full-env PORTAINER, gitea/admin-token).
---
## (prev) tandemmebel.ru v3 cutover. ЗАВЕРШЁН ✅ — ТИРАЖ v3 БЫЛ 6/6 GREEN (теперь 7/7 с maljarka)
6-й сайт тиража v3 (после on-snolla, kupimknigi, labtools.ru, labtools.pro, emspb).
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 `9d51c09`) + `resolutions`-блок в root `package.json` (verbatim labtools.ru: `@aws-sdk/client-s3 3.1005.0` + `@smithy` chain 5.3.11 — optional determinism) + реген `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).
- **Staging :5020 parity-gate GREEN:** throwaway контейнер из env живого стека 20 (8 секретов, `--network proxy`). robots md5 `a01e4c60…` identical (87B); sitemap index→5 sub-sitemaps → **184 locs == live 184 IDENTICAL** (0 prod-only / 0 new-only); **self-consistency 183×200 + 1×404** (`/articles` — prod=404 parity benign, не регрессия); `/` +557B = og:url/og:image request-host context (benign, byte-identical post-cutover); theme `Gotham-Pro.css` 200 4436B (v3 aws-sdk v3 S3-direct read из vds MinIO 2025).
- **Скрипт-баг поймал и исправил:** `$"\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.
- **Live smoke GREEN:** `/` 200 45742B, `/projects` 200 90758B, `/sitemap.xml` 200 (184 locs == parity), robots md5 `a01e4c60…`, `/articles` 404 parity, theme `Gotham-Pro.css` 200 4436B (v3 S3-direct). TLS CN=tandemmebel.ru, expire Oct 10 2026 (не тронут — in-place swap). Лог чист. **Rollback = `8df10ee`** (v2 0.42.1, жив в registry).
- Compose (admin source-of-truth) синхронно закоммичен `8df10ee``9d51c09`. tandemmebel-vds-deploy-runbook §0.43.2 + minio-split-cutover-runbook progress-table обновлены (6/6 GREEN).
## v3 тираж — ФИНАЛЬНЫЙ статус (6/6 GREEN)
| Сайт | Стек | Image | Commit | Snolla |
|---|---|---|---|---|
| on.snolla.com | 22 | `eb8c143` | eb8c143 | 0.43.2 |
| kupimknigi.spb.ru | 21 | `5364353` | 5364353 | 0.42.0→0.43.2 |
| labtools.ru | 17 | `0dc0b4e` | 0dc0b4e | 0.43.2 |
| labtools.pro | 19 | `a106622` | a106622 | 0.43.2 |
| emspb.ru | 18 | `5afd8a1` | 5afd8a1 | 0.43.2 |
| **tandemmebel.ru** | 20 | `9d51c09` | 9d51c09 | 0.43.2 |
Все 6 на vds MinIO 2025 (aws-sdk v3 S3-direct), все parity-gate GREEN, все TLS не тронуты.
Rollback-теги v2 (0.42.1) живы в registry для каждого.
## Recent commits (этот репо, .admin)
- `69d3d0dd` feat(tandemmebel): v3 cutover LIVE — snolla 0.42.1→0.43.2 (aws-sdk v2→v3)
- `fd48df62` feat(emspb): v3 cutover LIVE — snolla 0.42.1→0.43.2 (aws-sdk v2→v3)
- `c3c79b99` feat(labtools.pro): v3 cutover LIVE
## Open треки
| Трек | Готовность | Entry-point |
|---|---|---|
| **B3 v3 тираж** | ✅ **ЗАВЕРШЁН 6/6 GREEN** | все 6 runbook'ов §0.43.2 |
| MinIO split Track A (books-vds minio 2020→2025) | ⏳ TODO — transparent, отдельно | runbook §Track A |
| MinIO split B4 .NET catch-all админ s3 endpoint | ✅ DONE 2026-07-30 — `Web.config` 6/6 endpoint flipped, creds verified, IIS recycled, login 200. Превью confirmed user'ом: оказался pre-existing баг S3-провайдера (KeyNotFoundException на ownerId в GalleriesStorage ctor) — фикс 09cb072d в MoreThenCms (drop-in DLL), 21/21 tests, live-verified | runbook §B4 |
| MinIO split B5 Obsidian Remotely Save endpoint | ✅ DONE 2026-07-30 — endpoint flipped в vault (verified) | runbook §B5; memory `obsidian-remotely-save-endpoint-after-mirror` |
| books-task-runner-registry-auth-cred | 🔵 blocked — cred в config-volume, рабочий образ содержит СТАРЫЙ registryGc; тега master-a3734d5 в реестре нет | `.tasks/STATUS.md` §books-task-runner |
## Спроси user'а
- **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-необходимость.
- **НЕ пушить образы в `docker.stostayer.ru:443`** (VPN-бан). Registry = `registry.kzntsv.site` (vds), build на 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-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» устарела.
- (handoff §v3 тираж — не memory.)

View File

@@ -1,4 +1,5 @@
# Admin Task Board # Admin Task Board
_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 (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 (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-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)._

View File

@@ -0,0 +1,70 @@
# kreknin-repair-md3-rebuild
## Goal
Восстановить [[kreknin-synology]] md3 raid5 (data `/volume1`) до полной избыточности после продувки компрессором 2026-07-31. sdb (WD-WX32D12L8HTE) не определяется → переподключить/заменить → ребилд md3. Заодно починить кабели sda (1.5 Gbps / 213 CRC) и sdc, и **вернуть ежедневные бэкапы** (сейчас DISABLED).
## Context
- **Инцидент 2026-07-31:** Алексей продул NAS пром-компрессором → срыв SATA-кабелей. sdb выпал (md3 `[_UU]` degraded), sdd (VMM SSD) выкинут DSM из md2 (восстановлен в тот же день: Repair пула + «Преобразовать в чтение/запись» → `/volume2` rw, scrub 53GiB 0 ошибок), sda кабель (213 CRC, линк 6→1.5 Gbps), sdc bursts при трясе кабелей (без тряса стабилен).
- **Rescue 2026-07-31→08-02:** полный слив в `/mnt/rescue` (USB 2TB btrfs): `netbackup/*.tar` (diskstation_1.hbk 430G, windows-host 160G, vds-kzntsv 84G, ruvds-iis 62G, books-vds 24G, openwrt 20K) + `userdata/*.tar` (docker 130G, homes 118G, work 32G, downloads 25G, documents 5.9G). Итого 1.1TB / 726G free. Данные в безопасности → **риск power-off приемлем**.
- **Бэкапы ЗАГЛУШЕНЫ** (не нагружать больной массив): vds-kzntsv `/etc/cron.d/vds-backup` (05:00), books-vds `/etc/cron.d/books-vds-backup` (06:00) — строки закомментированы (`#DISABLED-kreknin-sick`), бэкап-файлы `.bak.20260731` сохранены.
## Open questions
- [ ] Координация power-off с Алексеем (физическая работа на месте).
- [ ] Свежие SATA-кабели наготове?
- [ ] sdb реально мёртв или просто отвал кабеля? (решится после перетыка)
- [ ] 4TB замена, если sdb дохлый.
## Steps
1. **Подготовка (до power-off)**
- [ ] Rescue полный и `.tar` на месте (проверено: 11 файлов, 1.1TB, все rc=0 кроме docker rc=1 = норма для живых данных)
- [ ] Бэкапы DISABLED (проверено: оба cron закомментированы)
2. **Power-off** — плановый, с Алексеем. Graceful shutdown DSM (`synopoweroff` / DSM Shutdown), не грубое выдёргивание.
3. **Переподключение кабелей** (Алексей физически)
- [ ] sda (ata1): свежий SATA data + питание
- [ ] sdc (ata3): свежий SATA data + питание
- [ ] sdb: питание + SATA
- [ ] sdd (ata4): проверить контакт (уже восстановлен, перетык не помешает)
4. **Power-on + верификация**
- [ ] все в `/dev/sd?`: sda sdc sdd (и sdb если ожил)
- [ ] SMART каждого: CRC/pending/reallocated
- [ ] sda линк 6.0 Gbps (не 1.5), CRC не растёт
- [ ] `mdstat`: md0/1/2 healthy, md3 всё ещё `[_UU]` (sdb ещё не в массиве — норм)
- [ ] `/volume1` rw, `/volume2` rw
5. **sdb recovery**
- [ ] sdb определился + SMART ок → DSM Storage Manager → **Repair md3** (выбрать sdb) → ребилд
- [ ] sdb не определился/дохлый → 4TB замена → Repair md3
6. **Мониторинг ребилда**
- [ ] `/proc/mdstat` resync %, скорость, ETA
- [ ] sda/sdc НЕ дают новых ошибок во время ребилда (кабель-фикс должен удержать)
- [ ] не выключать и не трогать кабели до завершения
7. **Пост-ремонт**
- [ ] md3 `[UUU]` clean
- [ ] `btrfs scrub /volume1` (верификация целостности после долгого degraded-периода)
- [ ] VMM виртуалки (sdd) работают, `/volume2` rw
8. **Вернуть бэкапы**
- [ ] vds-kzntsv: раскомментировать `/etc/cron.d/vds-backup`
- [ ] books-vds: раскомментировать `/etc/cron.d/books-vds-backup`
- [ ] ручной прогон каждого rsync → green (email/ntfy)
- [ ] снять `.bak.20260731` после успешного прогона
9. **Hygiene**
- [ ] Rescue-диск `/mnt/rescue`: решить судьбу (оставить/отключить, содержимое = доп. копия)
- [ ] обновить вики/память статусом после ремонта
## Verification
- `cat /proc/mdstat` → md3 `[UUU]` active clean, resync не бежит
- `smartctl -d ata -A /dev/sda` → CRC `199` стабилен (не растёт), линк 6.0 Gbps
- `btrfs scrub /volume1` → 0 errors
- `/volume1/NetBackup/vds-kzntsv/latest` свежий (новый rsync-проход)
- backup cron активен (оба раскомментированы), один реальный прогон green
## Notes
- **Порядок критичен:** кабели зафиксировать и проверить ДО запуска ребилда md3 (rebuild — самый стрессовый момент для массива).
- Урок сессии: GNU tar на DSM = `--numeric-owner`, НЕ `--numeric-ids` (это bsdtar).
- Урок сессии: DSM «Преобразовать в чтение/запись» снимает ro-состояние btrfs после transient EIO (sdd case) — без mdadm-ручнины.
- Rescue-содержимое и диск-раскладка: `.wiki/entities/kreknin-synology.md` § «Диски», «Rescue», «План ремонта».

View File

@@ -57,3 +57,48 @@ updated: 2026-05-19
## Roadmap как backup target для VDS ## Roadmap как backup target для VDS
Планируется ежедневный pull rsync VDS → kreknin в `/volume1/NetBackup/vds-kzntsv/` (см. follow-up task `.tasks/vds-backup-rsync-kreknin.md`). Дополнительный pipe — backup pipe для production-CMS [`windows-recovery-host`](windows-recovery-host.md) → тут же на kreknin — пока не реализован. Планируется ежедневный pull rsync VDS → kreknin в `/volume1/NetBackup/vds-kzntsv/` (см. follow-up task `.tasks/vds-backup-rsync-kreknin.md`). Дополнительный pipe — backup pipe для production-CMS [`windows-recovery-host`](windows-recovery-host.md) → тут же на kreknin — пока не реализован.
## Диски (инвентарь, после инцидента 2026-07-31)
**Xpenology** (DSM 7.1.1, apollolake) на **обычном ПК-корпусе**НЕ настоящий Synology, без hot-swap лотков, диски на обычных SATA-кабелях. **Урок: компрессорная продувка срывает SATA-кабели.**
| Диск | Порт | Модель | Роль | Статус 2026-07-31 |
|---|---|---|---|---|
| sda | ata1 | WD40EFPX-68C6CN0 4TB (6682ч) | md3 raid5 slot 3 | жив; **213 UDMA CRC, линк упал до 1.5 Gbps** = кабель |
| sdb | — | WD-WX32D12L8HTE (4TB) | md3 raid5 slot 0 | **не определяется** — отвал кабеля (питание/дата) после продувки, вероятно оживает перетыком |
| sdc | ata3 | WD40EFAX-68JH4N1 4TB **SMR** (30373ч) | md3 raid5 slot 1 | жив; WRITE FPDMA bursts 09:58/12:09 — только при ручном трясе кабелей |
| sdd | ata4 | Kingston SA400S37120G SSD (30460ч) | **md2 raid1** = VMM volume `/volume2` | восстановлен 2026-07-31 |
md3 = `/volume1` (btrfs, бэкапы), degraded `[_UU]` (sdb выпал), держится на sda+sdc.
## Инцидент 2026-07-31 (продувка компрессором)
Алексей продул NAS пром-компрессором → срыв SATA-кабелей:
- **sdb исчез** (не определяется), md3 degraded
- **sdd** DSM выкинул из md2 при загрузочной тряске (07:47) → /volume2 ушёл в **ro** (transient EIO)
- **sda**: 213 CRC, линк 6→1.5 Gbps; **sdc**: bursts при трясе, без тряса стабилен
## Ремонт (сделано 2026-07-31)
- **sdd/md2**: DSM Storage Manager → Repair пула → sdd вернулся (но `faulty active sync`), затем в DSM на `/volume2` кнопка **«Преобразовать в чтение/запись»** → rw, scrub 53GiB 0 ошибок. **Урок: «Convert to read/write» в DSM снимает ro-состояние после transient EIO без mdadm-ручнины.**
- **Ежедневные бэкапы на kreknin ЗАГЛУШЕНЫ** (не нагружать больной массив):
- vds-kzntsv: `/etc/cron.d/vds-backup` (05:00) — закомментирован, бэкап `.bak.20260731`
- books-vds: `/etc/cron.d/books-vds-backup` (06:00) — закомментирован, бэкап `.bak.20260731`
- ⚠️ **ВЕРНУТЬ после починки** (раскомментировать строку)
## Rescue 2026-07-31 → 08-02 (полный)
USB **2TB WD20EARX** (sdq) отформатирован в один btrfs, смонтирован `/mnt/rescue`. GNU tar `--numeric-owner` (хардлинки preserved; `--numeric-ids`НЕ GNU-флаг, это bsdtar).
- `/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 свободно. Массив за 2 суток последовательного чтения — **ноль новых ошибок**.
## План ремонта (осталось)
1. **Power-off** (после подготовки, НЕ до слива — данные теперь спасены, риск холодного старта приемлем)
2. Переподключить SATA: **sda, sdc** (свежие кабели), **sdb** (питание+дата)
3. sdb определился + SMART ок → DSM Storage Manager → **Repair md3** → ребилд; не определился → 4TB замена
4. sda должен вернуться на 6 Gbps, CRC не расти
5. **Вернуть бэкапы**: раскомментировать `vds-backup` + `books-vds-backup`
6. (необязательно) sdd в md2 уже восстановлен — проверить VMM виртуалки