[2026-09-27] eagle: family/how-to/navidrome-truenas-android.md personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md personal/tech/skill-truenas-administration.md
This commit is contained in:
1 parent
d77aec3548
commit
eac340006e
4 files changed
+342
-12
No files matched your search
@@ -75,6 +75,23 @@ related:
|
||||
> перечитала теги. Разбор — § СЕССИЯ 29-ТЕР.
|
||||
> ✅ **Покрытие план↔БД ПОЛНОЕ:** 7861 = 7861, `GAP-db-not-in-plan.csv` и
|
||||
> `GAP-plan-not-in-db.csv` **оба пусты** (`/tmp/gap_db_plan.py`).
|
||||
>
|
||||
> ✅ **СЕССИЯ 29-КВАТЕР — ДВА ГЛАВНЫХ РЕЗУЛЬТАТА:**
|
||||
> 1. 🔴 **`.ndignore` ИСПРАВЛЕН** — не хватало 2 бэкап-папок (`backup_before_306`,
|
||||
> `backup_album_root_…-229`, созданы ПОЗЖЕ файла). Живая музыка = **7861** = плану.
|
||||
> Детали → [[family/how-to/navidrome-truenas-android]].
|
||||
> 2. 🔑 **ГЕНЕРАТОР ПЛАНА НАЙДЕН** (только через **Zulip DB**):
|
||||
> `~/Developer/personal-os/tools/music-tags/build_fix_plan2.py`.
|
||||
> Корень дефекта «мусор в `album`»: `norm(new_al) in NON_ARTIST` — **точное сравнение всей
|
||||
> строки** + `NON_ARTIST` без слова `песни` → пропущено **44 файла** (Никулин `Песни` 18,
|
||||
> Миансарова `Храбрый Зайчик. Песни для детей` 1, `Избранное` 16, …).
|
||||
> Разбор — [[personal/plans/music-artist-albumartist-repair]] § СЕССИЯ 29-КВАТЕР.
|
||||
>
|
||||
> 🔴🔴 **ПИТФОЛЛ (метод, сессия 29-кватер): ЗАПРОС К `media_file` БЕЗ ФИЛЬТРА БЭКАПА.**
|
||||
> Запрос `album LIKE '(%'` без фильтра вытащил 306 файлов бэкапа → **ложный отчёт «скобки не
|
||||
> исправлены»**. В живом дереве скобок-обёрток **0**. **ОБЯЗАТЕЛЬНО:**
|
||||
> `WHERE missing=0 AND path NOT LIKE 'backup%'`.
|
||||
|
||||
> 🔑 **ПИТФОЛЛ: «Чёрный кот» пишется через Ё** — `grep "черный кот"` даёт 0 и создаёт
|
||||
> ложное «файла нет». Правило: искать и через `ё`, и через `е`, и без гласной.
|
||||
> 🔴 **Питфолл БД:** колонка — **`track_number`**, не `track`; возвращается **int**;
|
||||
|
||||
@@ -3,16 +3,19 @@ title: skill — truenas-administration
|
||||
namespace: personal
|
||||
type: tech
|
||||
created: '2026-09-26'
|
||||
updated: '2026-09-26'
|
||||
updated: '2026-09-27'
|
||||
tags:
|
||||
- truenas
|
||||
- skill
|
||||
- docker
|
||||
- acl
|
||||
- nfc
|
||||
- navidrome
|
||||
- ndignore
|
||||
related:
|
||||
- '[[personal/plans/tagwriter-container]]'
|
||||
- '[[personal/tech/music-tags-repair-truenas]]'
|
||||
- '[[family/how-to/navidrome-truenas-android]]'
|
||||
---
|
||||
|
||||
# Зеркало навыка `truenas-administration`
|
||||
@@ -20,7 +23,50 @@ related:
|
||||
Навык: `~/.hermes/hermes-whale/skills/devops/truenas-administration/SKILL.md`
|
||||
(umbrella: ACL/PUID, ZFS panic recovery, tree comparison, named-volumes→bind-mount).
|
||||
|
||||
Ниже — дельта, добавленная **2026-09-26** (сессия music-tags волна 38 + сборка `tagwriter`).
|
||||
Ниже — дельта. **2026-09-26:** волна 38 + сборка `tagwriter`. **2026-09-27:** добавился RULE 0
|
||||
(Area 3) про `.ndignore`.
|
||||
|
||||
## 0. 🔴 RULE 0 (2026-09-27): любой новый `backup*` → в `.ndignore` В ТОМ ЖЕ ПРОГОНЕ
|
||||
|
||||
Область: `/mnt/RED_2TB/storage/Music/` — корень библиотеки Navidrome (монтируется как `/music`).
|
||||
Navidrome игнорирует **только то, что перечислено в `.ndignore`**. Бэкап, которого там нет,
|
||||
**сканируется как обычная музыка** и пачкает КАЖДЫЙ запрос к БД: расхождения счётчиков,
|
||||
фантомные находки («альбом со скобками до сих пор в базе», хотя правка отработала),
|
||||
дифф, который выглядит сломанным, хотя он верный.
|
||||
|
||||
**Проверенный провал 2026-09-27:** `.ndignore` создан **03:49** и содержал 4 папки
|
||||
(`backup`, `backup_conv40`, `backup_fix`, `backup_raw`). Бэкапы, созданные **позже**, в файл
|
||||
не попали: `backup_before_306` (**05:17**), `backup_album_root_20260927-album-root-229` (**06:19**).
|
||||
Итог: БД **8167** против плана **7861**, разница **306** = неотфильтрованный бэкап.
|
||||
Альбомы `(zvezda)`, `(Авария)`, `(Несчастный Случай)` «остались в базе» — они существовали
|
||||
**только внутри бэкапа**.
|
||||
|
||||
**Фикс (боевой конфиг → порядок: бэкап ДО → правка → проверка → коммит ПОСЛЕ):**
|
||||
```bash
|
||||
# 1. бэкап файла
|
||||
ssh truenas_admin@mallexxx.duckdns.org \
|
||||
"cp /mnt/RED_2TB/storage/Music/.ndignore /mnt/RED_2TB/storage/Music/.ndignore.bak-\$(date +%Y%m%d-%H%M%S)"
|
||||
# 2. перечислить ВСЕ бэкап-папки и сверить со списком
|
||||
ssh truenas_admin@mallexxx.duckdns.org "cd /mnt/RED_2TB/storage/Music && ls -d */ | grep -i backup"
|
||||
# 3. полный файл собрать ЛОКАЛЬНО (write_file) → scp → cp НА МЕСТО (НЕ sed на NAS!)
|
||||
scp /tmp/ndignore-new truenas_admin@mallexxx.duckdns.org:/tmp/ndignore-new
|
||||
ssh truenas_admin@mallexxx.duckdns.org "cp /tmp/ndignore-new /mnt/RED_2TB/storage/Music/.ndignore"
|
||||
```
|
||||
Navidrome подхватывает файл по рестарту; после скана проверить, что игнор сработал —
|
||||
игнорируемые получают **`missing=1`, их НЕ удаляют**:
|
||||
```bash
|
||||
sqlite3 /mnt/RED_2TB/docker/navidrome/data/navidrome.db \
|
||||
"SELECT COUNT(*) FROM media_file; -- всего
|
||||
SELECT COUNT(*) FROM media_file WHERE missing=1; -- игнор/отсутствуют
|
||||
SELECT COUNT(*) FROM media_file WHERE missing=0 AND path NOT LIKE 'backup%';" -- живая музыка
|
||||
```
|
||||
**Контрольное число:** живая музыка = числу строк плана (**7861** на 2026-09-27).
|
||||
Факт после фикса: всего **8396**, `missing=1` **535**, живая **7861** ✅.
|
||||
|
||||
> 🔴 **ОБЯЗАТЕЛЬНЫЙ ФИЛЬТР в ЛЮБОМ запросе к `media_file`:**
|
||||
> `missing=0 AND path NOT LIKE 'backup%'`
|
||||
> Без него читаешь бэкап-копии и делаешь ЛОЖНЫЕ выводы. Эта ошибка дала неверный отчёт
|
||||
> «скобки не исправлены» — бэкап был выдан за живое дерево.
|
||||
|
||||
## 1. Создание НОВОГО каталога под `/mnt/<POOL>/docker/` — из контейнера
|
||||
|
||||
|
||||
Reference in new issue
Block a user