Navidrome — лёгкий музыкальный сервер с веб-интерфейсом и совместимостью с Subsonic API. Он не хранит вашу коллекцию в облаке и не навязывает подписку: файлы лежат на диске, база и обложки — рядом, а слушать музыку можно в браузере, на телефоне и на десктопе. Сервер нетребователен к ресурсам и хорошо работает даже на мини-ПК или Raspberry Pi.
Что умеет Navidrome
- Читает FLAC, MP3, AAC, OGG, Opus и другие форматы, берёт теги и обложки из файлов.
- Строит библиотеку по исполнителям, альбомам и жанрам, поддерживает плейлисты и избранное.
- Отдаёт поток по Subsonic API, поэтому подходит множество клиентов.
- Умеет транскодировать «тяжёлые» форматы в более совместимые на лету.
- Поддерживает несколько пользователей с отдельными плейлистами и историей.
Это не стриминговый каталог и не замена магазину. Библиотеку собирают из собственных дисков, записей и материалов, на которые у вас есть права.
Подготовка библиотеки
Порядок в каталогах экономит часы разбора. Простая схема Исполнитель/Альбом/Номер - Название.flac понятна и серверу, и человеку. Теги важнее имён файлов: именно из них строятся альбомы и сортировка.
sudo mkdir -p /srv/music /srv/navidrome/data
sudo chown -R 1000:1000 /srv/navidrome
sudo chmod -R a+rX /srv/music
find /srv/music -maxdepth 2 -type d | head -20
Для приведения тегов в порядок удобны MusicBrainz Picard или beets. Проверьте, что у альбома одинаковое имя исполнителя, заполнены номера треков и нет дублей с разным регистром. Если коллекция большая, первый скан займёт время; это нормально.
Docker Compose
Каталог с музыкой подключается только для чтения, данные сервера — отдельным томом. Пользователь контейнера должен иметь доступ к обоим каталогам.
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: "1000:1000"
restart: unless-stopped
ports:
- "4533:4533"
environment:
ND_SCANNER_SCHEDULE: "@every 1h"
ND_LOGLEVEL: "info"
ND_SESSIONTIMEOUT: "24h"
volumes:
- /srv/navidrome/data:/data
- /srv/music:/music:ro
Запуск и проверка журнала:
cd /opt/navidrome
docker compose up -d
docker compose logs -f --tail=100 navidrome
Интерфейс открывается на порту 4533. При первом запуске создайте администратора, затем добавьте обычных пользователей. Пароли должны быть отдельными: общий аккаунт на всю семью усложняет историю прослушивания и плейлисты.
В настройках пользователя можно запретить скачивание и загрузку файлов, отключить общий доступ и выдать права администратора. Для семьи достаточно отдельных аккаунтов с обычными правами, а администратора оставить один. Плейлисты хранятся в базе и переживают пересканирование, если треки остаются на месте.
Файл конфигурации
Параметры можно задавать переменными окружения или файлом navidrome.toml. Второй вариант удобнее для версионирования. Ключи чувствительны к регистру.
MusicFolder = "/music"
DataFolder = "/data"
Port = 4533
Address = "0.0.0.0"
Scanner.Schedule = "@every 1h"
SessionTimeout = "24h"
Transcoding.MaxConcurrent = 2
TranscodingCacheSize = "200MiB"
ImageCacheSize = "100MiB"
DefaultTheme = "Dark"
Если файл лежит в /data/navidrome.toml, контейнер подхватит его при старте. Переменные ND_* имеют приоритет над файлом, поэтому не задавайте одно и то же в двух местах. Для сервера за обратным прокси пригодится BaseURL, если приложение размещено в подкаталоге.
Сканирование и клиенты
Первый скан запускается автоматически. Повторный можно инициировать из интерфейса или командой внутри контейнера.
docker compose exec navidrome navidrome scan
docker compose logs --tail=50 navidrome | grep -i scan
curl -s http://127.0.0.1:4533/ping
Клиенты подключаются по адресу сервера, логину и паролю. На Android и iOS популярны substreamer и play:Sub, на десктопе — Feishin и Sonixd, в браузере работает собственный интерфейс. В настройках клиента указывайте http://сервер:4533 без лишнего пути, а при использовании HTTPS — домен из сертификата.
Если альбомы «развалились» на отдельные треки, проверьте теги альбома и исполнителя. Если обложек нет, добавьте cover.jpg в каталог альбома или встройте изображение в теги.
Обратный прокси и HTTPS
Для доступа через домен поставьте nginx. Важно отключить буферизацию, иначе перемотка и потоковое воспроизведение будут тормозить.
server {
listen 443 ssl;
server_name music.example.ru;
location / {
proxy_pass http://127.0.0.1:4533;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_read_timeout 600s;
client_max_body_size 0;
}
}
Сертификат удобно получать через certbot. Не открывайте порт 4533 в интернет напрямую: прокси добавляет TLS и позволяет ограничить доступ по сети. После смены схемы обновите адрес в клиентах, иначе они будут обращаться к старому порту.
Транскодирование
FLAC на мобильном интернете расходует трафик. Navidrome может отдавать MP3 или Opus на лету, если в контейнере есть ffmpeg. Качество задаётся в профиле клиента, а кэш ограничивается параметром TranscodingCacheSize.
docker compose exec navidrome ffmpeg -version
docker stats --no-stream navidrome
du -sh /srv/navidrome/data/cache
Если транскодирование не работает, проверьте, что ffmpeg установлен в образе и что клиент запрашивает поддерживаемый формат. Для локальной сети проще включить прямое воспроизведение: качество выше, нагрузка на CPU ниже.
Мобильные клиенты умеют кэшировать треки для прослушивания без сети. Учитывайте, что кэш занимает место на телефоне, а при смене адреса сервера его иногда приходится очищать. Для экономии трафика включите транскодирование в настройках клиента, но не в самом сервере по умолчанию: прямое воспроизведение в локальной сети качественнее.
Типичные проблемы
- Порт 4533 занят — измените публикацию или остановите конфликтующий сервис.
- Пустая библиотека — проверьте, что каталог смонтирован и доступен пользователю 1000.
- Обложки не видны — встройте изображение в теги или положите cover.jpg рядом с треками.
- Клиент не подключается по HTTPS — сертификат должен быть доверенным, а домен совпадать.
Резервное копирование и обновление
База SQLite и настройки лежат в /data. Копировать файл базы на работающем сервере рискованно; используйте .backup или остановите контейнер на время архивации.
docker compose stop navidrome
sqlite3 /srv/navidrome/data/navidrome.db ".backup '/backup/navidrome.db'"
sudo tar -czf /backup/navidrome-$(date +%F).tar.gz -C /srv/navidrome data
docker compose start navidrome
Музыку отдельно архивировать не обязательно, если она уже лежит на защищённом массиве, но каталог data с пользователями и плейлистами нужен обязательно. Утилита sqlite3 ставится отдельным пакетом. Перед обновлением образа сделайте копию и прочитайте примечания к релизу; откат к предыдущему тегу возможен, но базу лучше сохранить: миграции схемы могут быть необратимыми.
Итог
Navidrome даёт домашней коллекции удобный веб-интерфейс и доступ с любых устройств без облачной зависимости. Секрет стабильной работы прост: аккуратные теги, отдельный каталог данных, резервные копии и обратный прокси с TLS. Начните с одной папки и проверьте сканирование, а затем добавляйте остальную библиотеку.