Blame
ec43ca | Mayekkuzu | 2024-11-12 19:42:44 | 1 | # Navidrome |
2 |  |
|||
3 | ||||
4 | **Navidrome** - частично совместимый с Subsonic API сервер потокового аудио. Позволяет без особого геморроя расшарить свою аудиоколлекцию через локальную сеть или же в интернеты. Пожалуй самый удобный вариант организации своего спотифая с Портисхэдом и Агузаровой. Имеются клиенты для мобильных устроиств, смарт-ящиков и ПК. |
|||
5 | ||||
6 | ### Запуск сервиса с бинарника |
|||
7 | Для запуска необходим дополнительно пакет ffmpeg, скачиваем с репозитория, к примеру наш инстанс на Debian/Ubuntu |
|||
8 | ```shell |
|||
9 | sudo apt update |
|||
10 | sudo apt upgrade |
|||
11 | sudo apt install ffmpeg |
|||
12 | ``` |
|||
13 | Далее качаем архив с бинарником с [Github](https://github.com/navidrome/navidrome/releases), предварительно уточняем версию: |
|||
14 | ```shell |
|||
15 | wget https://github.com/navidrome/navidrome/releases/download/v0.XX.X/navidrome_0.XX.X_linux_amd64.tar.gz -O Navidrome.tar.gz |
|||
16 | sudo tar -xvzf Navidrome.tar.gz -C /opt/navidrome/ |
|||
17 | sudo chown -R username:username /opt/navidrome |
|||
18 | ``` |
|||
19 | Для базового запуска нужно создать конфигфаил navidrome.toml в папке /var/lib/navidrome. В нем укажем папку где будет лежать наши аудиофайлы. |
|||
20 | ``` |
|||
21 | MusicFolder = "/mnt/music" |
|||
22 | ``` |
|||
23 | Создадим systemd-юнит для запуска сервиса в фоновом режиме: |
|||
24 | ```shell |
|||
25 | sudo nano /etc/systemd/system/navidrome.service |
|||
26 | ``` |
|||
27 | Содержимое navidrome.service. Обязательно указываем пользователя от которого будет работать сервис. У пользователя должен быть доступ к папке с музыкой и конфигами. |
|||
28 | ``` |
|||
29 | [Unit] |
|||
30 | Description=Navidrome Music Server |
|||
31 | After=remote-fs.target network.target |
|||
32 | AssertPathExists=/var/lib/navidrome |
|||
33 | ||||
34 | [Install] |
|||
35 | WantedBy=multi-user.target |
|||
36 | ||||
37 | [Service] |
|||
38 | User=username |
|||
39 | Group=username |
|||
40 | Type=simple |
|||
41 | ExecStart=/opt/navidrome/navidrome --configfile "/var/lib/navidrome/navidrome.toml" |
|||
42 | WorkingDirectory=/var/lib/navidrome |
|||
43 | TimeoutStopSec=20 |
|||
44 | KillMode=process |
|||
45 | Restart=on-failure |
|||
46 | DevicePolicy=closed |
|||
47 | NoNewPrivileges=yes |
|||
48 | PrivateTmp=yes |
|||
49 | PrivateUsers=yes |
|||
50 | ProtectControlGroups=yes |
|||
51 | ProtectKernelModules=yes |
|||
52 | ProtectKernelTunables=yes |
|||
53 | RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 |
|||
54 | RestrictNamespaces=yes |
|||
55 | RestrictRealtime=yes |
|||
56 | SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap |
|||
57 | ReadWritePaths=/var/lib/navidrome |
|||
58 | ||||
59 | # Здесь можно указать переменные окружения (ниже в статье примеры), например |
|||
60 | Environment=ND_LOGLEVEL="info" |
|||
61 | ``` |
|||
62 | Перезапускаем демон systemd, включаем автозапуск и запускаем Navidrome |
|||
63 | ```shell |
|||
64 | sudo systemctl daemon-reload |
|||
65 | sudo systemctl enable navidrome.service |
|||
66 | sudo systemctl start navidrome.service |
|||
67 | sudo systemctl status navidrome.service |
|||
68 | ``` |
|||
69 | Переходим в браузере по `ip-or-fqdn:4533` |
|||
70 | Система попросит создать пароль и логин администратора. Попутно Navidrome просканирует папку на наличие аудиотреков и сформирует аудиоколлекцию. |
|||
71 | ||||
72 | ### Docker-Compose |
|||
73 | Подразумеваем что [docker-compose](/Docker/docker-compose) уже установлен. |
|||
74 | ||||
75 | Создаем папку rustdesk-server. Внутри папки создаем фаил docker-compose.yaml |
|||
76 | Вписываем содержимое: |
|||
77 | ||||
78 | ``` |
|||
79 | version: "3" |
|||
80 | services: |
|||
81 | navidrome: |
|||
82 | container_name: navidrome # Опционально |
|||
83 | hostname: navidrome # Опционально |
|||
84 | image: deluan/navidrome:latest |
|||
85 | user: username:username # Указываем пользователя от которого будем работать |
|||
86 | ports: |
|||
87 | - "4533:4533" # Указываем какой порт будем использовать для веб-морды и API |
|||
88 | restart: unless-stopped |
|||
89 | environment: |
|||
90 | # Optional: put your config options customization here. Examples: |
|||
91 | ND_SCANSCHEDULE: 1h # Частота сканирования папки с аудио |
|||
92 | ND_LOGLEVEL: info |
|||
93 | ND_SESSIONTIMEOUT: 24h # Сколько времени будет дейстововать сессия авторизации веб-морды |
|||
94 | ||||
95 | volumes: |
|||
96 | - "./data:/data" # Папка с конфигурационными файлами. Создается автоматически |
|||
97 | - "./music:/music:ro" # Музыка хранится тут |
|||
98 | ||||
99 | ``` |
|||
100 | В папку ./music кидаем свои треки. Обязательно назначаем права на чтение для пользователя на папку music. |
|||
101 | ```shell |
|||
102 | sudo chown username:username music |
|||
103 | docker-compose up -d |
|||
104 | ``` |
|||
105 | Переходим в браузере по `ip-or-fqdn:4533` |
|||
106 | Система попросит создать пароль и логин администратора. Попутно Navidrome просканирует папку на наличие аудиотреков и сформирует аудиоколлекцию. |
|||
107 | ||||
108 | #### Подключаем Traefik |
|||
109 | Подразумеваем что у нас уже есть установленый Traefik. Если нет то ознакомься со [статьей](/Software/Traefik) |
|||
110 | Приводим docker-compose.yaml к такому виду: |
|||
111 | ``` |
|||
112 | version: "3" |
|||
113 | services: |
|||
114 | navidrome: |
|||
115 | container_name: navidrome |
|||
116 | hostname: navidrome |
|||
117 | image: deluan/navidrome:latest |
|||
118 | user: username:username # should be owner of volumes |
|||
119 | ports: |
|||
120 | - "4533:4533" |
|||
121 | restart: unless-stopped |
|||
122 | environment: |
|||
123 | # Optional: put your config options customization here. Examples: |
|||
124 | ND_SCANSCHEDULE: 1h |
|||
125 | ND_LOGLEVEL: info |
|||
126 | ND_SESSIONTIMEOUT: 24h |
|||
127 | ||||
128 | volumes: |
|||
129 | - "./data:/data" |
|||
130 | - "./music:/music:ro" |
|||
131 | ||||
132 | labels: |
|||
133 | traefik.enable: true # Подключаем |
|||
134 | traefik.http.routers.music.entrypoints: web |
|||
135 | traefik.http.routers.music.rule: "Host(`music.my-site.ru`)" # Прописываем домен/поддомен |
|||
136 | traefik.http.middlewares.music-redirect-web-secure.redirectscheme.scheme: https |
|||
137 | traefik.http.routers.music.middlewares: music-redirect-web-secure # Включаем редирект на https |
|||
138 | traefik.http.services.music.loadbalancer.server.port: 4533 |
|||
139 | traefik.http.routers.music.tls: true |
|||
140 | traefik.http.routers.music.entrypoints: web-secure |
|||
141 | ||||
142 | networks: |
|||
143 | default: |
|||
144 | external: |
|||
145 | name: traefik_default |
|||
146 | ``` |
|||
147 | ||||
148 | ### Базовые переменные окружения конфигурации Navidrome |
|||
149 | Конфигурация может быть применена с помощью записи переменных окружения в docker-compose файле или напрямую в конфигурационном файле navidrome.toml |
|||
150 | ||||
151 | | В конфигфайле | В docker-compose | Описание | Default value | |
|||
152 | | ------------- | ---------------- | ------------------------------------------------------------------------------ | -------------------- | |
|||
153 | | | ND_CONFIGFILE | Загрузка конфигурации с файла | "./navidrome.toml" | |
|||
154 | | MusicFolder | ND_MUSICFOLDER | Путь до папки с музыкальной коллекцией | "./music" | |
|||
155 | | DataFolder | ND_DATAFOLDER | Путь до папки хранения базы данных и конфигов | "./data" | |
|||
156 | | CacheFolder | ND_CACHEFOLDER | Путь до папки хранения кэша | "<DataFolder>/cache" | |
|||
157 | | LogLevel | ND_LOGLEVEL | Параметр ведения логов (error, warn, info, debug, trace) | "info" | |
|||
158 | | Address | ND_ADDRESS | IP-адрес (IPv4/IPv6) или unix-сокет к которому привязан сервис | 0.0.0.0 и :: | |
|||
159 | | BaseUrl | ND_BASEURL | DNS-адрес для использования за реверс-прокси (/music или https://srv.music.ru) | Пусто | |
|||
160 | | Port | ND_PORT | HTTP порт на котором отзывается Navidrome | 4533 | |
|||
161 | ||||
162 | ||||
163 | ### Решение проблем |
|||
164 | #### Кракозябры в альбомах и треках |
|||
165 | Из за некорректной кодировки русскоязычных треков могут появиться кракозябры. Решается утилитой [mp3tag](/https://www.mp3tag.de/en/download.html). Нужно выбрать всю папку с музыкой, выделить все треки и нажать сохранить. В большинстве случаев это помогает. |
|||
166 | ||||
167 | #### Отсутствуют обложки |
|||
168 | Navidrome иногда некорректно считывает cover.jpg в папке альбома. В идеале нужно просканировать папку всего исполнителя или папку с альбомом с помощью [MusicBrainz Picard](https://picard.musicbrainz.org/) и попробовать считать теги. В зависимости от популярности исполнителя шанс восстановить теги и обложки - выше. В некоторых случаях Picard не способен найти в своих базах данных этот ваш любимый андерграунд-инди альбом, поэтому необходимо править ручками. [mp3tag](/https://www.mp3tag.de/en/download.html) так же справится с этой задачей, но более точечно |
|||
169 | ||||
170 | #### У исполнителя очень много коллабов с другими исполнителями или в альбомы множатся как на скрине, хочу обьединить их под один тег |
|||
171 |  |
|||
172 | ||||
173 | В [mp3tag](/https://www.mp3tag.de/en/download.html) выбираем всю папку с музыкой конкретного исполнителя и, выделя всю музыку в списке, вписываем в графу Album Artist и/или Composer имя. После повторного сканирования все альбомы обьединятся. |
|||
174 | #### Появилась куча плейлистов после загрузки музыки |
|||
175 | Удалите через поиск m3u файлы в папках если они вам не нужны, потому как после повторного сканирования они вернутся снова |
|||
176 | ||||
177 | #### Закинул альбомы, но они не появляются в списке |
|||
178 | Нужно или вручную перезапустить сканирование (Значок Activity - Quick/Full Scan) или изменить параметр `ND_SCANSCHEDULE` не на 1 час а на 5 минут. Но это увеличит нагрузку на сервер. |
|||
179 | ||||
180 | #### В некоторых альбомах треки повторяются подряд два раза и больше |
|||
181 | Скорее всего загрузили папку где помимо альбома есть еще re-issue или ремастер такого же у которого совпали теги. Разгруппируйте переименовав альбом или просто удалите ненужный |
|||
182 | ||||
183 | #### Хочу описание артиста при выборе его профиля с альбомами и скробблинг |
|||
184 | Сложная ситуация, потому как работает наполовину - не подргужая его фотографию, а только лишь описание. Раньше работало через 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.` |
|||
185 | Решение на данный момент такое: регаемся на ластике самостоятельно, генерим api ключ по [ссылке](https://www.last.fm/api/account/create) |
|||
186 | Далее в переменных окружения прописываем пункты: |
|||
187 | ``` |
|||
188 | ND_LASTFM_ENABLED: "true" |
|||
189 | ND_LASTFM_APIKEY: "api-key" |
|||
190 | ND_LASTFM_SECRET: "secret-key" |
|||
191 | ND_LASTFM_LANGUAGE: "en" |
|||
192 | ``` |
|||
193 | Рестартим сервис. Далее подключаем ListenBrainz. Для этого достаточно в панели управления дернуть token, предварительно заведя учетку на [ListenBrainz](https://listenbrainz.org/) |
|||
194 | Если есть возможность авторизоваться в Spotify, то генерируем ключ и секрет по [ссылке](https://developer.spotify.com/dashboard/applications) и указываем их в переменных окружения |
|||
195 | ``` |
|||
196 | ND_SPOTIFY_ID: "api-key" |
|||
197 | ND_SPOTIFY_SECRET: "secret-key" |
|||
198 | ``` |
|||
199 | ## Клиенты для использования без web-панели Navidrome |
|||
200 | - [Audinaut](https://github.com/nvllsvm/Audinaut) - Android. Самый простой и с минимальным функционалом |
|||
201 | - [Substreamer](https://substreamerapp.com/) - Android/iOS. Навороченый, но пытается слишком ломиться на стороние сервисы чтобы дернуть метаданные, поэтому кажется что лагает. Без Spotify API на сервере не может отобразить обложки и описание артистов |
|||
202 | - [Sonixd](https://github.com/jeffvli/sonixd) - MacOS/Linux/Windows - очень красиво, но слишком тяжелое местами для слабого железа |
|||
203 | - [Clementine](https://www.clementine-player.org/) - MacOS/Linux/Windows - более традиционный вариант музыкального плейера, но работает как то с Subsonic API неохотно. Попробовать стоит, на постоянное использование - сомнительно |
|||
204 | ||||
205 | ## Ссылки |
|||
206 | - [Navidrome](https://navidrome.org) |
|||
207 | - [GitHub Navidrome](https://github.com/navidrome/navidrome/) |