diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 16dde5a..f98cb70 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,151 +1,58 @@ --- -_last_updated_: 2026-07-31T10:00:00Z -session_id: 2026-07-31-maljarka-restore-variantcache-labtools -prev_session_id: 2026-07-30-tandemmebel-v3-cutover +_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 --- # 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: «проебали сайт 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`. +User: «срочная разовая задача — Алексей продул синологию компрессором, проблемы с дисками». **Xpenology** (обычный ПК-корпус, DSM 7.1.1), пром-компрессор снёс SATA-кабели. -### 2. variant-cache bucket fix ✅ — shared v3-регрессия (остров sharp-images на 6 сайтах) -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`. +### 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** | восстановлен | -### 3. labtools.ru/products/press-forms/cylindrical — пустые product-cards. РАССЛЕДОВАНИЕ → workshop (victor/snolla) -User: «куда картинки делись?» на cylindrical. Найдено: -- **НЕ v3-регрессия** — v2 (0.42.1, образ `566d41c`) тоже отдаёт пустые карты (throwaway-staging проверил). -- **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` (работает). -- Эмпирически: прямой `product` даёт `title` («Пресс-форма»), но `path`/`list_image` пустые; `product_link.product.item` даёт всё пусто. Из кода `catalogCategory.products` → `catalogProductList` → `getProductViewModel` напрямую возвращает product-VM с `path`/`title`/content-полями (`list_image` — content-field из `fillViewModel`). -- **Вывод 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. -- **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`. +md3 = `/volume1` (btrfs, все бэкапы), degraded `[_UU]`, держится на sda+sdc. **Массив за 2 суток чтения — 0 новых ошибок.** + +### 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-ручнины.** + +### 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`. ### Спроси 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) -- **decomm-audit smoke = targeted host/VDS**, не воркстейшн с локальным catch-all (false-positive «VDS=200»). -- **yarn.lock workspace-rename** — переименование root/app package требует regen yarn.lock. -- **variant-cache bucket** — при minio endpoint-flip проверять ВСЕ runtime-buckets (`galleries`/`themes`/`assets`/`variant-cache`); gate должен хитить gallery-image URL (sharp), не только theme CSS. -- НЕ PS для Portainer (кириллица), НЕ push в docker.stostayer.ru:443, НЕ git clone на VDS (archive+scp). Креды → pass. +- **Ребутить kreknin пока sda-кабель не зафикшен** — cold-start риск, что sda не поднимется → md3 умрёт. (Данные спасены, но ребилд — стрессовый момент: кабели зафиксировать ДО Repair md3.) +- **НЕ трогать/отключать rescue-диск пока ремонт не закончен** — единственная полная копия. +- **НЕ забыть вернуть бэкапы** (vds-backup + books-vds-backup раскомментировать). +- НЕ PS для Portainer (кириллица), креды → `pass`. kreknin: `pass kreknin/full-env` (vitya / Pryakhin9), ключ `id_ed25519_kreknin`. ### Коммиты сессии (.admin) -- `494b1010` feat(maljarka): restore as 7th snolla site (stack 23) — compose+runbook+STATUS+index -- `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 после `` (content пуст = parity). error_404/500 → Reversal+maljarka-бренд. 4 StaticPages отдаются из DB verbatim. -- **Build на VDS:** `git archive 7f03d67` → scp → `docker build --build-arg VERDACCIO_TOKEN=` → `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/-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.) \ No newline at end of file +- (этот хэндофф + wiki entity `kreknin-synology` §Диски/Инцидент/Ремонт/Rescue/План + `STATUS.md` board line + `.tasks/kreknin-repair-md3-rebuild.md`) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index b127a68..72d8523 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,5 @@ # 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 (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)._ diff --git a/.tasks/kreknin-repair-md3-rebuild.md b/.tasks/kreknin-repair-md3-rebuild.md new file mode 100644 index 0000000..e13e970 --- /dev/null +++ b/.tasks/kreknin-repair-md3-rebuild.md @@ -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», «План ремонта». diff --git a/.wiki/entities/kreknin-synology.md b/.wiki/entities/kreknin-synology.md index 4c32406..4723353 100644 --- a/.wiki/entities/kreknin-synology.md +++ b/.wiki/entities/kreknin-synology.md @@ -57,3 +57,48 @@ updated: 2026-05-19 ## 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 — пока не реализован. + +## Диски (инвентарь, после инцидента 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 виртуалки