Navidrome
Navidrome - частично совместимый с Subsonic API сервер потокового аудио. Позволяет без особого геморроя расшарить свою аудиоколлекцию через локальную сеть или же в интернеты. Пожалуй самый удобный вариант организации своего спотифая с Портисхэдом и Агузаровой. Имеются клиенты для мобильных устроиств, смарт-ящиков и ПК.
Запуск сервиса с бинарника
Для запуска необходим дополнительно пакет ffmpeg, скачиваем с репозитория, к примеру наш инстанс на Debian/Ubuntu
sudo apt update
sudo apt upgrade
sudo apt install ffmpeg
Далее качаем архив с бинарником с Github, предварительно уточняем версию:
wget https://github.com/navidrome/navidrome/releases/download/v0.XX.X/navidrome_0.XX.X_linux_amd64.tar.gz -O Navidrome.tar.gz
sudo tar -xvzf Navidrome.tar.gz -C /opt/navidrome/
sudo chown -R username:username /opt/navidrome
Для базового запуска нужно создать конфигфаил navidrome.toml в папке /var/lib/navidrome. В нем укажем папку где будет лежать наши аудиофайлы.
MusicFolder = "/mnt/music"
Создадим systemd-юнит для запуска сервиса в фоновом режиме:
sudo nano /etc/systemd/system/navidrome.service
Содержимое navidrome.service. Обязательно указываем пользователя от которого будет работать сервис. У пользователя должен быть доступ к папке с музыкой и конфигами.
[Unit] Description=Navidrome Music Server After=remote-fs.target network.target AssertPathExists=/var/lib/navidrome [Install] WantedBy=multi-user.target [Service] User=username Group=username Type=simple ExecStart=/opt/navidrome/navidrome --configfile "/var/lib/navidrome/navidrome.toml" WorkingDirectory=/var/lib/navidrome TimeoutStopSec=20 KillMode=process Restart=on-failure DevicePolicy=closed NoNewPrivileges=yes PrivateTmp=yes PrivateUsers=yes ProtectControlGroups=yes ProtectKernelModules=yes ProtectKernelTunables=yes RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 RestrictNamespaces=yes RestrictRealtime=yes SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap ReadWritePaths=/var/lib/navidrome # Здесь можно указать переменные окружения (ниже в статье примеры), например Environment=ND_LOGLEVEL="info"
Перезапускаем демон systemd, включаем автозапуск и запускаем Navidrome
sudo systemctl daemon-reload
sudo systemctl enable navidrome.service
sudo systemctl start navidrome.service
sudo systemctl status navidrome.service
Переходим в браузере по ip-or-fqdn:4533
Система попросит создать пароль и логин администратора. Попутно Navidrome просканирует папку на наличие аудиотреков и сформирует аудиоколлекцию.
Docker-Compose
Подразумеваем что docker-compose уже установлен.
Создаем папку rustdesk-server. Внутри папки создаем фаил docker-compose.yaml
Вписываем содержимое:
version: "3" services: navidrome: container_name: navidrome # Опционально hostname: navidrome # Опционально image: deluan/navidrome:latest user: username:username # Указываем пользователя от которого будем работать ports: - "4533:4533" # Указываем какой порт будем использовать для веб-морды и API restart: unless-stopped environment: # Optional: put your config options customization here. Examples: ND_SCANSCHEDULE: 1h # Частота сканирования папки с аудио ND_LOGLEVEL: info ND_SESSIONTIMEOUT: 24h # Сколько времени будет дейстововать сессия авторизации веб-морды volumes: - "./data:/data" # Папка с конфигурационными файлами. Создается автоматически - "./music:/music:ro" # Музыка хранится тут
В папку ./music кидаем свои треки. Обязательно назначаем права на чтение для пользователя на папку music.
sudo chown username:username music
docker-compose up -d
Переходим в браузере по ip-or-fqdn:4533
Система попросит создать пароль и логин администратора. Попутно Navidrome просканирует папку на наличие аудиотреков и сформирует аудиоколлекцию.
Подключаем Traefik
Подразумеваем что у нас уже есть установленый Traefik. Если нет то ознакомься со статьей Приводим docker-compose.yaml к такому виду:
version: "3" services: navidrome: container_name: navidrome hostname: navidrome image: deluan/navidrome:latest user: username:username # should be owner of volumes ports: - "4533:4533" restart: unless-stopped environment: # Optional: put your config options customization here. Examples: ND_SCANSCHEDULE: 1h ND_LOGLEVEL: info ND_SESSIONTIMEOUT: 24h volumes: - "./data:/data" - "./music:/music:ro" labels: traefik.enable: true # Подключаем traefik.http.routers.music.entrypoints: web traefik.http.routers.music.rule: "Host(`music.my-site.ru`)" # Прописываем домен/поддомен traefik.http.middlewares.music-redirect-web-secure.redirectscheme.scheme: https traefik.http.routers.music.middlewares: music-redirect-web-secure # Включаем редирект на https traefik.http.services.music.loadbalancer.server.port: 4533 traefik.http.routers.music.tls: true traefik.http.routers.music.entrypoints: web-secure networks: default: external: name: traefik_default
Базовые переменные окружения конфигурации Navidrome
Конфигурация может быть применена с помощью записи переменных окружения в docker-compose файле или напрямую в конфигурационном файле navidrome.toml
В конфигфайле | В docker-compose | Описание | Default value |
---|---|---|---|
ND_CONFIGFILE | Загрузка конфигурации с файла | "./navidrome.toml" | |
MusicFolder | ND_MUSICFOLDER | Путь до папки с музыкальной коллекцией | "./music" |
DataFolder | ND_DATAFOLDER | Путь до папки хранения базы данных и конфигов | "./data" |
CacheFolder | ND_CACHEFOLDER | Путь до папки хранения кэша | " |
LogLevel | ND_LOGLEVEL | Параметр ведения логов (error, warn, info, debug, trace) | "info" |
Address | ND_ADDRESS | IP-адрес (IPv4/IPv6) или unix-сокет к которому привязан сервис | 0.0.0.0 и :: |
BaseUrl | ND_BASEURL | DNS-адрес для использования за реверс-прокси (/music или https://srv.music.ru) | Пусто |
Port | ND_PORT | HTTP порт на котором отзывается Navidrome | 4533 |
Решение проблем
Кракозябры в альбомах и треках
Из за некорректной кодировки русскоязычных треков могут появиться кракозябры. Решается утилитой mp3tag. Нужно выбрать всю папку с музыкой, выделить все треки и нажать сохранить. В большинстве случаев это помогает.
Отсутствуют обложки
Navidrome иногда некорректно считывает cover.jpg в папке альбома. В идеале нужно просканировать папку всего исполнителя или папку с альбомом с помощью MusicBrainz Picard и попробовать считать теги. В зависимости от популярности исполнителя шанс восстановить теги и обложки - выше. В некоторых случаях Picard не способен найти в своих базах данных этот ваш любимый андерграунд-инди альбом, поэтому необходимо править ручками. mp3tag так же справится с этой задачей, но более точечно
У исполнителя очень много коллабов с другими исполнителями или в альбомы множатся как на скрине, хочу обьединить их под один тег
В mp3tag выбираем всю папку с музыкой конкретного исполнителя и, выделя всю музыку в списке, вписываем в графу Album Artist и/или Composer имя. После повторного сканирования все альбомы обьединятся.
Появилась куча плейлистов после загрузки музыки
Удалите через поиск m3u файлы в папках если они вам не нужны, потому как после повторного сканирования они вернутся снова
Закинул альбомы, но они не появляются в списке
Нужно или вручную перезапустить сканирование (Значок Activity - Quick/Full Scan) или изменить параметр ND_SCANSCHEDULE
не на 1 час а на 5 минут. Но это увеличит нагрузку на сервер.
В некоторых альбомах треки повторяются подряд два раза и больше
Скорее всего загрузили папку где помимо альбома есть еще re-issue или ремастер такого же у которого совпали теги. Разгруппируйте переименовав альбом или просто удалите ненужный
Хочу описание артиста при выборе его профиля с альбомами и скробблинг
Сложная ситуация, потому как работает наполовину - не подргужая его фотографию, а только лишь описание. Раньше работало через Spotify API, но авторизоваться и получить ключ сейчас проблема. С Last.Fm тоже проблема, потому как если включить скробблинг в панели управления то страничка Last.Fm вернет Invalid API key. If you are a third party developer see our authentication how-to to find out more.
Решение на данный момент такое: регаемся на ластике самостоятельно, генерим api ключ по ссылке Далее в переменных окружения прописываем пункты:
ND_LASTFM_ENABLED: "true" ND_LASTFM_APIKEY: "api-key" ND_LASTFM_SECRET: "secret-key" ND_LASTFM_LANGUAGE: "en"
Рестартим сервис. Далее подключаем ListenBrainz. Для этого достаточно в панели управления дернуть token, предварительно заведя учетку на ListenBrainz Если есть возможность авторизоваться в Spotify, то генерируем ключ и секрет по ссылке и указываем их в переменных окружения
ND_SPOTIFY_ID: "api-key" ND_SPOTIFY_SECRET: "secret-key"
Клиенты для использования без web-панели Navidrome
- Audinaut - Android. Самый простой и с минимальным функционалом
- Substreamer - Android/iOS. Навороченый, но пытается слишком ломиться на стороние сервисы чтобы дернуть метаданные, поэтому кажется что лагает. Без Spotify API на сервере не может отобразить обложки и описание артистов
- Sonixd - MacOS/Linux/Windows - очень красиво, но слишком тяжелое местами для слабого железа
- Clementine - MacOS/Linux/Windows - более традиционный вариант музыкального плейера, но работает как то с Subsonic API неохотно. Попробовать стоит, на постоянное использование - сомнительно