Blame
ec43ca | Mayekkuzu | 2024-11-12 19:42:44 | 1 | # Navidrome |
2 | ![](/Self-Hosted/Navidrome/navidrome.jpg) | |||
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 | ![](/Software/Navidrome/navidrome_album_fix.jpg) | |||
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/) |