From 02f8656ed85f2b771cc460dc2da4ce2a53edddf6 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 26 Sep 2026 13:21:05 +0600 Subject: [PATCH] [2026-09-26] eagle: family/how-to/jellyfin-config.md family/how-to/truenas-infrastructure.md family/projects/media-toolbox-taiga.md --- family/how-to/jellyfin-config.md | 113 +++++++++++++++++++++++- family/how-to/truenas-infrastructure.md | 1 + family/projects/media-toolbox-taiga.md | 6 +- 3 files changed, 115 insertions(+), 5 deletions(-) diff --git a/family/how-to/jellyfin-config.md b/family/how-to/jellyfin-config.md index 27a73968..47975512 100644 --- a/family/how-to/jellyfin-config.md +++ b/family/how-to/jellyfin-config.md @@ -1,7 +1,7 @@ --- title: Jellyfin Config created: '2026-05-23' -updated: '2026-06-17' +updated: '2026-09-26' type: tech namespace: family tags: @@ -16,9 +16,7 @@ related: --- # Jellyfin Config -**URL:** `http://kraken:8096` -**API Base (внутри контейнера kraken):** `http://kraken:8096/jellyfin/` -(все API эндпоинты под префиксом `/jellyfin`) +> ⚠️ **Обновлено 2026-09-26.** Раздел ниже «URL / API Base / пути» описывает **Kraken-инсталляцию** (`/opt/jellyfin/`, `/media/*`, префикс `/jellyfin`) и **устарел для TrueNAS**. Живой инстанс — на **TrueNAS/Taiga**, раздел «### Taiga (TrueNAS) — ЖИВОЙ ИНСТАНС» ниже. Проверено фактом 2026-09-26. ## Users @@ -32,6 +30,7 @@ related: `87af49b6ff62ea68da6abdab0d7a4fbc` Used by automation scripts (watchlist-sync, media-pipeline agents). +⚠️ **Для TrueNAS-инстанса этот ключ НЕ работает** (проверено 2026-09-26: `401 Unauthorized`, в логе `Invalid token`). Живой ключ — в разделе Taiga ниже. ## Database / Maintenance @@ -64,3 +63,109 @@ Used by automation scripts (watchlist-sync, media-pipeline agents). | Music | | Музыка | > **Важно:** Прямые пути sonarr (`/media/series-sonarr/`, `/media/movies-radarr/`) **не должны быть** в библиотеках Jellyfin. Router.py создаёт симлинки из sonarr-папок в `/media/series/` и `/media/movies/`. Если symlink уже есть — дубли не появятся. Если есть старые дубли — удалить orphaned items через `DELETE /Items/{id}`. + +--- + +# ### Taiga (TrueNAS) — ЖИВОЙ ИНСТАНС + +> ✅ Факт-проверка **2026-09-26**. Всё ниже — с живой машины, не из Kraken-доки. + +## Расположение и монтирование + +| Параметр | Значение | +|---|---| +| Хост | TrueNAS (`192.168.2.197`), доступ `ssh truenas_admin@mallexxx.duckdns.org` | +| Контейнер | `jellyfin`, образ из `/mnt/RED_2TB/docker/arr/docker-compose.yml` | +| URL (наружу) | `https://jellyfin.mallexxx.duckdns.org` (Caddy) | +| Внутренний порт | `8096` — **БЕЗ префикса** `/jellyfin` (префикс был Kraken-спецификой) | +| Монтирование 1 | `/mnt/RED_2TB/docker/arr/jellyfin` → `/config` (rw) | +| Монтирование 2 | `/mnt/RED_2TB/storage` → `/storage` (**ro**) | +| Сеть | `caddy_default` (только; `media_net` не подключён) | + +## API-ключ (живой) + +`eaglesetup2026taiga` — имя ключа `eagle-setup`. + +Источник (когда нужно перечитать): таблица `ApiKeys` в +`/mnt/RED_2TB/docker/arr/jellyfin/data/data/jellyfin.db`. + +```bash +# Снять копию БД (безопасно; контейнер не останавливать для ЧТЕНИЯ копии) +cd /tmp && ssh truenas_admin@mallexxx.duckdns.org \ + 'cat /mnt/RED_2TB/docker/arr/jellyfin/data/data/jellyfin.db' > jf-copy.db +sqlite3 jf-copy.db "SELECT Name, AccessToken FROM ApiKeys;" +``` + +> 🔴 **`sqlite3` на TrueNAS-хосте НЕ установлен** (в доке встречается обратное). Рабочий приём: скопировать `.db` на Mac (`cat` через ssh) → читать локальным `sqlite3`. +> ⚠️ Копия `.db` **без `-wal`** может отставать (WAL-режим). Для чтения ключа/списка библиотек этого достаточно — проверено, значения совпали с живыми. + +## Библиотеки (фактическое состояние 2026-09-26) + +6 библиотек в `BaseItems` (тип `MediaBrowser.Controller.Entities.CollectionFolder`): + +| Название | `CollectionType` | `PhysicalLocationsList` | +|---|---|---| +| Movies | `movies` | `/config/data/root/default/Movies`, `/storage/Movies` | +| Cartoons | `movies` | `/config/data/root/default/Cartoons`, `/storage/Cartoons` | +| Documentaries | `movies` | `/config/data/root/default/Documentaries`, `/storage/documentaries` | +| Series | `tvshows` | `/config/data/root/default/Series`, `/storage/series` | +| Cartoon Series | `tvshows` | `/config/data/root/default/Cartoon Series`, `/storage/cartoons-series` | +| Documentary Series | `tvshows` | `/config/data/root/default/Documentary Series`, `/storage/documentaries-series` | + +> 📌 **У каждой виртуальной папки ДВА пути:** служебный `/config/data/root/default/` (создаётся Jellyfin автоматически) и реальный `/storage/`. Реальный путь дополнительно виден как `MediaBrowser.Controller.Entities.Folder` с собственным `Id`. +> **Music-библиотеки на 2026-09-26 НЕТ** (в доке строка `Music` была пустой и остаётся незаполненной — см. план ниже). + +## Папка музыки — разведка 2026-09-26 + +| Параметр | Значение | +|---|---| +| Хост-путь | `/mnt/RED_2TB/storage/Music` | +| В контейнере | `/storage/Music` — **уже смонтировано**, доп. монтирование НЕ нужно | +| Объём | **7890** аудиофайлов (`mp3/flac/m4a/ogg/wav/opus/aac`) | +| Структура | 8 категорий: `!A Not sorted`, `!Pop, Club, Любэ`, `!Retro`, `!Rock&Folk`, `!Барды`, `!Детские`, `!Классика`, `!Рэп`, `z Другое, Enigma, Ленинград` | +| Мусор | `bootmgr`, `.DS_Store`, `desktop.ini`, `Thumbs.db`, `convert_wma.sh`, `wma_convert.log` — Jellyfin игнорирует | +| Права | `truenas_admin:truenas_admin`, `drwxrwx---` (для `PUID/PGID 921` путь доступен — `/storage` монтируется целиком) | + +> ⚠️ **Структура папок НЕ соответствует музыкальной раскладке** (`Artist/Album`). Jellyfin для `collectionType=music` раскладывает по **тегам**, а не по папкам. Категории вида `!Rock&Folk` — «мусорные» имена из файловой системы, не артисты. Ожидаемый риск: файлы с пустыми тегами уедут в `Unknown Artist`. Вариант митигации — `EnableFolderView` в настройках библиотеки (даёт навигацию по физическим папкам). + +## API-команды (Taiga, без префикса) + +```bash +TOKEN=eaglesetup2026taiga +# Список библиотек +curl -s -H "X-MediaBrowser-Token: $TOKEN" http://localhost:8096/Library/VirtualFolders +# Инфо о сервере +curl -s -H "X-MediaBrowser-Token: $TOKEN" http://localhost:8096/System/Info +``` + +> 🔴 **`/System/Info` без токена → `401` — это НЕ поломка.** Именно так и выглядит живой сервер. С префиксом `/jellyfin/System/Info` → `404` (префикса нет). Оба наблюдения 2026-09-26, оба могут сбить с толку при диагностике. + +### 🔴 ПИТФОЛЛ: `name` и `paths` — в QUERY STRING, не в body + +Создание библиотеки (Jellyfin 10.11): + +```bash +# ПРАВИЛЬНО: +curl -s -X POST -H "X-MediaBrowser-Token: $TOKEN" \ + "http://localhost:8096/Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music" +# НЕПРАВИЛЬНО: name/paths в JSON-body → библиотека не создаётся +``` + +## ПЛАН: добавить музыкальную библиотеку (согласован 2026-09-26, НЕ ВЫПОЛНЕН) + +6 шагов, в порядке исполнения: + +1. **Бэкап конфига** — `docker stop jellyfin` → tar `/mnt/RED_2TB/docker/arr/jellyfin/` → `docker start jellyfin`. Без остановки бэкап БД битый (WAL). +2. **Создать библиотеку** — `POST /Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music` (query string!). +3. **Проверка API** — `GET /Library/VirtualFolders` → Music в списке. +4. **Скан** — дождаться индексации 7890 файлов (~10–30 мин). +5. **ПРИЁМКА ALEX** — открыть `https://jellyfin.mallexxx.duckdns.org` → вкладка Music → треки видны. Приёмка = видно в UI, не «API отвечает». +6. **Обновить доки** после подтверждения — таблица библиотек здесь + `family/projects/media-toolbox-taiga.md`. + +> ❓ **Открытый выбор перед шагом 2:** включать ли `EnableFolderView` (навигация по папкам вместо тегов). Решается после выборочной проверки тегов файлов. + +## Связанные заметки + +- [[family/projects/media-toolbox-taiga]] — *arr стек на Taiga (Prowlarr/Radarr/Sonarr/Transmission/Jellyfin) +- [[family/how-to/truenas-infrastructure]] — TrueNAS: контейнеры, доступ, структура пула +- [[family/how-to/navidrome-truenas-android]] — альтернативный музыкальный сервер (Navidrome) на той же папке `Music` diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index e4b99ada..493fbd60 100644 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -213,6 +213,7 @@ TrueNAS использует **NFSv4 ACL**, а не стандартный POSIX | immich-server | immich-app/immich-server:release | 2283 | immich.mallexxx.duckdns.org | | immich-postgres | tensorchord/pgvecto-rs:pg14-v0.2.0 | — | — | | immich-redis | redis:7 | — | — | +| **jellyfin** | из `/mnt/RED_2TB/docker/arr/docker-compose.yml` | 8096 | jellyfin.mallexxx.duckdns.org | | ~~nodered~~ ⛔ | nodered/node-red:latest | ~~1880~~ | **ПОГАШЕН 2026-09-14** — flows на t610 (ingress) | | ~~mosquitto~~ ⛔ | eclipse-mosquitto:latest | ~~1883~~ | **ПОГАШЕН 2026-09-14** — брокер на t610 | | caddy | caddy:latest | 80, 443 | reverse proxy для всего | diff --git a/family/projects/media-toolbox-taiga.md b/family/projects/media-toolbox-taiga.md index 4c9aa5a8..6eeded94 100644 --- a/family/projects/media-toolbox-taiga.md +++ b/family/projects/media-toolbox-taiga.md @@ -11,7 +11,7 @@ tags: - arr - media created: '2026-05-20' -updated: '2026-05-20' +updated: '2026-09-26' status: deployed --- # *arr Stack на Тайге — Setup & Config @@ -82,10 +82,14 @@ Caddy: subdomain-based роутинг, без URL Base. Let's Encrypt автом | `cartoons-series/` | Мультсериалы | ✅ Cartoon Series | | `documentaries/` | Документалки | ✅ Documentaries | | `documentaries-series/` | Документальные сериалы | ✅ Documentary Series | +| `Music/` | Музыка (7890 аудиофайлов, 8 категорий) | ⏳ **библиотеки ещё нет** — план 2026-09-26 | | `Downloads/` | Торренты (Transmission) | ❌ | Все папки: uid=921, gid=921, NFSv4 ACL через midclt. +> 📌 **`Music/` на 2026-09-26:** файлы лежат, `/storage` уже смонтирован в контейнер (ro), но виртуальной папки Music в Jellyfin **нет**. Разведка + 6-шаговый план (бэкап → `POST /Library/VirtualFolders` → скан → приёмка) — [[family/how-to/jellyfin-config]] §«Taiga (TrueNAS)». Доп. монтирование НЕ требуется. +> ⚠️ Структура `Music/` — плоские категории (`!Rock&Folk`, `!Retro`, `!Классика`), НЕ `Artist/Album` → для `collectionType=music` Jellyfin раскладывает по тегам, риск «Unknown Artist». + ## API ключи | Сервис | Prefix |