Добавить docs/services/lxc203-media/navidrome.md

This commit is contained in:
zailon 2026-05-13 21:17:36 +05:00
parent 2e3f4721c1
commit c28a4d1fb9

View File

@ -0,0 +1,229 @@
# Navidrome Music Server — LXC 203 (media)
Контейнер: `media` (203) | Путь: `/mnt/service/navidrome` | Порты: `4533` (Web/API) | Тип: Self-hosted Subsonic-сервер + автоматическая разметка метаданных
## 📋 Описание
Лёгкий, быстрый и современный музыкальный сервер с полной поддержкой Subsonic API. Включает автоматическую нормализацию метаданных через `beets` + MusicBrainz, обход блокировок через Xray-туннель, исправление кодировки кириллицы и умные плейлисты через ListenBrainz.
Особенности:
✅ Полная локализация: интерфейс на русском языке (98%+ перевод)
✅ Автоматическая разметка: `beets` + MusicBrainz для идеальных тегов и обложек
✅ Обход блокировок: локальный SOCKS5-туннель через VPS для доступа к MusicBrainz
✅ Кириллица: автоматическая конвертация тегов из CP1251 в UTF-8
✅ Умные плейлисты: плагин ListenBrainz Daily Playlist («Моя волна»)
✅ Клиенты: полная поддержка Subsonic-клиентов (Symfonium, Substreamer, Ultrasonic)
## 🗂️ Структура файлов
/mnt/service/navidrome/
── docker-compose.yml # Конфиг запуска сервера
├── data/ # База данных, настройки, кэш Navidrome
├── plugins/ # Директория для плагинов (.ndp)
└── navidrome.tar # Архив для миграции между контейнерами
/mnt/audio/ # Точка монтирования музыкальной библиотеки
## ⚙️ Установка и настройка
### Шаг 1: Подготовка директорий и прав
```bash
sudo mkdir -p /mnt/service/navidrome/{data,plugins}
sudo chown -R 1000:1000 /mnt/service/navidrome/data /mnt/service/navidrome/plugins
sudo chmod -R a+rX /mnt/audio
```
### Шаг 2: Конфигурация Docker Compose
Создайте файл `/mnt/service/navidrome/docker-compose.yml`:
```yaml
version: "3.8"
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: "1000:1000"
ports:
- "4533:4533"
volumes:
- ./data:/data
- /mnt/audio:/music:ro
- ./plugins:/plugins:ro
environment:
- TZ=Asia/Yekaterinburg
- ND_MUSICFOLDER=/music
- ND_DATAFOLDER=/data
- ND_PORT=4533
- ND_LOGLEVEL=info
- ND_DEFAULTLANGUAGE=ru
# Система плагинов
- ND_PLUGINS_ENABLED=true
- ND_PLUGINS_FOLDER=/plugins
- ND_PLUGINS_AUTORELOAD=false
- ND_PLUGINS_LOGLEVEL=info
- ND_PLUGINS_CACHESIZE=200MB
# Плагин ListenBrainz Daily Playlist
- ND_PLUGINS_LISTENBRAINDAILYPLAYLIST_LISTENBRAINZTOKEN=ВАШ_ТОКЕН_ЗДЕСЬ
- ND_PLUGINS_LISTENBRAINDAILYPLAYLIST_PLAYLISTNAME=Моя волна
- ND_PLUGINS_LISTENBRAINDAILYPLAYLIST_MAXTRACKS=50
restart: unless-stopped
security_opt:
- no-new-privileges:true
```
### Шаг 3: Запуск и первоначальная настройка
```bash
cd /mnt/service/navidrome
sudo docker compose up -d
sudo docker compose logs -f --tail=20
```
Ожидаемый вывод: `INFO Starting HTTP server on :4533`.
Откройте `http://<IP>:4533`, создайте учётную запись администратора. Сервер автоматически просканирует `/mnt/audio`.
## Автоматическая разметка метаданных (beets + MusicBrainz)
Серверы не исправляют теги автоматически. Для чистоты библиотеки используется `beets`.
### Шаг 1: Установка зависимостей
```bash
sudo apt update
sudo apt install beets python3-pylast python3-requests python3-unidecode python3-mutagen
mkdir -p ~/.config/beets
```
### Шаг 2: Конфигурация beets (`~/.config/beets/config.yaml`)
```yaml
directory: /mnt/audio/music
library: ~/.config/beets/library.db
import:
write: yes
copy: yes
move: yes
autotag: yes
group_albums: no
paths:
default: $albumartist/$album%aunique{}/$track - $title
singleton: Non-Album/$artist - $title
comp: Various Artists/$album%aunique{}/$track - $title
plugins: fetchart embedart
fetchart:
auto: yes
minwidth: 500
maxwidth: 1000
enforce_ratio: yes
sources: [filesystem, coverart, itunes, amazon]
embedart:
auto: yes
compare_threshold: 0
ifempty: no
```
### Шаг 3: Обход блокировок MusicBrainz (Xray-туннель)
Если MusicBrainz недоступен из вашей сети, поднимите локальный SOCKS5-прокси через Xray (см. документацию `xray-client.md`). Запуск импорта через прокси:
```bash
https_proxy=socks5h://127.0.0.1:1080 http_proxy=socks5h://127.0.0.1:1080 beet import -q /mnt/audio/НоваяПапка
```
### Шаг 4: Исправление кириллицы (CP1251 → UTF-8)
Старые сборники часто содержат теги в Windows-1251. Перед импортом конвертируйте:
```bash
find /mnt/audio/ЦелеваяПапка -type f -name "*.mp3" -print0 | xargs -0 mid3iconv -e cp1251
```
Проверка результата: `mid3v2 -l файл.mp3 | grep -E "TIT2|TPE1|TALB"`
## 🧩 Плагины и умные плейлисты
Навигроум поддерживает WASM-плагины. Для работы рекомендаций используется `listenbrainz-daily-playlist`.
### Шаг 1: Установка плагина
```bash
cd /mnt/service/navidrome/plugins
sudo curl -L -o listenbrainz-daily-playlist.ndp https://github.com/kgarner7/navidrome-listenbrainz-daily-playlist/releases/latest/download/listenbrainz-daily-playlist.ndp
sudo chown 1000:1000 listenbrainz-daily-playlist.ndp
```
Шаг 2: Получение токена ListenBrainz
1. Зарегистрируйтесь на https://listenbrainz.org
2. Перейдите в `Profile Settings``User Token`
3. Скопируйте токен и вставьте в `docker-compose.yml` в переменную `ND_PLUGINS_LISTENBRAINDAILYPLAYLIST_LISTENBRAINZTOKEN`
4. Перезапустите контейнер: `sudo docker compose restart navidrome`
### Шаг 3: Включение скробблинга в клиенте (Symfonium)
Настройки → Интеграции → ListenBrainz → Включить → Вставить токен → Сохранить.
Плейлист «Моя волна» появится в разделе «Плейлисты» после 5-10 прослушанных треков и автоматической генерации (раз в 24ч).
## 📱 Подключение Android-клиента (Symfonium)
1. Установите Symfonium из Google Play / F-Droid
2. Настройки → Аккаунты → Добавить → Subsonic
3. Заполните:
URL: `https://music.вашдомен.ru`
Логин/Пароль: от Navidrome
SSL/HTTPS: ✅ Включить
Транскодинг: ❌ Выключить
4. Нажмите «Проверить подключение» → «Сохранить»
5. Включите скробблинг в разделе Интеграции (см. выше)
## Полезные команды
### Управление контейнером
```bash
sudo docker compose up -d # Запуск
sudo docker compose down # Остановка
sudo docker compose logs -f # Логи в реальном времени
sudo docker exec navidrome /navidrome --rescan # Принудительное сканирование
```
### Работа с beets
```bash
beet import -q /mnt/audio/ # Тихий импорт всей библиотеки
beet ls -f '$albumartist/$album/$title' | head -20 # Просмотр структуры в БД
beet remove -d 'album:"Название"' # Удалить из БД (файлы останутся)
beet update # Обновить БД при изменении тегов на диске
```
### Миграция и бэкап
```bash
# Создание архива для переноса
cd /mnt/service/navidrome
sudo tar -cf navidrome.tar data docker-compose.yml plugins
# Восстановление на новом сервере
sudo tar -xf navidrome.tar
sudo chown -R 1000:1000 data plugins
```
## 🚨 Решение проблем
| Проблема | Причина | Решение |
|----------|---------|---------|
| `OCI runtime exec failed: navidrome not found` | Неверный путь к бинарнику в контейнере | Используйте `sudo docker exec navidrome /navidrome --rescan` |
| Кракозябры вместо кириллицы | Теги в CP1251 | `find /mnt/audio -name "*.mp3" -print0 \| xargs -0 mid3iconv -e cp1251` |
| `MusicBrainz not reachable` | Блокировка API или таймаут | Запускайте `beet` с `https_proxy=socks5h://127.0.0.1:1080` |
| Плагин не грузится | Ошибка в конфиге или правах | Проверьте `sudo docker compose logs navidrome \| grep plugin`, убедитесь что `.ndp` читается пользователем 1000 |
| Плейлист «Моя волна» пуст | Нет скробблов в ListenBrainz | Послушайте 5+ треков в Symfonium, проверьте ленту на listenbrainz.org, подождите 24ч |
| Навидром не видит новые файлы | Отключено автосканирование или права | `sudo chmod -R a+rX /mnt/audio`, в UI: Настройки → Библиотека → Пересканировать |
## 🔐 Безопасность
Настройки для продакшена
✅ Reverse Proxy: Всегда проксируйте порт 4533 через Nginx Proxy Manager с Let's Encrypt SSL
✅ Subsonic API: Никогда не открывайте порт 4533 напрямую в интернет. Используйте только HTTPS
✅ Xray-туннель: Прокси слушает только `127.0.0.1:1080`. Не меняйте на `0.0.0.0`
✅ Права доступа: Контейнер работает от `1000:1000` с `no-new-privileges:true`
✅ Пароли: Смените пароль администратора по умолчанию, используйте сложные токены для плагинов
✅ Резервное копирование: Регулярно архивируйте папку `data/` — в ней хранится вся история прослушиваний и плейлисты
## Обновление
### Обновление ядра Navidrome
```bash
cd /mnt/service/navidrome
sudo docker compose pull
sudo docker compose up -d
# Конфигурация и база данных сохраняются в томах, миграция происходит автоматически
```
### Обновление плагинов
```bash
cd /mnt/service/navidrome/plugins
sudo curl -L -o plugin-name.ndp <новая_ссылка>
sudo docker compose restart navidrome
```
## 💡 Рекомендации по поддержке
• Проводите `mid3iconv` для всей библиотеки один раз при первичном развёртывании
• Используйте флаг `-q` в `beet import` для больших библиотек (10k+ треков)
• Включите `ND_PLUGINS_AUTORELOAD=true` только на время отладки плагинов
• Для мониторинга используйте встроенные логи Navidrome и `htop` внутри контейнера