meta(kreknin): backups re-enabled + verified after power-cut; rebuild restarted

- cron restored vds-kzntsv 05:00 + books-vds 06:00; manual runs VERIFIED on kreknin (vds-kzntsv 66G / books-vds 15G, latest->08-10, 7 snaps each)
- books-vds was stale since 08-05 (rsync fails, no alternate trigger); stale ES snapshot daily-2026-08-10 removed
- md3 rebuild restarted from 0 after power-cut (progress not checkpointed); md0/md1 all 4 disks green
- add kreknin_rebuild_mon.sh array monitor (md0/md1/md3 + CRC)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-10 20:13:21 +03:00
parent 53c2dcced8
commit b01b23f811
3 changed files with 39 additions and 2 deletions

View File

@@ -1,4 +1,5 @@
# Admin Task Board # Admin Task Board
_Updated: 2026-08-10 — 🟡 **[kreknin-repair-md3-rebuild] ребилд идёт, бэкапы ВОЗВРАЩЕНЫ.** Утро: vitya на месте, кабели перетыкнуты (sdb WD-WX32D12L8HTE вернулся, SMART PASSED, все 3 HDD на 6 Gbps), md3 rebuild старт 07:57 (`mdadm --add /dev/md3 /dev/sdb3`), md0/md1 починены (системные разделы добавлены во все 4 диска — «зелёные» в DSM), win10 resolved (RuToken re-enum, кнопка «Игнорировать»). **~11:40 отключение электричества в деревне** → NAS лёг (роутер/WAN жив — на UPS). Возврат 16:20: md3 собрался деградированным `[_UU]`, **sdb3 сам не вернулся** (прогресс rebuild НЕ переживает power-loss — контрольной точки нет), повторён `mdadm --add /dev/md3 /dev/sdb3` → recovery с 0.0%, ETA ~4-5 дн (разгон 3→10-25МБ/с). md0/md1 все 4 диска `[UUUU]` (утр. ремонт пережил ребут), md2/VMM здоров. **Бэкапы возвращены 2026-08-10 18:00 по указанию vitya (ДО ребилда — ребилд фоновый):** cron раскомментирован (vds-kzntsv 05:00 + books-vds 06:00), ручные прогоны ПОДТВЕРЖДЕНЫ на kreknin (vds-kzntsv 2026-08-10 66G / books-vds 15G, latest→08-10, 7 снапшотов у обоих). Находка: books-vds не доезжал до kreknin с 08-05 (08-06..08-09 + 08-10 06:05 rsync падал — timed out/no route; другой триггер не найден); застрявший ES-снапшот `daily-2026-08-10` удалён. Осталось: дождаться ребилда md3 → `btrfs scrub /volume1` → monitor на ребилд активен. Всё: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`._
_Updated: 2026-08-04 — 🔵 **[coord-loader-admin-api-client] координатор.** Я (admin) назначен координатором таски pilorama98 `loader-migrate-to-admin-api-client` (перевод `apps/loader` с прямого DB на `@snolla/admin-api-client` от snolla). Письма-интро отправлены обоим (pilorama98 — report готовности, snolla — краткое описание клиента). Предпосылка S1: **ApiKeys DDL прогнана на обоих боевых SNOLLA** (vds `MoreThenCms` + stostayer `stostayer`) — таблица + индексы + FK, RC=0, verify зелёный. См. `coord-loader-admin-api-client.md`._ _Updated: 2026-08-04 — 🔵 **[coord-loader-admin-api-client] координатор.** Я (admin) назначен координатором таски pilorama98 `loader-migrate-to-admin-api-client` (перевод `apps/loader` с прямого DB на `@snolla/admin-api-client` от snolla). Письма-интро отправлены обоим (pilorama98 — report готовности, snolla — краткое описание клиента). Предпосылка S1: **ApiKeys DDL прогнана на обоих боевых SNOLLA** (vds `MoreThenCms` + stostayer `stostayer`) — таблица + индексы + FK, RC=0, verify зелёный. См. `coord-loader-admin-api-client.md`._
_Updated: 2026-08-03 (2) — 🟢 **[labtools.ru cylindrical] CLOSED.** Фикс core 0.26.5 (store-only content-page резолвер) НЕ чинил: labtools — catalog-модуль (store отсутствует), linked-item provider = legacy `LinkedCatalogProductsProvider`. Реализован полный диспетчер `viewModels/linkedItemResolver.js` (порт `ILinkedEntitiesProvider`): dispatch по provider-строке → catalog (CatalogsService.findProductById) / blog (findPostByGlobalId) / page (getPageById) / store (fallback). core 0.26.6 published (verdaccio), 263/263. labtools yarn.lock → 0.26.6 (d263e1c), стек 17 redeploy (env 8/8, pullImage), **LIVE GREEN**: cylindrical 0 empty href/src, 8 карточек гидратированы (round-xrf/vacuum-ir/…), остальные страницы 200. Таска snolla закрыта. Rollback = `0dc0b4e`._ _Updated: 2026-08-03 (2) — 🟢 **[labtools.ru cylindrical] CLOSED.** Фикс core 0.26.5 (store-only content-page резолвер) НЕ чинил: labtools — catalog-модуль (store отсутствует), linked-item provider = legacy `LinkedCatalogProductsProvider`. Реализован полный диспетчер `viewModels/linkedItemResolver.js` (порт `ILinkedEntitiesProvider`): dispatch по provider-строке → catalog (CatalogsService.findProductById) / blog (findPostByGlobalId) / page (getPageById) / store (fallback). core 0.26.6 published (verdaccio), 263/263. labtools yarn.lock → 0.26.6 (d263e1c), стек 17 redeploy (env 8/8, pullImage), **LIVE GREEN**: cylindrical 0 empty href/src, 8 карточек гидратированы (round-xrf/vacuum-ir/…), остальные страницы 200. Таска snolla закрыта. Rollback = `0dc0b4e`._
_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-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`._

View File

@@ -111,7 +111,10 @@ USB **2TB WD20EARX** (sdq) отформатирован в один btrfs, см
**Системные разделы (md0/md1) починены 2026-08-10:** DSM ругался «Отказ системного раздела» на sda/sdb/sdc — после инцидента при загрузке в 16-слотовое boot-зеркало собрался только sdd, системные разделы HDD остались вне массива (superblock'и валидны, UUID совпадали). `mdadm --add /dev/md0 {sda1,sdb1,sdc1}` + `mdadm --add /dev/md1 {sda2,sdb2,sdc2}` → ресинхронизация, диски **зелёные** в DSM. На md3 не влияло (копейки I/O: 8MB+2GB). **Системные разделы (md0/md1) починены 2026-08-10:** DSM ругался «Отказ системного раздела» на sda/sdb/sdc — после инцидента при загрузке в 16-слотовое boot-зеркало собрался только sdd, системные разделы HDD остались вне массива (superblock'и валидны, UUID совпадали). `mdadm --add /dev/md0 {sda1,sdb1,sdc1}` + `mdadm --add /dev/md1 {sda2,sdb2,sdc2}` → ресинхронизация, диски **зелёные** в DSM. На md3 не влияло (копейки I/O: 8MB+2GB).
**Бэкапы: всё ещё ЗАГЛУШЕНЫ** (`vds-backup` + `books-vds-backup` на vds-kzntsv) — вернуть ТОЛЬКО после завершения ребилда + scrub. Задача: `.tasks/kreknin-reenable-backups-after-rebuild.md` (blocked). **Бэкапы ВОЗВРАЩЕНЫ 2026-08-10 (18:00)** по прямому указанию vitya (ДО завершения ребилда — ребилд в фоне на idle-IO). Cron-строки раскомментированы: vds-kzntsv `0 5 * * *`, books-vds `0 6 * * *` (снят префикс `#DISABLED-kreknin-sick `). Оба прогнаны вручную и **ПОДТВЕРЖДЕНЫ на kreknin**: vds-kzntsv `2026-08-10` 66G (7 снапшотов), books-vds `2026-08-10` 15G (7 снапшотов), latest→08-10, `/volume1` 5.4T free (24%).
**Находка:** бэкапы books-vds НЕ доезжали до kreknin с **08-05** — run.sh гонялся 08-01..08-09 + 08-10 06:05 (локальные ES-снапшоты создавались), но rsync падал (`Connection timed out` / `No route to host`). Другого триггера кроме cron.d-строки не найдено (нет crontab/systemd-таймера) — вероятно ручные запуски. vds-kzntsv отключение держалось (не ходил с 07-31). Застрявший ES-снапшот `daily-2026-08-10` от упавшего прогона удалён (коллизия имён → 400 убил бы следующий прогон). Осталось после ребилда: `btrfs scrub /volume1`.
**Отключение питания 2026-08-10 (~11:40, деревня, временно):** NAS недоступен с 2 сетей (рабочая станция + VDS); роутер/WAN жив (traceroute доходит до 195.19.90.188 ~5мс — на UPS/другой линии). Причина — временное отключение электричества у Алексея, не поломка. После возврата питания (16:20) md3 собрался деградированным `[_UU]` (sdb3 сам в массив не вернулся), **md0/md1 — все 4 диска `[UUUU]`** (утренний ремонт пережил ребут), md2 здоров. Прогресс ребилда утра **сброшен**`mdadm --add /dev/md3 /dev/sdb3` повторён (валидный член, UUID 717d6154…), recovery с 0.0%, ETA ~4+ дня (разгон с ~3МБ/с до 10-25). **Урок: прогресс mdadm-rebuild НЕ переживает жёсткое отключение** (контрольной точки нет) — после power-loss надо проверять /proc/mdstat и пере-dadd sdb3.
## План ремонта (статус) ## План ремонта (статус)
@@ -119,5 +122,5 @@ USB **2TB WD20EARX** (sdq) отформатирован в один btrfs, см
2. ~~Переподключить SATA~~ ✅ сделано (sda/sdc/sdb), все на 6 Gbps 2. ~~Переподключить SATA~~ ✅ сделано (sda/sdc/sdb), все на 6 Gbps
3. **Repair md3 — В ПРОЦЕССЕ** (rebuild ~4 дня, DSM «оптимизация») 3. **Repair md3 — В ПРОЦЕССЕ** (rebuild ~4 дня, DSM «оптимизация»)
4. ✅ sda вернулся на 6 Gbps, CRC=10 (не растёт) 4. ✅ sda вернулся на 6 Gbps, CRC=10 (не растёт)
5. **Вернуть бэкапы** после ребилда + scrub (task `kreknin-reenable-backups-after-rebuild`) 5. **Бэкапы возвращены ДОСРОЧНО** 2026-08-10 (указание vitya — ребилд фоновый); `btrfs scrub /volume1` — после завершения ребилда
6. ⏳ VMM win10 — проверить в GUI (storage здоров) 6. ⏳ VMM win10 — проверить в GUI (storage здоров)

33
kreknin_rebuild_mon.sh Normal file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
# kreknin array monitor — md0/md1 (system boot mirror) + md3 (data). Run with sudo via Monitor.
# Completion signal: sync_action idle AND mdadm Active Devices == Total Devices (works for 16-slot template too).
arrays="md0 md1 md3"
declare -A prev_state
declare -A prev_pct
declare -A crc0
while true; do
for a in $arrays; do
[ -e "/sys/block/$a/md/sync_action" ] || continue
act=$(cat "/sys/block/$a/md/sync_action" 2>/dev/null)
active=$(mdadm --detail "/dev/$a" 2>/dev/null | awk '/Active Devices/{print $3; exit}')
total=$(mdadm --detail "/dev/$a" 2>/dev/null | awk '/Total Devices/{print $3; exit}')
brk=$(sed -n "/^$a :/,/^$/p" /proc/mdstat | grep blocks | grep -o '\[[^]]*\]' | tail -1)
sig="$act|$brk|a=$active/t=$total"
if [ "${prev_state[$a]}" != "$sig" ]; then
echo "[$a-state] $sig"
prev_state[$a]="$sig"
fi
if [ "$act" = "idle" ] && [ "$active" = "$total" ] && [ "${prev_state[$a]}" != "DONE" ]; then
echo "[$a] COMPLETE healthy active=$active/$total $brk"
prev_state[$a]="DONE"
fi
done
pct=$(cat /sys/block/md3/md/sync_completed 2>/dev/null | awk -F/ '$2>0{printf "%d", $1*100/$2}')
m=$(( (pct+4)/5*5 ))
if [ "$m" -gt "${prev_pct[md3]:-0}" ]; then echo "[md3] $pct%"; prev_pct[md3]="$m"; fi
for d in sda sdb sdc; do
crc=$(smartctl -d sat -A /dev/$d 2>/dev/null | awk '/UDMA_CRC/{print $10; exit}')
[ -n "$crc" ] && { [ -n "${crc0[$d]}" ] && [ "$crc" -gt "${crc0[$d]}" ] && echo "[CRC-GROW] $d ${crc0[$d]}->$crc"; crc0[$d]=$crc; }
done
sleep 120
done