[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

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 14:26:54 +06:00
1 parent 9f300da7b6
commit 4ab53a2a63
6 files changed
+727 -5

No files matched your search

+13
View File
@@ -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 на запросе без токена.
## Расположение и монтирование
| Параметр | Значение |
+23 -2
View File
@@ -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)
+164
View File
@@ -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/<id>/` ✅ формат верный |
| Диск | 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]] — предыдущий опыт деплоя
+106 -3
View File
@@ -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 <svc> 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: <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
@@ -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 в синхронизации индексеров».
⚠️ Но у Тайги `<UrlBase>` у 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: <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/`.
Нужно решить, корректен ли он при **пустом** `<UrlBase>` у prowlarr. 401 на `?t=caps` — сигнал,
что что-то не так, но не однозначно.
- Битый `image.imageHeight`/пост-обработка не в scope.
- RuTor не даёт movie-категорий; для audio проверить отдельно.
- Есть ли `curl` внутри linuxserver-образов (для прокси-тестов) — проверить.
## История
- **2026-09-26** — разведка, найдены 2 блокера (DNS-фильтр провайдера + vless-proxy не в media_net),
план составлен, ожидает 2 ответов Alex. Ничего не изменено.
@@ -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 '<domain>'` = 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: <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]] — состояние стека на Тайге