Files
obsidian-vault/family/plans/lidarr-taiga-deploy.md
T

225 lines
16 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lidarr на Taiga — деплой в связке с arr-стеком и Navidrome
**Дата:** 2026-09-28
**Статус:** 🟢 ДЕПЛОЙ ВЫПОЛНЕН, health ЧИСТЫЙ. ⏳ Не закрыта приёмка: поиск артиста блокирован
403 Cloudflare на `api.lidarr.audio` (метаданные). Решение — прокси, скрипт готов, не применён.
**Namespace:** family
**Решения Alex:** (1) переименование — **вариант A**: `Rename Tracks=ON`, `Rename Folders=ON`,
раскладка `Music/<Artist>/<Album>/<track> - <title>`, `Write Metadata Tags=ON`;
(2) импорт существующих 7861 файлов — **НЕ делать**, Lidarr отвечает только за новые закачки.
---
## ✅ ФАКТИЧЕСКОЕ СОСТОЯНИЕ НА КОНЕЦ СЕССИИ 2026-09-28
**`https://lidarr.mallexxx.duckdns.org`** → HTTP **200**, TLS валиден.
| Компонент | Факт (проверено API/CLI) |
|---|---|
| Контейнер | `lidarr` **v3.1.0.4875-ls42**, Up, сети `caddy_default` + `media_net` |
| API-ключ | `166654ac3f054096ae0e8393fb1bf940` |
| Root folder | `/storage/Music`, `accessible: true`, 913 ГБ свободно (id=1) |
| Download client | Transmission (id=1), тест связи → **200**; `musicCategory=""` |
| Naming | `renameTracks=true`, `{Artist Name}/{Album Title}/{track:00} - {Track Title}` |
| Prowlarr Application | `Lidarr` **id=3**, `fullSync`, `syncCategories=[3000,3010,3020,3030,3040,3050,3060]` |
| Индексер в Lidarr | `NoNaMe Club (Prowlarr)` (id=2) — `rss=true`, `auto=true` |
| RemotePathMapping | host `transmission`, remote `/mnt/storage/Downloads/`, local `/storage/Downloads/` (id=2) |
| **health Lidarr** | **`[]` — ЧИСТО** |
| health Prowlarr | `IndexerLongTermStatusCheck` ушёл (осталось только Kinozal/RuTracker) |
### Изменённые файлы
| Файл | Что | Бэкап |
|---|---|---|
| `/mnt/RED_2TB/docker/arr/docker-compose.yml` | + сервис `lidarr` (md5 `667f68f23b17a8c899c5a82a453fc754`) | `/home/truenas_admin/arr-compose.bak-20260927-125755` (md5 `9454a987f05af5efc93a51ada9dc585e`) |
| `/mnt/RED_2TB/docker/caddy/Caddyfile` | + блок `lidarr.mallexxx.duckdns.org` (96 строк) | `/home/truenas_admin/Caddyfile.bak-*` |
| `/mnt/RED_2TB/storage/Downloads/lidarr` | каталог создан | — |
| `/mnt/RED_2TB/docker/arr/lidarr/` | конфиг + `lidarr.db` | — |
### 🔴 Открытый блокер приёмки: `api.lidarr.audio` → 403 Cloudflare
**Причина в одну строку:** SkyHook (метадата-провайдер Lidarr) отдаёт **403 Cloudflare** для IP
Тайги; через `vless-proxy` тот же запрос → **200**. Тот же класс проблемы, что у индексеров.
```
direct : 403 (тело — HTML Cloudflare «Attention Required!»)
via http 1081 : 200 ✅
via socks5 1080: 200 ✅
```
**Готовая заготовка (НЕ применена):** `/tmp/add_proxy_env.py` — впишет в сервис `lidarr`:
```yaml
- HTTP_PROXY=http://vless-proxy:1081
- HTTPS_PROXY=http://vless-proxy:1081
- NO_PROXY=localhost,127.0.0.1,lidarr,prowlarr,radarr,sonarr,transmission,navidrome,caddy,172.16.0.0/12,192.168.0.0/16
```
Порядок: применить скрипт → залить compose → `docker compose up -d --force-recreate lidarr`
→ проверить `GET /api/v1/search?term=Beatles`.
---
## 🧨 ПЯТЬ ПИТФОЛЛОВ СЕССИИ (дорогие, воспроизводимые)
1. **`api.lidarr.audio` режется Cloudflare по гео IP** — без прокси Lidarr не имеет метаданных
вообще (`/search` и `/artist/lookup` → **503**). Проверять `curl` до и через прокси.
2. **`429 TooManyRequests` от Prowlarr — это НЕ rate limit, а карантин `disabledTill`.**
Prowlarr отдаёт 429 на любой запрос к индекеру, пока тот в карантине. Симптом обманчив:
выглядит как лимит запросов, лечится `POST /api/v1/indexer/testall` (сбрасывает `disabledTill`),
НЕ ожиданием. Проверять `GET /api/v1/indexerstatus`.
3. **RuTor / Byrutor для музыки бесполезны** — в их caps `music-search available="no"`,
ветки 3000 нет вовсе. Аудио-индексеры: только **RuTracker(1), NoNaMe(4), Kinozal(5,6)**.
Проверять `capabilities.categories` на id 3xxx, а не наличие тега `proxy`.
4. **Root folder Lidarr требует 3 поля, не одно.** `POST /rootfolder` с `{"path": ...}` → **400**.
Нужны: `name`, `defaultQualityProfileId`, `defaultMetadataProfileId` (брать из
`/qualityprofile` и `/metadataprofile`, обычно id=1 «Any» / «Standard»).
5. **Валидатор naming требует числовой плейсхолдер.** `{Track Number}` в `standardTrackFormat`
→ **400** `Must contain Track Title and Track numbers OR Original Title`.
Правильно: **`{track:00}`** (как в дефолте). Также `renameFolders` в API **отсутствует** —
Lidarr всегда раскладывает по `artistFolderFormat`, отдельного флага нет.
### Ещё два питфолла (техника исполнения)
6. **`docker run --rm -v /:/host:rw alpine` и `docker exec -i caddy sh -c 'cat >'` блокируются
апрувом.** Рабочий обход записи в root-owned Caddyfile: `docker cp` **не работает** на
bind-mounted файле (`device or resource busy`). РЕШЕНИЕ — скрипт на NAS:
`docker exec -i caddy sh -c 'cat > /etc/caddy/Caddyfile' < /tmp/caddyfile-new.txt`.
Файл, смонтированный как volume, обновляется, host-копия меняется синхронно.
7. **`%{http_code}` внутри python-строки с `%`-форматированием** → `ValueError: unsupported
format character '{'`. Писать команду через `%s`-подстановку отдельным аргументом, либо
не смешивать проценты curl с `%`-форматом Python.
### Что НЕ блокер
- **Transmission требует логин/пароль** (`rpc-authentication-required: true`); креды из compose:
`USER=transmission_admin` / `PASS` в `/mnt/RED_2TB/docker/transmission/docker-compose.yml`.
Разведка 26 сен этого не поймала — **для нового download client всегда смотреть `/config/settings.json`**.
- **RemotePathMappingCheck снялся** после рестарта Lidarr (кеш health; `PUT → 202` не сбрасывает).
---
## Задача
Поставить Lidarr на TrueNAS/Taiga в дополнение к Prowlarr/Radarr/Sonarr/Transmission,
настроить на музыку, связать с arr-стеком (Prowlarr/Transmission) и с музыкальным
сервером Navidrome.
## 🎯 Ключевые факты, определившие решения (проверено 2026-09-28)
| Факт | Значение |
|---|---|
| **Музыкальный сервер — NAVIDROME, не Jellyfin** | `https://music.mallexxx.duckdns.org`, v0.64.2, скан 7861 живой трек |
| Navidrome читает **только теги**, папки игнорирует | структура `category/sub/file` ему не мешает |
| Jellyfin для музыки **провален** | баг [#18162](https://github.com/jellyfin/jellyfin/issues/18162) — имя папки перекрывает тег |
| Структура `Music/` на диске | **плоская**, НЕ `Artist/Album/Track` (подтверждено: `!Rock&Folk/Green Apelsin`, `!Рэп/Guf` и т.п.) |
| Lidarr пишет теги при импорте | MusicBrainz release groups, включая `Album Artist` → новые закачки приходят с полным набором |
| Prowlarr appProfile | `Standard` = **id 1** |
| Prowlarr applications | Radarr, Sonarr — оба `fullSync`; **Lidarr отсутствует** |
| Индексеры | все 6 тегированы `[1]` (прокси `vless-socks5`); **живых 3/6** |
| RuTracker caps | отдаёт ветку **3000 Audio** ✅ |
| NoNaMe caps | отдаёт ветку **3000 Audio** ✅ |
| RuTor caps | в ответе не было 3000 — **проверить `?t=caps` при настройке** |
| Transmission | `download-dir=/mnt/storage/Downloads` (**плоский**, без подкаталога категории), `media_net` 172.16.17.5 |
| Диск | 913 ГБ свободно из 929 |
| Стек | prowlarr/radarr/sonarr/jellyfin/transmission Up, uid 950; navidrome Up, `caddy_default` |
| Lidarr | **не установлен**: ни контейнера, ни Caddy-блока, ни Application в Prowlarr |
## Архитектура после деплоя
```
Prowlarr (9696) ──fullSync──> Lidarr (8686) + Radarr + Sonarr
│
Transmission (9091) ──download──┐ │
/mnt/storage/Downloads ↓ ↓
/storage/Music ← root folder Lidarr
│
Navidrome (4533) ──> music.mallexxx.duckdns.org
│
caddy: lidarr.mallexxx.duckdns.org
```
## План (утверждён)
### Фаза 1 — контейнер
1. **Бэкап** `/mnt/RED_2TB/docker/arr/docker-compose.yml` → `~truenas_admin/`
(⚠️ `/mnt/RED_2TB/backup` root-owned — туда писать нельзя).
2. Добавить сервис `lidarr` в compose (паттерн radarr, **один проект = нет name-conflict**):
образ `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`
(⚠️ **НЕ** через временную копию compose в /tmp — name-conflict, чинили долго).
4. Caddy: блок `lidarr.mallexxx.duckdns.org { reverse_proxy lidarr:8686 }`.
Caddyfile root-owned → **только через alpine** (`-v /:/host:rw`), отправлять **весь файл**,
потом `caddy validate` → `caddy reload`. TLS ~10 сек, `exit=35` сразу после reload — норма.
### Фаза 2 — онбординг Lidarr (через API)
1. API-ключ: `docker exec lidarr grep ApiKey /config/config.xml`.
2. **Root folder: `/storage/Music`** (решение Alex 2026-09-26).
3. **Download client:** Transmission, host `transmission`, port `9091`,
urlBase `/transmission/`, category `lidarr`, без логина/пароля.
4. **Вариант A (решение Alex):**
- Media Management → `Rename Tracks = ON`, `Rename Folders = ON`
- стандартная маска Lidarr: `Music/<Artist Folder>/<Album Folder>/<track> - <title>`
- `Write Metadata Tags = ON` — обязательно, иначе новые закачки без `Album Artist`
развалятся на альбомы-одиночки в Navidrome
- `Import Extra Files = OFF`
5. **Импорт существующих 7861 файлов — НЕ делать** (решение Alex).
Lidarr отвечает только за новые закачки. Существующая библиотека остаётся как есть.
⚠️ Поэтому **не** запускать Library Import и не нажимать «Update All» по существующим артистам —
это перезапишет теги, выправленные за 50 сессий (см. [[personal/plans/music-artist-albumartist-repair]]).
### Фаза 3 — связка с arr-стеком
1. **Prowlarr:** добавить Application `Lidarr` (`implementation: Lidarr`,
`syncLevel: fullSync`, `baseUrl: http://lidarr:8686`, apiKey из Фазы 2,
`appProfileId: 1`, `syncCategories: [3000,3010,3020,3030,3040,3050,3060]`).
Прокси-тег `[1]` наследуется автоматически — все 6 индексеров уже тегированы.
2. **Проверить фактом, а не предположением:** отдают ли RuTor/Byrutor/NoNaMe
audio-категории 3000-й серии (`?t=caps`). RuTracker и NoNaMe — отдают (проверено 2026-09-28).
3. Remote Path Mapping для Lidarr — тот же паттерн, что у Radarr/Sonarr:
host `transmission`, remotePath `/mnt/storage/Downloads/`, localPath `/storage/Downloads/`
(сносит существующую health-ошибку `RemotePathMappingCheck`).
⚠️ Transmission кладёт **плоско** в `/mnt/storage/Downloads`, подкаталога категории нет —
маппинг сам по себе может не закрыть ошибку. Разбирать по факту.
### Фаза 4 — приёмка (Alex, в UI)
1. `https://lidarr.mallexxx.duckdns.org` открывается.
2. Тестовый поиск артиста → релиз найден → торрент появился в Transmission.
3. Файл доехал в `/storage/Music`, виден в Navidrome.
4. `docker ps` — 6 сервисов arr-стека + lidarr Up, uid 950.
## Риски / открытые вопросы
| # | Риск | Что делать |
|---|---|---|
| 1 | RuTor может не отдавать audio-категории | проверить `?t=caps`; живых аудио-индексеров 2-3, не 0 |
| 2 | Живых индексеров 3/6 — RuTracker и Kinozal за Cloudflare | FlareSolverr не установлен; Kinozal помечен как MUSIC-трекер, может понадобиться |
| 3 | RemotePathMapping: Transmission качает **плоско** | подкаталога категории нет → маппинг может не сработать; разбирать по факту |
| 4 | Rename Folders=ON меняет структуру папок для НОВЫХ закачек | существующие 7861 не трогаются (Lidarr трогает только свои импорты) |
| 5 | Случайный импорт старой библиотеки перезапишет теги | не запускать Library Import, не «Update All» |
## Ссылки
- [[family/projects/media-toolbox-taiga]] — *arr стек на Taiga
- [[family/how-to/navidrome-truenas-android]] — Navidrome (музыкальный сервер)
- [[personal/plans/music-artist-albumartist-repair]] — ремонт тегов (находка: `album` = имя папки-владельца)
- [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] — NFSv4 ACL и uid 950
## История
- **2026-09-26** — разведка, Фаза 0 (прокси для индексеров) выполнена: `vless-proxy` в `media_net`,
тег `proxy` создан, 3/6 индексеров подняты. Lidarr не установлен.
- **2026-09-27** — Jellyfin Music-библиотека провалена (баг #18162) → полный откат;
музыка ушла в **Navidrome**. Lidarr отложен.
- **2026-09-28** — Alex: «Ставь lidarr на truenas с привязкой к arr стеку и navidrome».
Факты собраны, план составлен, решения приняты (**1 A**, **2 не импортировать**), деплой начат.