From 4ab53a2a639b986383a0fcf3c55c2a34b3753f47 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 26 Sep 2026 14:26:54 +0600 Subject: [PATCH] [2026-09-26] eagle: family/how-to/jellyfin-config.md family/how-to/navidrome-truenas-android.md family/plans/lidarr-taiga-deploy.md family/projects/media-toolbox-taiga.md personal/plans/lidarr-taiga-and-indexer-unblock.md personal/tech/skill-arr-media-stack-setup-additions.md --- family/how-to/jellyfin-config.md | 13 + family/how-to/navidrome-truenas-android.md | 25 +- family/plans/lidarr-taiga-deploy.md | 164 +++++++++ family/projects/media-toolbox-taiga.md | 109 +++++- .../plans/lidarr-taiga-and-indexer-unblock.md | 326 ++++++++++++++++++ .../skill-arr-media-stack-setup-additions.md | 95 +++++ 6 files changed, 727 insertions(+), 5 deletions(-) create mode 100644 family/plans/lidarr-taiga-deploy.md create mode 100644 personal/plans/lidarr-taiga-and-indexer-unblock.md create mode 100644 personal/tech/skill-arr-media-stack-setup-additions.md diff --git a/family/how-to/jellyfin-config.md b/family/how-to/jellyfin-config.md index e80fae10..9f7ab5d0 100644 --- a/family/how-to/jellyfin-config.md +++ b/family/how-to/jellyfin-config.md @@ -70,6 +70,19 @@ Used by automation scripts (watchlist-sync, media-pipeline agents). > ✅ Факт-проверка **2026-09-26**. Всё ниже — с живой машины, не из Kraken-доки. +> ✅ **Проверено 2026-09-26 (повторно, разведка под Lidarr):** нижеприведённые данные **подтверждены** +> на живой машине. Музыкальной библиотеки по-прежнему **нет**, ремонт тегов не начат +> (этап 3 плана — апрув Alex по CSV v2). Дополнительно найдено: **индексеры Prowlarr не работают** +> (DNS-фильтр провайдера Тайги) → новый контент в Music через Lidarr сейчас невозможен. +> См. [[personal/plans/lidarr-taiga-and-indexer-unblock]]. + +> 🔴 **ДИАГНОСТИЧЕСКАЯ ЛОВУШКА, проверено 2026-09-26.** Ранее в этой доке было записано +> «ключ `87af49b6ff62ea68da6abdab0d7a4fbc` НЕ работает для TrueNAS (`401 Unauthorized`)». +> **Это НЕВЕРНО.** `GET /System/Info` без токена → **401 — это нормальное поведение живого сервера**, +> а не признак неверного ключа. С префиксом `/jellyfin/System/Info` → **404** (префикса на Тайге нет). +> Оба наблюдения легко принять за поломку. **Живой ключ — `eaglesetup2026taiga`** (раздел Taiga ниже); +> проверять ключ запросом **с** заголовком, а не по 401 на запросе без токена. + ## Расположение и монтирование | Параметр | Значение | diff --git a/family/how-to/navidrome-truenas-android.md b/family/how-to/navidrome-truenas-android.md index c7913003..1c525519 100644 --- a/family/how-to/navidrome-truenas-android.md +++ b/family/how-to/navidrome-truenas-android.md @@ -1,7 +1,8 @@ # Музыкальный плеер с TrueNAS на Android -**Статус:** 📋 Планируется +**Статус:** 📋 Планируется **Дата:** 2026-05-10 +**Обновлено:** 2026-09-26 ## Задача Поднять стриминг музыки с TrueNAS (`/mnt/RED_2TB/storage/Music/`) на Android-устройства. @@ -23,7 +24,27 @@ - Без сервера, VLC или Solid Explorer играют по SMB - Только для домашней сети — по интернету медленно и небезопасно +## 🔴 Общий блокер для ВСЕХ вариантов (найдено 2026-09-26) + +**Теги в `Music/` массово битые** — полная инвентаризация 7906 файлов: +`mojibake` 2759, `lost` 662 (данные уничтожены, `\ufffd`), `empty` 1026, `partial` 2920, +`clean` только 537. Ремонт на этапе «ждём апрув Alex по CSV v2», правки файлов не начаты. + +> **Navidrome раскладывает библиотеку по тегам так же, как Jellyfin** — то есть битые теги +> портят **и этот** вариант, не только Jellyfin. Порядок «сначала теги, потом сервер» +> распространяется на все варианты 1–2. +> Детали: [[personal/tech/music-tags-repair-truenas]]. + +> ⚠️ **Вариант 3 (SMB) от битых тегов не зависит** — навигация по файлам. Единственный, +> работающий прямо сейчас. + ## Следующие шаги +- [ ] **Сначала:** ремонт тегов 7906 файлов ([[personal/tech/music-tags-repair-truenas]]) - [ ] Поднять Navidrome в Docker на TrueNAS -- [ ] Пробросить порт / настроить nginx proxy +- [ ] Пробросить порт / настроить Caddy subdomain (Caddyfile root-owned → через alpine-контейнер) - [ ] Установить Symfonium на Android, подключить + +## Связанные заметки +- [[personal/tech/music-tags-repair-truenas]] — 🔴 ремонт тегов, блокирует всё +- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ Lidarr на Тайге (2026-09-26), наполнение `Music/` новым контентом +- [[family/how-to/jellyfin-config]] — Jellyfin как альтернативный музыкальный сервер (Вариант 2) diff --git a/family/plans/lidarr-taiga-deploy.md b/family/plans/lidarr-taiga-deploy.md new file mode 100644 index 00000000..b9cd725b --- /dev/null +++ b/family/plans/lidarr-taiga-deploy.md @@ -0,0 +1,164 @@ +# Lidarr на Taiga — деплой + прокси для индексеров + +**Дата:** 2026-09-26 +**Статус:** 🟡 В работе (Фаза 0) +**Namespace:** family + +## Задача + +Поставить Lidarr на TrueNAS/Taiga в дополнение к Prowlarr/Radarr/Sonarr/Transmission/Jellyfin, +настроить на музыку, обеспечить синк с Jellyfin, провести проверку живости всего стека. + +## Решения Alex (2026-09-26) + +| # | Вопрос | Решение | +|---|---|---| +| 1 | Куда Lidarr складывает музыку | **`/storage/Music`** — существующая папка как root folder | +| 2 | Как обходить блокировку индексеров | **Через прокси** (`vless-proxy`) | +| 3 | Jellyfin Music-библиотека | **НЕ ТРОГАТЬ** — отдельная задача, заблокирована до ремонта тегов | + +## 🔴 Результат разведки (факты с живой машины, 2026-09-26) + +### Что работает + +| Компонент | Состояние | +|---|---| +| prowlarr, radarr, sonarr, jellyfin, transmission | ✅ Up, все под uid 950, PUID/PGID=950 | +| `media_net` (external) | ✅ существует; в ней prowlarr, radarr, sonarr, transmission | +| `caddy_default` | ✅ prowlarr, radarr, sonarr, jellyfin | +| Caddy subdomains | ✅ radarr/sonarr/prowlarr/jellyfin.mallexxx.duckdns.org | +| Radarr root folder | `/storage/radarr` — accessible ✅ | +| Sonarr root folder | `/storage/sonarr` — accessible ✅ | +| Radarr/Sonarr download client | Transmission (id=1, enable=true) ✅ | +| Prowlarr → Radarr/Sonarr apps | оба `syncLevel=fullSync` ✅ | +| Radarr/Sonarr indexers | 5 шт. у Radarr, baseUrl `http://prowlarr:9696//` ✅ формат верный | +| Диск | 960 ГБ свободно из 976 (2% used) | +| Music | 7890 аудиофайлов, `Music/backup` НЕ существует | + +### 🔴 Что НЕ работает — корень проблемы + +**Все 6 индексеров Prowlarr отключены: `disabledTill` = 2026-09-27T08:07:26Z** (более 6 часов недоступны). + +**Корневая причина — DNS-блокировка у интернет-провайдера TrueNAS (Ростелеком):** + +``` +nslookup rutracker.org 8.8.8.8 → NXDOMAIN +nslookup rutracker.org 192.168.2.2 → NXDOMAIN (роутер, = провайдерский DNS) +nslookup rutor.info 8.8.8.8 → NXDOMAIN +nslookup kinozal.tv 8.8.8.8 → NXDOMAIN +nslookup nnmclub.to 8.8.8.8 → NXDOMAIN +nslookup byrutgame.org 192.168.2.2 → 185.200.198.230 ✅ (единственный рабочий) +nslookup google.com 192.168.2.2 → ✅ +``` + +**Это НЕ поломка роутера и НЕ поломка стека.** Блокировка на стороне провайдера: провайдерский DNS +отдаёт NXDOMAIN даже для внешнего резолвера, потому что сам DNS-трафик проходит через провайдера. + +**Следствие:** `dns: [8.8.8.8, 8.8.4.4]` в compose **НЕ помогает** — проверено, NXDOMAIN с 8.8.8.8 тоже. +Единственный рабочий путь — прокси, где DNS резолвится на выходной стороне. + +### ⚠️ `vless-proxy` не виден из media_net + +``` +vless-proxy networks: hermes_taiga_net (172.16.15.2) +docker exec prowlarr getent hosts vless-proxy → FAIL +docker exec prowlarr getent hosts xray-admin → 172.16.1.9 ✅ +``` + +Понадобится подключить `vless-proxy` к `media_net` (runtime + персистентно в его compose). + +### ⚠️ Прочие находки (не блокеры) + +- **Radarr/Sonarr health error RemotePathMappingCheck:** Transmission кладёт в `/storage/Downloads/radarr` + и `/storage/Downloads/sonarr`, а внутри контейнеров этих подпапок нет. Проверить remote path mapping. +- **Transmission:** download-dir `/mnt/storage/Downloads`, incomplete `/mnt/storage/Downloads/transmission/incomplete`, + `rpc-whitelist 172.16.*.*`, `script-torrent-done = false` (хука автопостинга нет). +- **Radarr `indexerstatus` вернул 404** — эндпоинт в этой версии иначе; `disabledTill` в `/api/v3/indexer` пустой `{}`. + Реальный статус отключения виден только в Prowlarr `/api/v1/indexerstatus`. +- Лишние файлы в `/mnt/RED_2TB/storage/`: `cmp-remote.sh`, `cmp-remote-v2.sh`, `edu_acl_fix.py`, + `edu_chgrp_fix.py`, `acl-edu-before-20260922-234617.json`, `shares-before-20260914-070242.json` — мусор от прошлых сессий, не трогать без команды. + +## API-ключи (полные, сняты с живой машины) + +| Сервис | Ключ | +|---|---| +| Prowlarr | `35c8b3f497114076a6150ea0d9504845` | +| Radarr | `51e201f2d61b4fe2a0c322d5e99349fe` | +| Sonarr | `b1eb9cdd5c804e6c956dc9c8bd305dc8` | +| Jellyfin | `eaglesetup2026taiga` | + +## План + +### Фаза 0 — обход DNS-блокировки через прокси (БЛОКЕР для фазы 2) + +1. **Подключить `vless-proxy` к `media_net`** — runtime (`docker network connect`) + персистентно + (добавить `media_net` в `networks:` его compose). Без персистентности отвалится при пересоздании. +2. **Проверить прокси из контейнера arr-стека:** из `radarr` достучаться до `rutracker.org` через + `https_proxy=http://vless-proxy:1080`. Если DNS резолвится на выходной стороне — путь рабочий. +3. **Прописать прокси в Prowlarr** — Settings → Indexers → Add Proxy (SOCKS5 либо HTTP по факту), + host `vless-proxy`, tags `[proxy]`. Присвоить тег индексерам, которые блокируются (RuTracker обязательно, + остальные — по результату проверки). +4. **Сбросить `indexerstatus`** — иначе `disabledTill` держится до 27 сентября. +5. **ПРИЁМКА ALEX:** `https://prowlarr.mallexxx.duckdns.org` → Indexers → Test All → все зелёные. + +### Фаза 1 — деплой Lidarr + +1. **Бэкап** `/mnt/RED_2TB/docker/arr/docker-compose.yml` в `~truenas_admin/`. +2. **Добавить сервис `lidarr`** в compose по образцу radarr: + - образ `lscr.io/linuxserver/lidarr:latest` + - PUID=950, PGID=950, TZ=Asia/Novosibirsk, dns 8.8.8.8/8.8.4.4 + - порты `8686:8686` + - volumes: `/mnt/RED_2TB/docker/arr/lidarr:/config`, `/mnt/RED_2TB/storage:/storage` + - networks: `media_net`, `caddy_default` +3. **Поднять** из правильной папки: `cd /mnt/RED_2TB/docker/arr && docker compose up -d lidarr`. +4. **Caddy:** блок `lidarr.mallexxx.duckdns.org { reverse_proxy lidarr:8686 }` + (правка Caddyfile — только через alpine-контейнер, файл root-owned). +5. **ПРИЁМКА ALEX:** `https://lidarr.mallexxx.duckdns.org` открывается. + +### Фаза 2 — Lidarr на музыку + +1. **Root folder `/storage/Music`** (решение Alex). +2. **Download client** — Transmission: host `transmission`, port 9091, urlBase `/transmission/`, + category `lidarr`, без логина/пароля. +3. **Application в Prowlarr** — добавить Lidarr (implementation `Lidarr`), syncCategories 3000-й серии: + `[3000,3010,3020,3030,3040,3050,3060]`. +4. **Прокси-тег** для заблокированных индексеров (наследуется из фазы 0). +5. **Качество/маска переименования** — решить при настройке (Lidarr переименовывает файлы по маске). +6. **ПРИЁМКА ALEX:** тестовый поиск → торрент появился в Transmission. + +### Фаза 3 — синк с Jellyfin + +🔴 **По решению Alex (2026-09-26) НЕ ТРОГАТЬ.** Музыкальная библиотека Jellyfin остаётся как есть: +её нет, и она не создаётся в рамках этой задачи. Причина — 7890 файлов с массово битыми тегами +(см. `[[personal/tech/music-tags-repair-truenas]]`), ремонт на апруве Alex. + +Что нужно знать для будущей работы (не действие сейчас): +- `/storage/Music` **уже смонтирован** в Jellyfin (ro) — доп. монтирование не требуется. +- Создание библиотеки возможно одной командой, но **до ремонта тегов бессмысленно**. +- Порядок из прошлого плана: ремонт тегов → валидация Alex → удаление `Music/backup/` → библиотека. + +### Фаза 4 — приёмка живости стека + +1. `docker ps` — 6 сервисов arr-стека Up. +2. Radarr/Sonarr/Prowlarr health — без ошибок (сейчас есть IndexerLongTermStatusCheck и RemotePathMappingCheck). +3. Разобрать RemotePathMappingCheck. +4. **ПРИЁМКА ALEX:** панели по HTTPS, плейбек в Jellyfin, поиск в Radarr/Sonarr. + +## Питфоллы (Taiga-специфика, проверено) + +- **`dns: [8.8.8.8]` в compose НЕ обходит блокировку** — проверено, NXDOMAIN с 8.8.8.8 тоже. +- **На хосте TrueNAS нет `curl` и `python3`** в PATH (zsh). `wget` есть внутри контейнеров. + BusyBox `wget` **не поддерживает `-e`** (proxy options) — искать другой способ прокси-теста. +- **`sqlite3` на хосте НЕ установлен** (вопреки старой доке). +- **Caddyfile root-owned** — правка только через `docker run --rm -v /:/host alpine` (см. skill `truenas-caddy-service-deploy`). +- **`docker network connect` теряется при пересоздании** — прописывать сети в compose. +- `ls -la` на TrueNAS показывает `d---------` — норма для NFSv4 ACL; реальные права через `midclt call filesystem.getacl`. +- Папки медиа: uid 950 `drwxrwx---`, root `/mnt/RED_2TB/storage` — `drwxr-x--x` (traverse работает). + +## Связанные заметки + +- [[family/projects/media-toolbox-taiga]] — *arr стек +- [[family/how-to/jellyfin-config]] — Jellyfin Taiga + план Music-библиотеки +- [[personal/tech/music-tags-repair-truenas]] — ремонт тегов (7890 файлов) +- [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] — NFS4 ACL и PUID +- [[family/how-to/arr-stack-taiga]] — предыдущий опыт деплоя diff --git a/family/projects/media-toolbox-taiga.md b/family/projects/media-toolbox-taiga.md index 6eeded94..0d4ebe85 100644 --- a/family/projects/media-toolbox-taiga.md +++ b/family/projects/media-toolbox-taiga.md @@ -10,12 +10,22 @@ tags: - jellyfin - arr - media + - lidarr + - dns created: '2026-05-20' updated: '2026-09-26' status: deployed --- # *arr Stack на Тайге — Setup & Config +> 🔴 **STATE 2026-09-26 (разведка, изменений НЕ вносилось):** +> Контейнеры **живы** (prowlarr/radarr/sonarr/jellyfin/transmission, uid 950, media_net на месте). +> **Индексеры НЕ работают** — DNS-фильтр провайдера Тайги, `initialFailure = 2026-05-20` +> (со дня деплоя). Прокси-обход (vless-proxy) **не подключён к media_net** → никогда не работал. +> Плюс RemotePathMapping не выставлен → health-ошибка в Radarr/Sonarr. +> **Lidarr НЕ установлен.** **Music-библиотеки в Jellyfin нет** (заблокирована ремонтом тегов). +> План: [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ждёт 2 ответов Alex. + ## Архитектура Prowlarr (9696) → Radarr (7878) + Sonarr (8989) → Transmission (9091) → Jellyfin (8096) @@ -44,8 +54,13 @@ Transmission → /mnt/storage/Downloads | Jellyfin | https://jellyfin.mallexxx.duckdns.org | | Transmission | https://transmission.mallexxx.duckdns.org (уже был) | +| Lidarr | https://lidarr.mallexxx.duckdns.org — ⏳ **НЕ установлен** (план, Фаза 1) | + Caddy: subdomain-based роутинг, без URL Base. Let's Encrypt автоматически. +> Правка Caddyfile — **только через alpine-контейнер** (Caddyfile root-owned, `truenas_admin` +> писать не может). Отправлять **весь файл**, не патч. См. skill `truenas-caddy-service-deploy`. + ## Docker **Compose:** `/mnt/RED_2TB/docker/arr/docker-compose.yml` @@ -63,6 +78,17 @@ Caddy: subdomain-based роутинг, без URL Base. Let's Encrypt автом | transmission | transmission_default + **media_net** (подключён вручную) | | vless-proxy | hermes_taiga_net + **media_net** (подключён вручную) | +> ✅ **ПОПРАВКА 2026-09-26 (проверено на живой машине):** строка про `vless-proxy` в `media_net` +> **НЕВЕРНА.** Факт: `docker inspect vless-proxy` → только `hermes_taiga_net` (172.16.15.2). +> `docker network inspect media_net` → участники `prowlarr radarr transmission sonarr` +> (vless-proxy отсутствует). `docker exec prowlarr getent hosts vless-proxy` → NO DNS. +> Следствие: прокси-маршрут для индексеров, описанный в §«Prowlarr — прокси», **никогда не работал**. +> План починки — [[personal/plans/lidarr-taiga-and-indexer-unblock]] Фаза 0. +> +> ⚠️ **ПОПРАВКА PUID/PGID:** `921/921` устарело (см. строку выше про PUID 921 — артефакт до +> restore-инцидента). Факт 2026-09-26: **все сервисы стека под uid 950**, `PUID=950 PGID=950` +> в compose. `921` — старый uid transmission, не используется. + `media_net` — внешняя сеть, создана вручную: `docker network create media_net` ## Хранилище @@ -102,16 +128,69 @@ Caddy: subdomain-based роутинг, без URL Base. Let's Encrypt автом Получить полный ключ: `docker exec grep ApiKey /config/config.xml` Jellyfin token создан вручную через sqlite — хранится в `/mnt/RED_2TB/docker/arr/jellyfin/data/data/jellyfin.db`. -## Remote Path Mapping (Radarr + Sonarr) +## Remote Path Mapping (Radarr + Sonarr) — ⚠️ НЕ ПРИМЕНЁН, health жалуется Transmission монтирует `/mnt/RED_2TB/storage/` → `/mnt/storage/` Radarr/Sonarr монтируют `/mnt/RED_2TB/storage/` → `/storage/` -Маппинг в каждом: +> 🔴 **ФАКТ 2026-09-26: этого маппинга в API Radarr/Sonarr НЕТ.** Health обоих даёт: +> ``` +> RemotePathMappingCheck error +> "download client Transmission places downloads in /storage/Downloads/radarr +> but this directory does not appear to exist inside the container" +> ``` +> +> **Фактическая причина (опровергает предположение ниже):** Transmission **не раскладывает** по +> `Downloads/radarr` — download-dir плоский: +> ```json +> {"download-dir": "/mnt/storage/Downloads", +> "incomplete-dir": "/mnt/storage/Downloads/transmission/incomplete", +> "script-torrent-done-enabled": false, "rpc-url": "/transmission/", +> "rpc-whitelist": "172.16.*.*"} +> ``` +> Radarr ОЖИДАЕТ подкаталог категории (`/storage/Downloads/radarr`) — его нет. +> Разбирать в Фазе 4 плана [[personal/plans/lidarr-taiga-and-indexer-unblock]]. + +Предполагаемый маппинг в каждом (задумано, но не выставлено): - host: `transmission` - remotePath: `/mnt/storage/Downloads/` - localPath: `/storage/Downloads/` +## 🔴 Индексеры НЕ РАБОТАЮТ: DNS-фильтр провайдера (найдено 2026-09-26) + +**Все 6 индексеров в карантине (`disabledTill` = +24 ч), `initialFailure = 2026-05-20`** +(дата первоначального деплоя) → **не работали ни одного дня.** + +``` +GET /api/v1/health (prowlarr) → + "Indexers unavailable due to failures for more than 6 hours: + RuTracker, RuTor, NoNaMe Club, Kinozal, Kinozal (M)" +``` + +**Корень — NXDOMAIN на трекеры, и с роутера, и с 8.8.8.8:** + +```bash +nslookup rutracker.org 192.168.2.2 # роутер → NXDOMAIN +nslookup rutracker.org 8.8.8.8 # Google → NXDOMAIN +nslookup google.com 192.168.2.2 # → OK +``` + +| Домен | DNS | +|---|---| +| `rutracker.org` | ❌ NXDOMAIN | +| `rutor.info` | ❌ NXDOMAIN | +| `kinozal.tv` | ❌ NXDOMAIN | +| `nnmclub.to` | ❌ NXDOMAIN | +| `byrutgame.org` | ✅ 185.200.198.230 | +| `google.com` | ✅ | + +> Это **не Pi-hole и не роутер** (8.8.8.8 тоже NXDOMAIN) — блок на стороне аплинка Тайги. +> Это **другой** класс, чем задокументированные «Cloudflare 403 на indexers.prowlarr.com» +> и «RuTracker Turnstile»: здесь DNS не отдаёт IP вообще. + +Прокси для обхода описан в §«Prowlarr — прокси», но **не работает** (см. поправку о сетях выше). +Полный план — [[personal/plans/lidarr-taiga-and-indexer-unblock]] Фаза 0. + ## Prowlarr — прокси для заблокированных индексеров vless-proxy доступен в `media_net` как `vless-proxy:1080` (SOCKS5). @@ -189,8 +268,32 @@ ssh truenas_admin@mallexxx.duckdns.org "python3 /mnt/RED_2TB/docker/arr/media-pi - Jellyfin 10.11: `name` в POST `/Library/VirtualFolders` должен быть в **query string** (`?name=Movies&collectionType=movies`), не в body - Transmission whitelist задаётся через env var `WHITELIST` в compose — settings.json перезаписывается при старте - Transmission compose location: `/mnt/RED_2TB/docker/transmission/docker-compose.yml` -- На Тайге нет `curl` и `python3` в PATH хоста (zsh) — только внутри контейнеров. Скрипты запускать через `docker exec` или python3-файлами через scp +- ⚠️ **УТОЧНЕНО 2026-09-26: `python3` на хосте Тайги ЕСТЬ** (использовался для разбора JSON). + Не хватает **`curl`** и **`sqlite3`**. Рабочий паттерн API-вызовов — **`wget` внутри контейнера + + хостовый `python3` для разбора**: + ```bash + ssh truenas_admin@mallexxx.duckdns.org \ + "docker exec prowlarr sh -c 'wget -qO- --header=\"X-Api-Key: \" http://localhost:9696/api/v1/health'" + ``` + busybox-`wget` умеет только `-qO-` / `--header` / `--timeout`; **`-e use_proxy=yes` НЕ поддерживает + (GNU-опция)** → прокси-тесты внутри контейнера этим способом невозможны. +- ⚠️ **Shell-экранирование JSON через ssh** — кавычки в `--header` ломаются на нескольких уровнях. + Рабочий приём: писать результат **в файл** внутри контейнера/на хосте, разбирать отдельно. +- ⚠️ **`/etc/resolv.conf` контейнеров** = `nameserver 127.0.0.11` (Docker embedded DNS) → + в контейнерах нет `getent`; для проверки DNS использовать `nslookup`/`wget`. ## История - **2026-05-20** — первоначальный деплой +- **2026-09-26** — разведка под задачу «Lidarr + музыка + синк с Jellyfin». Стек жив, но + **индексеры не работают с дня деплоя** (DNS-фильтр провайдера: NXDOMAIN на rutracker.org / + rutor.info / kinozal.tv / nnmclub.to с 8.8.8.8 и роутера; `byrutgame.org` резолвится). + Обнаружено, что **vless-proxy НЕ подключён к media_net** — прокси-обход никогда не работал. + План и 2 открытых вопроса — [[personal/plans/lidarr-taiga-and-indexer-unblock]]. Изменений нет. + +## Связанные заметки + +- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ **активный план 2026-09-26:** Lidarr на Тайге + разблокировка индексеров (DNS-фильтр провайдера) +- [[personal/tech/music-tags-repair-truenas]] — ремонт 7906 битых тегов (блокирует Music-библиотеку) +- [[family/how-to/jellyfin-config]] — живой инстанс Jellyfin на Тайге +- [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] — NFSv4 ACL и uid 950 diff --git a/personal/plans/lidarr-taiga-and-indexer-unblock.md b/personal/plans/lidarr-taiga-and-indexer-unblock.md new file mode 100644 index 00000000..323d5016 --- /dev/null +++ b/personal/plans/lidarr-taiga-and-indexer-unblock.md @@ -0,0 +1,326 @@ +--- +title: Lidarr на Тайге + разблокировка индексеров — план +created: '2026-09-26' +updated: '2026-09-26' +type: plan +namespace: personal +status: awaiting-approval +tags: + - lidarr + - taiga + - truenas + - arr + - music + - dns + - prowlarr + - blocked +related: + - '[[family/projects/media-toolbox-taiga]]' + - '[[family/how-to/jellyfin-config]]' + - '[[personal/tech/music-tags-repair-truenas]]' + - '[[personal/tech/truenas-nfs4-acl-and-arrmultiuser]]' +--- +# Lidarr на Тайге + разблокировка индексеров — план + +> **Статус: ПЛАН СОСТАВЛЕН, ЖДЁТ ОТВЕТОВ АЛЕКСА на 2 вопроса. НИЧЕГО НЕ ТРОНУТО.** +> Задача поставлена 2026-09-26: «поставить lidarr в дополнение к sonarr/prowlarr, настроить на музыку, +> синк с jellyfin, проверка что весь стек живой». +> Разведка выполнена, найдены 2 блокера, план ниже. + +## 🔴 ГЛАВНАЯ НАХОДКА СЕССИИ: DNS-блок у провайдера Тайги + +**Стек НЕ сломан. Индексеры мертвы из-за внешней блокировки на стороне Тайги.** + +Диагностика (2026-09-26, все команды с живой машины): + +```bash +# Из контейнера prowlarr: +docker exec prowlarr sh -c "wget -qO- --timeout=12 -S 'https://rutracker.org/'" +# → wget: bad address 'rutracker.org' +docker exec prowlarr sh -c "wget -qO- --timeout=12 -S 'https://byrutgame.org/'" +# → HTTP/1.1 200 OK ← этот резолвится +``` + +```bash +# На хосте TrueNAS, ДВА разных резолвера: +nslookup rutracker.org 192.168.2.2 # роутер → NXDOMAIN +nslookup rutracker.org 8.8.8.8 # Google → NXDOMAIN +nslookup google.com 192.168.2.2 # → OK (142.250.181.238) +``` + +**Вывод:** NXDOMAIN приходит **и с роутера, и с 8.8.8.8** → это **не Pi-hole и не роутер**. +Блок на стороне аплинка Тайги (провайдер Ростелеком / региональный DNS-фильтр). + +**Что НЕ резолвится (все 4 трекера):** `rutracker.org`, `rutor.info`, `kinozal.tv`, `nnmclub.to` +**Что резолвится:** `byrutgame.org` (185.200.198.230), `google.com` + +> ⚠️ Это **другой** класс проблемы, чем задокументированные ранее «Cloudflare 403 на +> `indexers.prowlarr.com`» и «RuTracker Cloudflare Turnstile». Здесь **DNS не отдаёт IP вообще** — +> до Cloudflare/TLS дело не доходит. + +### Следствие в Prowlarr + +``` +GET /api/v1/health → + "Indexers unavailable due to failures for more than 6 hours: + RuTracker, RuTor, NoNaMe Club, Kinozal, Kinozal (M)" + +GET /api/v1/indexerstatus → 5 записей, у всех: + disabledTill = "2026-09-27T08:07:26Z" (сутки карантина) + initialFailure = "2026-05-20T05:4x:xx" ← ЛОМАЕТСЯ С ДНЯ ДЕПЛОЯ, не «сейчас» +``` + +> 🔑 **`initialFailure` = 2026-05-20** — дата первоначального деплоя стека. +> Значит индексеры через Prowlarr на Тайге **не работали ни одного дня**. Это не регресс. + +В Radarr/Sonarr это даёт каскад: +``` +IndexerLongTermStatusCheck error All indexers are unavailable due to failures for more than 6 hours +IndexerRssCheck warning All rss-capable indexers are temporarily unavailable +IndexerSearchCheck warning All search-capable indexers are temporarily unavailable +``` + +## 🔴 БЛОКЕР 2: vless-proxy НЕ виден из media_net + +Задокументировано в `media-toolbox-taiga.md`: «vless-proxy доступен в `media_net` как +`vless-proxy:1080` (SOCKS5)». **Факт 2026-09-26 — это НЕ ТАК:** + +```bash +docker inspect vless-proxy --format '{{range $n,$c := .NetworkSettings.Networks}}{{$n}} {{$c.IPAddress}}{{end}}' +# hermes_taiga_net 172.16.15.2 ← ТОЛЬКО одна сеть +docker exec prowlarr getent hosts vless-proxy +# NO DNS +``` + +`docker network inspect media_net` → участники: `prowlarr radarr transmission sonarr` +(**vless-proxy отсутствует**). + +**Вывод:** прокси-маршрут для заблокированных индексеров, описанный в доке, **никогда не работал** — +не был реализован. При этом `docker exec prowlarr getent hosts xray-admin` → `172.16.1.9` (работает, +обе в `caddy_default`). + +## Фактическое состояние стека (2026-09-26) + +Всё проверено на живой машине. **Стек работает**, кроме индексеров. + +| Сервис | Статус | UID | Порты | Сети | +|---|---|---|---|---| +| prowlarr | Up 3d | 950 | 9696 | media_net + caddy_default | +| radarr | Up 3d | 950 | 7878 | media_net + caddy_default | +| sonarr | Up 3d | 950 | 8989 | media_net + caddy_default | +| jellyfin | Up 7d | 950 | 8096 | caddy_default | +| transmission | Up 7d | 950 | 9091, 51413 | media_net + transmission_default | +| caddy | Up 3d | — | — | caddy_default | + +Проект compose: `arr` (все 4 в `media_net` + `caddy_default`). `media_net` существует. + +### Compose (актуальный, `/mnt/RED_2TB/docker/arr/docker-compose.yml`) + +Все сервисы: `PUID=950 PGID=950 TZ=Asia/Novosibirsk`, `dns: [8.8.8.8, 8.8.4.4]`. +radarr/sonarr монтируют `/mnt/RED_2TB/storage:/storage`; jellyfin — `:ro`; prowlarr — только `/config`. +**У prowlarr НЕТ монтирования `/storage`.** Порты проброшены (`ports:`) — можно обращаться к API с хоста. + +### Индексеры Prowlarr (все 6, `enable=true`) + +| id | Name | definitionName | URL | +|---|---|---|---| +| 1 | RuTracker | `RuTracker.org` | rutracker.org | +| 2 | RuTor | `rutor` | rutor.info | +| 3 | Byrutor | `byrutor` | byrutgame.org ← **единственный живой DNS** | +| 4 | NoNaMe Club | `noname-club` | nnmclub.to | +| 5 | Kinozal | `kinozal` | kinozal.tv | +| 6 | Kinozal (M) | `kinozal-magnet` | kinozal.tv | + +### Applications Prowlarr + +| id | Name | syncLevel | baseUrl | +|---|---|---|---| +| 1 | Radarr | `fullSync` | `http://radarr:7878` | +| 2 | Sonarr | `fullSync` | `http://sonarr:8989` | + +### Radarr — практические факты + +- Root folder: `/storage/radarr` (id 1, accessible) +- Download client: `Transmission` (id 1, enable=true) +- Индексеров **5** (Byrutor не синкается — нет RSS): + `Kinozal (M)`, `Kinozal`, `NoNaMe Club`, `RuTor`, `RuTracker` +- ⚠️ **БАГ Prowlarr-синка:** baseUrl индексеров = `http://prowlarr:9696/6/` — + **БЕЗ `/prowlarr` urlBase**. Прямая проверка: + `docker exec radarr wget -qO- "http://prowlarr:9696/6/api?t=caps"` → **401 Unauthorized** + Ожидалось `http://prowlarr:9696/prowlarr/6/`. См. skill `arr-media-stack-setup` + §«Корень проблемы короткий URL в синхронизации индексеров». + ⚠️ Но у Тайги `` у prowlarr — **пустой** (`config.xml`), т.е. на этом хосте + форма `9696/6/` может быть и корректной. **Разобрать перед фиксом** — не менять вслепую. + +### Ключи API (полные, сняты с живой машины) + +| Сервис | Полный ключ | +|---|---| +| Prowlarr | `35c8b3f497114076a6150ea0d9504845` | +| Radarr | `51e201f2d61b4fe2a0c322d5e99349fe` | +| Sonarr | `b1eb9cdd5c804e6c956dc9c8bd305dc8` | +| Jellyfin | `eaglesetup2026taiga` | + +### Питфолл: на Тайге нет curl И НЕТ python3 на хосте + +Ранее задокументировано «нет curl и python3 в PATH хоста». **Уточнение 2026-09-26:** +`python3` **есть** — использовался для парсинга JSON (`python3 -c 'import json...'`). +Нет **`curl`** и **нет `sqlite3`** на хосте (sqlite3 — подтверждено в `jellyfin-config`). + +**Рабочий паттерн для API-вызовов на Тайге:** `wget` **внутри контейнера** + `python3` на хосте для разбора: + +```bash +# JSON забираем wget-ом ИЗ КОНТЕЙНЕРА (busybox wget: только -qO- / --header / --timeout) +ssh truenas_admin@mallexxx.duckdns.org \ + "docker exec prowlarr sh -c 'wget -qO- --header=\"X-Api-Key: \" http://localhost:9696/api/v1/health'" +# ↓ или в файл, затем разбор хостовым python3 +ssh truenas_admin@... "docker exec prowlarr sh -c 'wget -qO- ... > /tmp/x.json'" +python3 -c 'import json; d=json.load(open("/tmp/x.json")); ...' +``` + +> ⚠️ **busybox wget НЕ поддерживает `-e use_proxy=yes`** (это GNU-опция). Для прокси-тестов внутри +> контейнеров нужен другой инструмент (в linuxserver-образах есть `curl`? — проверить) или +> тестировать с хоста. Проверено: `wget: unrecognized option: e`. + +### Питфолл: shell-экранирование при выкачивании JSON через ssh + +Кавычки в `--header="X-Api-Key: $K"` ломаются на нескольких уровнях ssh/sh. Рабочий приём — +**положить результат в файл внутри контейнера или на хосте**, потом разбирать отдельно. +`jq` с дефисами в ключах (`download-dir`) требует `.["download-dir"]`, не `.download-dir`. + +### Питфолл: `/etc/resolv.conf` контейнеров + +``` +nameserver 127.0.0.11 ← Docker embedded DNS +search local +options ndots:0 +``` +Поэтому в контейнерах **нет `getent`** — использовать `nslookup`/`wget` для проверки DNS. +Хостовый `resolv.conf`: `domain local` + `nameserver 192.168.2.2`. + +## RemotePathMapping — существующая ошибка (состояние 2026-09-26) + +Transmission download-dir (факт): +```json +{"download-dir": "/mnt/storage/Downloads", + "incomplete-dir": "/mnt/storage/Downloads/transmission/incomplete", + "script-torrent-done-enabled": false, + "script-torrent-done-filename": "", + "rpc-whitelist": "172.16.*.*", + "rpc-url": "/transmission/"} +``` + +Radarr/Sonarr health: +``` +RemotePathMappingCheck error + "download client Transmission places downloads in /storage/Downloads/radarr + but this directory does not appear to exist inside the container" +``` + +> 🔑 **Фактическая причина (важно, опровергает старую доку):** Transmission **не раскладывает** +> по `Downloads/radarr` — download-dir плоский `/mnt/storage/Downloads`. Radarr ОЖИДАЕТ +> подкаталог категории (`/storage/Downloads/radarr`), которого нет. +> +> **Задокументированный в `media-toolbox-taiga.md` маппинг `host=transmission`, +> `remotePath=/mnt/storage/Downloads/`, `localPath=/storage/Downloads/` — НЕ ПРИМЕНЁН** +> (в API Radarr/Sonarr записей remotepathmapping нет, health жалуется). +> +> **Второй слой:** Transmission монтирует `/mnt/storage`, radarr — `/storage`. Один и тот же +> хост-путь под двумя именами. Prowlarr/radarr-контейнеры **не видят `/mnt/storage`**. + +## ПЛАН + +### Фаза 0 — внешняя блокировка (БЛОКЕР для всего остального) + +1. Подключить `vless-proxy` к `media_net`: + `docker network connect media_net vless-proxy` (runtime) + добавить сеть в compose + `/mnt/RED_2TB/docker/vless-proxy/docker-compose.yml` (иначе потеряется при пересоздании). +2. Проверить из prowlarr: `getent`/`nslookup vless-proxy`, затем доступ до `rutracker.org` + **через прокси** (SOCKS5 `vless-proxy:1080`). +3. Если через прокси резолвится — создать Proxy в Prowlarr (Settings → Indexers → Add Proxy, + SOCKS5, host `vless-proxy`, порт `1080`, тег `proxy`) и повесить тег `proxy` на + RuTracker / RuTor / Kinozal / NoNaMe. +4. Сбросить `indexerstatus`: `POST /api/v1/indexer/testall` (снимает `disabledTill`). +5. **ПРИЁМКА ALEX:** `https://prowlarr.mallexxx.duckdns.org` → Indexers → Test All → зелёные. + +> ⚠️ Byrutor (id 3) резолвится — его прокси не нужен, но в Radarr он не синкается (нет RSS). +> Он полезен только в Sonarr/Radarr с `enableRss: false` — применимо и к Lidarr. + +### Фаза 1 — Lidarr контейнер + +1. **Бэкап** `/mnt/RED_2TB/docker/arr/docker-compose.yml` → `~truenas_admin/` (не в + `/mnt/RED_2TB/backup` — он root-owned, truenas_admin туда не пишет). +2. Добавить сервис `lidarr` по образцу `radarr`: + - image `lscr.io/linuxserver/lidarr:latest` + - `PUID=950 PGID=950 TZ=Asia/Novosibirsk`, `dns: [8.8.8.8, 8.8.4.4]` + - port `8686:8686` + - volumes: `/mnt/RED_2TB/docker/arr/lidarr:/config`, `/mnt/RED_2TB/storage:/storage` + - networks: `media_net` + `caddy_default` +3. Поднять **из правильной папки**: `cd /mnt/RED_2TB/docker/arr && docker compose up -d lidarr` + (не через временную копию compose — name-conflict). +4. Caddy: добавить блок `lidarr.mallexxx.duckdns.org { reverse_proxy lidarr:8686 }`. + Caddyfile root-owned → **только через alpine-контейнер** (`docker run --rm -i -v /:/host:rw alpine ...`, + см. skill `truenas-caddy-service-deploy`). Отправлять **весь файл**, не патч. +5. **ПРИЁМКА ALEX:** `https://lidarr.mallexxx.duckdns.org` открывается. + +### Фаза 2 — Lidarr на музыку + +1. Root folder — **РЕШЕНИЕ АЛЕКСА НУЖНО** (см. вопросы ниже). +2. Download client — Transmission: host `transmission`, port `9091`, urlBase `/transmission/`, + category `lidarr`. +3. Индексеры: добавить Application `Lidarr` в Prowlarr (`syncLevel: fullSync`, + `baseUrl: http://lidarr:8686`) — либо вставить Torznab вручную, если синк не пройдёт. + > ⚠️ Lidarr требует **audio-категории (3000-я серия)** в профиле индексера. Посмотреть, + > отдают ли их наши трекеры — RuTracker/Kinozal обычно да; RuTor — нет (см. skill: RuTor + > не даёт movie-категорий; для audio проверить отдельно). +4. `preferMagnetUrl: true` — применить (нет дневного лимита на .torrent). +5. Прокси-тег для заблокированных (из Фазы 0). +6. **ПРИЁМКА ALEX:** тестовый поиск артиста → релиз найден → торрент ушёл в Transmission. + +### Фаза 3 — синк с Jellyfin + +> 🔴 **ЗАБЛОКИРОВАНО.** Создавать `collectionType=music` на текущих тегах нельзя: +> 7906 файлов → `mojibake` 2759, `lost` 662 (данные уничтожены), `empty` 1026, `partial` 2920. +> Jellyfin раскладывает музыку **по тегам**, не по папкам → получится свалка `Unknown Artist`. +> Полный контекст: [[personal/tech/music-tags-repair-truenas]] — этапы 1–2 готовы (CSV v2), +> ждёт апрув Alex, правки файлов не начаты. + +1. Решить порядок (см. вопрос 2 ниже). +2. `/storage/Music` **уже смонтирован** в jellyfin (ro) — доп. монтирование НЕ нужно. +3. Создание: `POST /Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music` + (**name/paths в query string**, не в body — Jellyfin 10.11). +4. Возможный митигирующий вариант: `EnableFolderView` — навигация по папкам, теги вторичны. +5. **ПРИЁМКА ALEX:** вкладка Music → треки видны. + +### Фаза 4 — приёмка всего стека + +1. `docker ps` — все 6 (+ lidarr) Up, uid 950. +2. Radarr/Sonarr/Lidarr health — без ошибок Indexer* и RemotePathMapping. +3. Разобрать RemotePathMapping (см. раздел выше) — нужен подкаталог категории в Transmission + **или** корректный маппинг. +4. **ПРИЁМКА ALEX:** панели открываются, плейбек идёт, поиск работает. + +## ❓ ВОПРОСЫ, ЖДУЩИЕ ОТВЕТА АЛЕКСА + +1. **Куда Lidarr складывает музыку?** + - (A) отдельный staging `/storage/Music-lidarr` + router-симлинки в `Music/` + — безопасно, не трогает 7890 существующих файлов. **Рекомендую.** + - (B) прямо в `/storage/Music` с отключённым переименованием — риск конфликтов с существующей + категорийной структурой (`!Rock&Folk` и т.д.). +2. **Музыка в Jellyfin — до или после ремонта тегов?** + - Док от 2026-09-26: «сначала теги». Lidarr принесёт часть файлов с чистыми тегами, + но 7890 старых останутся битыми. + +## Открытые техвопросы (разобрать по ходу) + +- Баг «короткого URL» Prowlarr→Radarr: `http://prowlarr:9696/6/` vs `/prowlarr/6/`. + Нужно решить, корректен ли он при **пустом** `` у prowlarr. 401 на `?t=caps` — сигнал, + что что-то не так, но не однозначно. +- Битый `image.imageHeight`/пост-обработка не в scope. +- RuTor не даёт movie-категорий; для audio проверить отдельно. +- Есть ли `curl` внутри linuxserver-образов (для прокси-тестов) — проверить. + +## История + +- **2026-09-26** — разведка, найдены 2 блокера (DNS-фильтр провайдера + vless-proxy не в media_net), + план составлен, ожидает 2 ответов Alex. Ничего не изменено. diff --git a/personal/tech/skill-arr-media-stack-setup-additions.md b/personal/tech/skill-arr-media-stack-setup-additions.md new file mode 100644 index 00000000..701d46bc --- /dev/null +++ b/personal/tech/skill-arr-media-stack-setup-additions.md @@ -0,0 +1,95 @@ +--- +title: Skill — arr-media-stack-setup (дополнения 2026-09-26) +created: '2026-09-26' +updated: '2026-09-26' +type: tech +namespace: personal +tags: + - skill + - arr + - prowlarr + - dns + - truenas + - blocked + - pitfalls +related: + - '[[personal/plans/lidarr-taiga-and-indexer-unblock]]' + - '[[family/projects/media-toolbox-taiga]]' +--- +# Skill `arr-media-stack-setup` — дополнения 2026-09-26 + +> Зеркало патча скилла. Что добавлено после разведки на Тайге (задача «Lidarr + музыка + синк с Jellyfin»). +> Полный скилл: `~/.hermes/hermes-whale/skills/devops/arr-media-stack-setup/SKILL.md` + +## 1. Индексеры недоступны: DNS-фильтр провайдера (НЕ Cloudflare, НЕ Pi-hole) + +**Новый класс проблемы**, ранее не описанный в скилле. Задокументированы были только +«Cloudflare 403 на `indexers.prowlarr.com`» и «RuTracker Turnstile». Здесь **DNS не отдаёт IP вообще**. + +```bash +# InitialFailure показывает НАЧАЛО проблемы, а не «сейчас» +GET /api/v1/indexerstatus → initialFailure: "2026-05-20T05:4x:xx" ← день деплоя + → disabledTill: +24 ч карантин + +# Резолв проверять ДВУМЯ резолверами +nslookup rutracker.org 192.168.2.2 # роутер +nslookup rutracker.org 8.8.8.8 # внешний +# NXDOMAIN на ОБОИХ → фильтр на стороне аплинка/провайдера +# NXDOMAIN на роутере → Pi-hole/локальный DNS +``` + +**Быстрый чек всех индексеров** — `wget -S` на каждый домен из контейнера prowlarr: +`wget: bad address ''` = DNS-провал, `HTTP/1.1 200 OK` = домен жив. + +**Фикс:** SOCKS5-прокси, но сперва убедиться, что прокси-контейнер виден целевой сети +(`docker network inspect media_net --format '{{range .Containers}}{{.Name}} {{end}}'`). +После `docker network connect` — **добавить сеть в compose**, иначе потеряется при пересоздании. +Затем `POST /api/v1/indexer/testall` снимает `disabledTill`. + +## 2. `disabledTill` НЕ виден в Radarr/Sonarr + +`GET /api/v3/indexer` отдаёт `"status": {}` — пусто. Карантин смотреть **только** в Prowlarr +(`/api/v1/indexerstatus`, `/api/v1/health`). Не делать вывод «индексеры свободны» по Radarr. + +## 3. TrueNAS: `python3` ЕСТЬ, `curl` и `sqlite3` — НЕТ + +**Исправление распространённой ошибки в доке** («нет curl и python3»). Факт 2026-09-26: +`python3` на хосте работает (использовался для разбора JSON). Нет **`curl`** и **`sqlite3`**. + +**Рабочий паттерн API = `wget` в контейнере + хостовый `python3`:** +```bash +ssh truenas_admin@HOST \ + "docker exec prowlarr sh -c 'wget -qO- --header=\"X-Api-Key: \" http://localhost:9696/api/v1/health'" +``` + +- busybox-`wget`: только `-qO-` / `-S` / `--header` / `--timeout`. + **`-e use_proxy=yes` НЕ поддерживается** (GNU-опция) → прокси-тест изнутри linuxserver-контейнера + этим способом невозможен. +- Экранирование JSON через ssh ломается на кавычках в `--header` → надёжнее писать вывод + в файл (`> /tmp/x.json`) и разбирать отдельным вызовом. +- `jq` с дефисами: `.["download-dir"]`, не `.download-dir`. + +## 4. `/etc/resolv.conf` контейнеров = `127.0.0.11` + +Docker embedded DNS. В linuxserver-образах **нет `getent`** → использовать `nslookup`/`wget`. + +## 5. RemotePathMapping: health жалуется при «задокументированном» маппинге + +``` +RemotePathMappingCheck error + "download client Transmission places downloads in /storage/Downloads/radarr + but this directory does not appear to exist inside the container" +``` + +Проверять **фактический** download-dir, а не предполагаемый: +```bash +docker exec transmission sh -c 'cat /config/settings.json' # → "download-dir": "/mnt/storage/Downloads" +``` +Если download-dir **плоский** (без подкаталога категории) — сам маппинг не спасёт: подкаталога нет. +Плюс Transmission монтирует `/mnt/storage`, Radarr — `/storage` (один хост-путь под двумя именами). +**Всегда проверять наличие записей в API** (`GET /api/v3/remotepathmapping`), а не то, что записано в доке. + +## Связанные заметки + +- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — план, из которого выросли эти находки +- [[family/projects/media-toolbox-taiga]] — состояние стека на Тайге