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

Конфигурация может быть применена с помощью записи переменных окружения в docker-compose файле или напрямую в конфигурационном файле navidrome.toml

В конфигфайле В docker-compose Описание Default value
ND_CONFIGFILE Загрузка конфигурации с файла "./navidrome.toml"
MusicFolder ND_MUSICFOLDER Путь до папки с музыкальной коллекцией "./music"
DataFolder ND_DATAFOLDER Путь до папки хранения базы данных и конфигов "./data"
CacheFolder ND_CACHEFOLDER Путь до папки хранения кэша "/cache"
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 неохотно. Попробовать стоит, на постоянное использование - сомнительно

Ссылки