Docs/docs/services/lxc203-media/navidrome.md

15 KiB
Raw Blame History

Navidrome Music Server — LXC 203 (media)

Контейнер Путь Порты Тип
media (203) /mnt/service/navidrome 45136 (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: Подготовка директорий и прав

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:

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: Запуск и первоначальная настройка

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: Установка зависимостей

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)

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). Запуск импорта через прокси:

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. Перед импортом конвертируйте:

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: Установка плагина

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 SettingsUser Token
  3. Скопируйте токен и вставьте в docker-compose.yml в переменную ND_PLUGINS_LISTENBRAINDAILYPLAYLIST_LISTENBRAINZTOKEN
  4. Перезапустите контейнер: sudo docker compose restart navidrome

Шаг 3: Включение скробблинга в клиенте (Symfonium)

Настройки → Интеграции → ListenBrainz → Включить → Вставить токен → Сохранить. Плейлист «Моя волна» появится в разделе «Плейлисты» после 5-10 прослушанных треков и автоматической генерации (раз в 24ч).

🎵 Плейлисты из папок (M3U-импорт)

Navidrome автоматически импортирует файлы .m3u и .m3u8, размещённые внутри музыкальной директории. Это позволяет создавать плейлисты на основе содержимого папок без ручного добавления треков.

Создание плейлиста из папки

cd /mnt/audio/music/Сборники/savedtracks
find . -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.m4a" \) -printf '%P\n' | sort > savedtracks.m3u

Что делает команда:

  • find . -type f — рекурсивный поиск файлов
  • \( -iname "*.mp3" -o ... \) — фильтрация по аудио-расширениям
  • -printf '%P\n' — вывод относительных путей (без ./, как требует Navidrome)
  • sort — сортировка по имени для фиксированного порядка треков
  • > savedtracks.m3u — сохранение в файл плейлиста

Применение изменений

После создания или обновления M3U-файла запустите сканирование библиотеки:

curl -k -s "https://music.zailon.ru/rest/startScan?u=zailon&p=13qeadZC&v=1.16.1&c=curl"

Или через веб-интерфейс: Настройки → Библиотека → Пересканировать.

Проверка результата

curl -k -s "https://music.zailon.ru/rest/getPlaylists?u=zailon&p=13qeadZC&v=1.16.1&c=curl" | grep -i savedtracks

Ожидаемый вывод:

<playlist name="savedtracks" songCount="692" .../>

Плейлист появится в веб-интерфейсе и в подключённых клиентах (Symfonium, Substreamer) после синхронизации.

Требования к путям в M3U

Правильно (относительные пути):

001. Эдита Пьеха - Песня остаётся с человеком (1965).mp3
002. Муслим Магомаев - Лучший город Земли (1965).mp3

Неправильно (абсолютные пути — Navidrome не сопоставит):

/mnt/audio/music/Сборники/savedtracks/001. Эдита Пьеха....mp3

Используйте -printf '%P\n' в find, чтобы гарантировать правильный формат.

Переименование плейлиста

Имя плейлиста в Navidrome соответствует имени файла .m3u. Чтобы изменить название:

mv /mnt/audio/music/Сборники/savedtracks/savedtracks.m3u /mnt/audio/music/Сборники/savedtracks/Избранное.m3u
curl -k -s "https://music.zailon.ru/rest/startScan?u=zailon&p=13qeadZC&v=1.16.1&c=curl"

После сканирования плейлист будет называться «Избранное».

📱 Подключение Android-клиента (Symfonium)

  1. Установите Symfonium из Google Play / F-Droid
  2. Настройки → Аккаунты → Добавить → Subsonic
  3. Заполните: URL: https://music.вашдомен.ru Логин/Пароль: от Navidrome SSL/HTTPS: Включить Транскодинг: Выключить
  4. Нажмите «Проверить подключение» → «Сохранить»
  5. Включите скробблинг в разделе Интеграции (см. выше)

Полезные команды

Управление контейнером

sudo docker compose up -d          # Запуск
sudo docker compose down           # Остановка
sudo docker compose logs -f        # Логи в реальном времени
sudo docker exec navidrome /navidrome --rescan  # Принудительное сканирование

Работа с beets

beet import -q /mnt/audio/          # Тихий импорт всей библиотеки
beet ls -f '$albumartist/$album/$title' | head -20  # Просмотр структуры в БД
beet remove -d 'album:"Название"'   # Удалить из БД (файлы останутся)
beet update                         # Обновить БД при изменении тегов на диске

Миграция и бэкап

# Создание архива для переноса
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

cd /mnt/service/navidrome
sudo docker compose pull
sudo docker compose up -d
# Конфигурация и база данных сохраняются в томах, миграция происходит автоматически

Обновление плагинов

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 внутри контейнера