Як запустити Navidrome на власному VPS
Запустіть Navidrome на VPS і слухайте власну музику з телефона: розрахунок сховища, Subsonic-клієнти, offline-синхронізація, TLS і резервні копії.
Що дає self-hosted потокове відтворення музики на VPS
Self-hosted потокове відтворення музики на VPS означає, що ви самі запускаєте програвач і надаєте музику. Сервер зберігає файли, якими ви вже володієте, а будь-який телефон може підключитися до нього через інтернет за звичайними обліковими даними. Перед початком врахуйте компроміс: це заміна програвача потокового сервісу, а не його каталогу. У бібліотеці не з’явиться нічого нового, доки ви не придбаєте музику або не видобудете її з носія та не скопіюєте файл на сервер.
Аудіо значно менше навантажує сервер, ніж відео. Файли невеликі, телефони без додаткової обробки декодують усі поширені формати, а один слухач використовує менше пропускної здатності, ніж відеодзвінок. CPU тут не є проблемою. Реальне обмеження — дисковий простір. Ще два чинники, від яких залежить результат, — якість ваших тегів і можливість завантажувати музику для offline-використання в застосунку на телефоні.
Який музичний сервер: Navidrome, Jellyfin чи Funkwhale?
Navidrome — стандартний вибір, якщо вас цікавить лише аудіо. Це один бінарний файл Go в одному контейнері, а його стан зберігається в одній базі даних SQLite. Navidrome підтримує Subsonic API, тому для нього існує велика кількість сторонніх мобільних застосунків. У серпні 2026 року актуальною була версія 0.63.2. Проєкт заявляє, що добре працює навіть на такому малопотужному обладнанні, як Raspberry Pi Zero, тому витрати припадатимуть не на серверне програмне забезпечення.
Jellyfin варто використовувати, якщо ви вже запускаєте Jellyfin як медіасервер на VPS для відео. Його музична бібліотека працює, а Finamp — це музичний застосунок Jellyfin для Android та iOS, який завантажує треки для офлайн-прослуховування. Обмеженням є API. Jellyfin не має вбудованої кінцевої точки Subsonic, а сторонній плагін, який її додавав, припинили оновлювати у 2022 році, тому екосистема застосунків Subsonic для нього недоступна. Натомість потрібно використовувати застосунки, які працюють із власним API Jellyfin, а таких застосунків менше.
Funkwhale — федеративний варіант; версію 2.0 випустили в березні 2026 року. Сервер Funkwhale називається pod. Pod взаємодіють через ActivityPub — протокол, на якому працює Mastodon. Користувач одного pod може стежити за публічною бібліотекою на іншому. Funkwhale також підтримує частину Subsonic API, але є важлива відмінність: кожен користувач задає окремий пароль Subsonic у власних налаштуваннях, оскільки протокол Subsonic передбачає пароль, який сервер може прочитати. Funkwhale складніше встановлювати, оскільки разом із вебзастосунком йому потрібні PostgreSQL і черга завдань.
Вибирайте Navidrome, якщо вам не потрібна федерація і якщо Jellyfin ще не запущено. Далі в цьому посібнику ми налаштуємо Navidrome за допомогою Docker.
Як API Subsonic визначає, який мобільний застосунок ви використовуєте
Subsonic був музичним сервером, чий HTTP API став спільною мовою для self-hosted аудіосервісів, а OpenSubsonic — це спільнотний проєкт, який продовжує його розширювати. Саме тому на телефоні є вибір. Navidrome не постачається з власним мобільним застосунком і не потребує його, оскільки будь-який Subsonic-клієнт підключається за адресою сервера та даними вашого облікового запису.
Найважливіше це для офлайн-синхронізації — функції, від якої залежить, чи буде система зручною для щоденного використання. Телефон у тунелі не може підключитися до сервера, тому клієнт має заздалегідь скопіювати файли в локальне сховище. Усі клієнти підтримують потокове відтворення. Лише деякі вміють завантажувати файли. У каталозі клієнтів на navidrome.org/apps зазначено, які саме. Вибір широкий на обох платформах: Substreamer і Ultrasonic для Android, Amperfy і play:Sub для iOS. Деякі з найкращих клієнтів є платними застосунками, а серед Android-застосунків найчастіше згадують Symfonium. Перш ніж зробити вибір, встановіть два клієнти, оскільки саме з цією частиною системи ви взаємоджатимете щодня.
Скільки місця потрібно для музичної бібліотеки?
The data behind this chart
[
{
"label": "Opus 128k",
"kbps": 128,
"gb_per_1000_albums": 43
},
{
"label": "MP3 320k",
"kbps": 320,
"gb_per_1000_albums": 108
},
{
"label": "FLAC 16/44.1",
"kbps": 900,
"gb_per_1000_albums": 304
},
{
"label": "FLAC 24/96",
"kbps": "3,000",
"gb_per_1000_albums": "1,013"
}
]Це орієнтовні порядки величин, розраховані за бітрейтом, а не вимірювання реальної колекції. Арифметику достатньо просто перевірити для власних файлів. Вважайте, що альбом триває 45 хвилин, тобто 2,700 секунд. Помножте бітрейт у кілобітах за секунду на 2,700, а потім поділіть на 8,000, щоб отримати мегабайти. За бітрейту 320 kbps один альбом займає 108 MB, тому тисяча альбомів — приблизно 108 GB.
Lossless змінює результат. FLAC у якості CD для звичайного матеріалу має середній бітрейт близько 900 kbps, тому для тієї самої тисячі альбомів потрібно приблизно 304 GB. Бібліотека у форматі 24 bit, 96 kHz займатиме близько 1,013 GB — повний терабайт для колекції, яку можна було б перелічити на папері. Копія в Opus, оптимізована для телефона, за бітрейту 128 kbps вміщує ту саму тисячу альбомів у 43 GB. Запустіть du -sh /path/to/music для вже наявної бібліотеки, оскільки під час вибору тарифу має значення лише її середній бітрейт.
Пропускна здатність — менша частина загальних витрат. Потік із бітрейтом 320 kbps передає 40 кілобайтів за секунду, тому година прослуховування споживає близько 144 MB. Сто годин на місяць — це приблизно 14 GB, що зазвичай непомітно для ліміту трафіку VPS. Винятком є перша офлайн-синхронізація телефона: за один вечір вона може передати десятки гігабайтів.
Storage tier or compute tier?
Музичний сервер — це великий обсяг рідко використовуваних даних, який майже не потребує обчислень. Читання файлу зі швидкістю 40 кілобайтів на секунду не створює помітного навантаження на диск, а CPU працює лише під час сканування бібліотеки або транскодування, яким ви здебільшого не займатиметеся. Тому швидкий NVMe на compute plan тут нічого не дає, а ціна за гігабайт стає причиною, через яку ви не завантажуєте копії FLAC. У такому випадку storage VPS вигідніший за звичайний VPS, оскільки вартість таких планів визначається обсягом у терабайтах, а не кількістю ядер.
Обсяг пам’яті може бути невеликим. Navidrome обслуговує особисту бібліотеку, використовуючи кілька сотень мегабайтів, а пікове споживання припадає на сканування, а не на відтворення. Виділіть серверу 1 GB або 2 GB RAM, а решту бюджету витратьте на диск.
Встановлення Navidrome за допомогою Docker Compose
Спочатку створіть каталоги та призначте їм власника з ідентифікатором користувача, від імені якого працюватиме контейнер. Якщо ви ще не працювали з Compose, у матеріалі Docker Compose на VPS описано припущення, на яких базується цей файл.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicЗапишіть docker-compose.yml без зайвого вмісту, у власному каталозі:
services:
navidrome:
image: deluan/navidrome:0.63.2
user: "1000:1000"
ports:
- "127.0.0.1:4533:4533"
restart: unless-stopped
environment:
ND_LOGLEVEL: "info"
ND_SESSIONTIMEOUT: "24h"
ND_SCANNER_SCHEDULE: "@every 24h"
ND_BACKUP_PATH: "/data/backup"
ND_BACKUP_SCHEDULE: "0 4 * * *"
ND_BACKUP_COUNT: "7"
volumes:
- /srv/navidrome:/data
- /srv/music:/music:rodocker compose up -d
docker compose psdocker compose ps має показувати, що сервіс працює, а не постійно перезапускається. Контейнер, який циклічно перезапускається, майже завжди має проблему з правами доступу до /srv/navidrome, а docker compose logs navidrome називає файл, до якого не вдалося записати дані.
У цьому файлі варто пояснити чотири деталі. Порт опубліковано лише на 127.0.0.1, тому сервер доступний через reverse proxy, а не через порт 4533 з відкритого Інтернету: Docker самостійно додає правила firewall, тому звичайний 4533:4533 залишається доступним навіть на сервері, де ufw показує, що всі підключення заборонено. Том монтується лише для читання, тому помилка сканера не зможе видалити вашу єдину копію. ND_SCANNER_SCHEDULE типово вимкнено, а в посібниках, написаних до Navidrome 0.55, його називають ND_SCANSCHEDULE — такої назви більше не існує. Три параметри резервного копіювання вмикають вбудоване резервне копіювання бази даних, на яке спирається наведений нижче розділ про резервні копії.
Перенесіть музику на сервер
Скопіюйте медіатеку за допомогою rsync. Якщо з’єднання перерветься, rsync продовжить копіювання, а не почне його спочатку.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/Кінцевий слеш у вихідному шляху має значення. Без нього ви отримаєте /srv/music/Music. Після завершення копіювання виправте власника файлів:
sudo chown -R 1000:1000 /srv/music
id -uКонтейнер працює від імені користувача з ідентифікатором 1000, а монтування доступне лише для читання. Тому всі файли мають бути доступними для читання користувачу з цим ідентифікатором. Якщо ваш обліковий запис SSH на VPS має не uid 1000, скопійовані файли належатимуть іншому користувачу. Сканування не знайде жодної композиції, а вебінтерфейс залишатиметься порожнім. Команда id -u виводить фактичний ідентифікатор вашого користувача, а в матеріалі як працюють PUID і PGID у контейнерах Docker докладно пояснено це зіставлення.
Reverse proxy і TLS, щоб телефон працював звідусіль
Спрямуйте DNS A-запис на VPS, а потім додайте Caddy три рядки:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy запитує сертифікат під час першого запиту. Порти 80 і 443 мають бути відкриті, оскільки ACME (середовище автоматичного керування сертифікатами) обробляє challenge на порту 80. У nginx додайте proxy_buffering off; до блоку location: Navidrome передає події про прогрес вебінтерфейсу через одне довготривале з’єднання. Якщо buffering увімкнено, інтерфейс очікує на відповідь, яку nginx ще утримує. Якщо ви розміщуєте сервіс за шляхом, наприклад /music, а не на окремому піддомені, задайте ND_BASEURL з таким самим шляхом. Інакше інтерфейс завантажиться як порожня сторінка. Три поширені проксі порівняно в Nginx, Caddy і Traefik на VPS.
Відкрийте сайт і створіть перший обліковий запис. Пароля за замовчуванням немає. Першого відвідувача буде запропоновано створити обліковий запис адміністратора, тому зробіть це до того, як повідомите комусь адресу. Потім перевірте точний шлях, який використовує клієнт на телефоні:
SALT=$(openssl rand -hex 6)
TOKEN=$(printf '%s%s' 'YOUR_PASSWORD' "$SALT" | md5sum | cut -d' ' -f1)
curl -s "https://music.example.com/rest/ping.view?u=YOUR_USER&t=$TOKEN&s=$SALT&v=1.16.1&c=curl&f=json"Коректна відповідь починається з {"subsonic-response":{"status":"ok" і містить navidrome як тип сервера. Тіло відповіді, що містить "status":"failed" і код помилки 40, означає, що проксі працює, а облікові дані неправильні. На цьому етапі спочатку виправте помилку сертифіката, оскільки більшість клієнтів на телефоні відхиляють неправильний сертифікат і показують користувачу незрозуміле повідомлення.
Чому після першого сканування бібліотека має неправильний вигляд
Navidrome переглядає музику за тегами, а не за папками, тому саме теги визначають, що ви бачите. Трек без тегу виконавця альбому буде віднесено до виконавця треку. Через це одна збірка, де кожен трек має іншого виконавця, перетворюється на двадцять альбомів по одному треку. Виправляйте це у файлах, а не в Navidrome: MusicBrainz Picard і beets знаходять альбом у базі даних MusicBrainz і записують назад стандартні теги.
Navidrome також розділяє тег із кількома виконавцями на окремих виконавців. Тому назва гурту, що містить роздільник, може бути помилково розділена. Приклад, з яким стикається майже кожен, — AC/DC. ND_SCANNER_ARTISTSPLITEXCEPTIONS містить назви, які не можна розділяти.
Нові файли виявляються засобом відстеження файлів через кілька секунд після додавання. Засіб відстеження залежить від сповіщень ядра про зміни, але такі сповіщення не надходять для файлів, записаних у мережеву спільну папку, змонтовану з іншої машини. Тому в такій конфігурації саме періодичний ND_SCANNER_SCHEDULE підтримує бібліотеку в актуальному стані. Повне повторне сканування читає теги кожного файлу, що повільно виконується у великій бібліотеці. Це одна з причин захистити базу даних, описану нижче.
Користувачі, списки відтворення та спільний доступ
Адміністратор створює інші облікові записи у вебінтерфейсі; самостійна реєстрація недоступна. Для кожного користувача окремо зберігаються лічильники відтворень, списки відтворення, обрані записи та оцінки. Тому в межах одного домогосподарства не формується спільний профіль уподобань.
Списки відтворення надходять із двох джерел. Список, створений у клієнті, зберігається в базі даних. Файл .m3u, доданий до папки бібліотеки, імпортується під час сканування. Це зручний спосіб перенести списки відтворення з настільного програвача. Розумні списки відтворення — це файли .nsp, тобто невеликі JSON-файли з правилами, які імпортуються так само та автоматично оновлюються зі змінами бібліотеки.
Спільний доступ увімкнено за замовчуванням, починаючи з версії 0.63.0, випущеної в липні 2026 року. Користувач може створити публічне посилання на альбом, яке будь-хто відкриє без входу в обліковий запис. На сервері, де зберігається вся ваша бібліотека, це може бути небажано. Параметр ND_ENABLESHARING зі значенням false вимикає цю функцію.
Резервне копіювання бази даних окремо від музичних файлів
Власний механізм резервного копіювання Navidrome охоплює лише базу даних. У документації це зазначено прямо: процес резервного копіювання зберігає базу даних, зокрема користувачів, кількість відтворень та інші дані, але не зберігає музику або конфігурацію. Такий поділ правильний, оскільки ці дві частини відновлюються по-різному. Музичні файли можна знову скопіювати з диска, з якого їх було видобуто. Дані про кількість відтворень, оцінки, обране та плейлисти більше ніде не зберігаються, а повторне сканування їх не відновлює.
Файл compose уже щоночі записує копію в /data/backup і зберігає сім таких копій. Перед оновленням створіть копію вручну:
sudo docker compose run --rm navidrome backup createВідновлення видаляє поточну базу даних і копіює резервну на її місце. Цю операцію потрібно виконувати, коли Navidrome зупинено. Відновлення на активному сервері небезпечне.
Ці файли все одно залишаються на тому самому VPS, тому не переживуть вихід VPS з ладу. За розкладом передавайте /srv/navidrome на іншу машину або в об’єктне сховище. Саме для цього призначені restic і BorgBackup. Увесь каталог невеликий, зазвичай значно менший за один гігабайт. Тому щоденна зашифрована копія за межі сервера майже нічого не коштує та дає змогу відновити все, чого не повертає повторне сканування.
FAQ
Чи потрібно виконувати транскодування музики на VPS?
Майже ніколи. Телефони та браузери самостійно декодують MP3, AAC, Opus і FLAC, тому сервер надсилає файл без змін і майже не використовує CPU. Є один випадок, коли це варто ввімкнути: бібліотека FLAC, яку передають через мобільну мережу. Перетворення приблизно з 900 kbps на Opus зі швидкістю 128 kbps зменшує обсяг використаних даних приблизно у 7 разів. Navidrome може виконувати це окремо для кожного користувача та програвача. Функція залишається вимкненою, доки ви її не ввімкнете.
Чому мобільний застосунок не може завантажити музику для прослуховування офлайн?
Тому що офлайн-сховище є функцією клієнта, а не сервера. Subsonic API дає змогу будь-якому клієнту отримати цілий файл, але саме застосунок вирішує, чи зберігати його копію на телефоні. Перевірте каталог клієнтів на navidrome.org/apps і виберіть клієнт, в описі якого згадано офлайн-завантаження або кешування. Деякі клієнти кешують лише те, що ви вже прослухали. Це не те саме, що синхронізувати альбом перед поїздкою.
Чому після сканування один альбом розділився на кілька альбомів?
Тег виконавця альбому відсутній або має різні значення в різних композиціях. Navidrome групує композиції за тегами, а не за каталогами. Тому 12 композицій із 12 різними значеннями виконавця та без спільного значення виконавця альбому виглядають як 12 альбомів. Установіть тег виконавця альбому для кожної композиції альбому. Для збірки зазвичай використовують значення Various Artists. Після цього запустіть повторне сканування. MusicBrainz Picard або beets можуть змінити теги для всього каталогу одночасно.
Чи замінює self-hosted потокове передавання музики Spotify?
Воно замінює програвач і бібліотеку, але не каталог. Ви отримуєте власну колекцію на кожному пристрої, а також плейлисти та лічильники прослуховувань, які не можна відібрати через зміну ліцензій. Нові релізи та рекомендації на основі прослуховувань інших користувачів недоступні. Більшість людей, які використовують таку схему, купують музику та зберігають недорогий обліковий запис потокового сервісу для пошуку нової музики.