15 KiB
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:
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: "1000:1000"
ports:
- "45136: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
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
- Зарегистрируйтесь на https://listenbrainz.org
- Перейдите в
Profile Settings→User Token - Скопируйте токен и вставьте в
docker-compose.ymlв переменнуюND_PLUGINS_LISTENBRAINDAILYPLAYLIST_LISTENBRAINZTOKEN - Перезапустите контейнер:
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)
- Установите Symfonium из Google Play / F-Droid
- Настройки → Аккаунты → Добавить → Subsonic
- Заполните:
URL:
https://music.вашдомен.ruЛогин/Пароль: от Navidrome SSL/HTTPS: ✅ Включить Транскодинг: ❌ Выключить - Нажмите «Проверить подключение» → «Сохранить»
- Включите скробблинг в разделе Интеграции (см. выше)
Полезные команды
Управление контейнером
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 внутри контейнера