Własny serwer muzyczny na VPS: konfiguracja Navidrome
Dowiedz się, jak uruchomić Navidrome na VPS, aby strumieniować własną bibliotekę audio. Poradnik obejmuje konfigurację TLS, wybór klientów Subsonic oraz bezpieczne backupy.
Co daje własny serwer strumieniowania muzyki na VPS
Własny serwer strumieniowania muzyki na VPS oznacza, że samodzielnie uruchamiasz odtwarzacz i dostarczasz pliki muzyczne. Serwer przechowuje posiadane przez Ciebie pliki, a dowolny telefon może uzyskać do nich dostęp przez Internet po zalogowaniu. Przed rozpoczęciem warto mieć świadomość różnicy: rozwiązanie to zastępuje odtwarzacz serwisu streamingowego, a nie jego katalog. W bibliotece nie pojawi się nic nowego, dopóki nie kupisz lub nie zgrasz utworu, a następnie nie skopiujesz pliku na serwer.
Dźwięk obciąża serwer znacznie mniej niż wideo. Pliki są niewielkie, telefony dekodują każdy popularny format bez dodatkowego wsparcia, a jeden słuchacz zużywa mniej pasma niż rozmowa wideo. Obciążenie procesora jest w tym przypadku pomijalne. Głównym ograniczeniem jest przestrzeń dyskowa. Pozostałe dwa czynniki decydujące o użyteczności rozwiązania to jakość metadanych (tagów) oraz możliwość pobierania muzyki do trybu offline w aplikacji mobilnej.
Który serwer muzyczny: Navidrome, Jellyfin czy Funkwhale?
Navidrome to domyślny wybór, jeśli interesuje Cię wyłącznie dźwięk. Jest to pojedynczy plik binarny Go w jednym kontenerze, który przechowuje swój stan w jednej bazie danych SQLite. Obsługuje on API Subsonic, dzięki czemu istnieje szeroka gama zewnętrznych aplikacji mobilnych. Wersja 0.64.2, wydana we wrześniu 2026 roku, była aktualna na dzień 2026-10-10. Nie należy uruchamiać wersji starszych niż 0.64.1, która naprawiła pięć biuletynów bezpieczeństwa, w tym podatność na nieograniczone odgadywanie haseł w logowaniu Subsonic. Projekt jest opisywany jako dobrze działający na sprzęcie o ograniczonych zasobach, takim jak Raspberry Pi, więc oprogramowanie serwera nie jest elementem, za który trzeba płacić.
Jellyfin jest wart uwagi, jeśli już korzystasz z Jellyfin jako serwera mediów na VPS do obsługi wideo. Jego biblioteka muzyczna działa poprawnie, a Finamp to darmowa aplikacja muzyczna Jellyfin na Androida i iOS, która umożliwia pobieranie utworów do słuchania offline. Sam Jellyfin nadal nie posiada wbudowanego punktu końcowego Subsonic, ale dodaje go wtyczka społeczności. Subfin-NG, fork wtyczki Subfin, „pozwala aplikacjom muzycznym kompatybilnym z Subsonic odtwarzać bibliotekę muzyczną Jellyfin” poprzez dodanie API OpenSubsonic do Jellyfin. Wymaga on wersji Jellyfin 12.1 lub nowszej i doczekał się trzech wydań między 24 a 28 września 2026 roku. Aplikacje Subsonic mogą więc łączyć się z Jellyfin za pośrednictwem wtyczki zewnętrznej, a nie funkcji natywnej, dlatego warto przetestować wybrany klient przed podjęciem decyzji o jego użyciu. Most działa również w drugą stronę: Navidrome 0.64.0 dodał eksperymentalne API Jellyfin, domyślnie wyłączone i aktywowane za pomocą ND_JELLYFIN_ENABLED, które według dokumentacji jest testowane z Finamp, Jellify oraz Feishin.
Funkwhale to opcja sfederowana, a wersja 2.0 została wydana w marcu 2026 roku. Serwer Funkwhale nazywany jest podem, pody federują się poprzez ActivityPub (protokół stojący za Mastodonem), a użytkownicy mogą obserwować swoje playlisty między podami. Wersja 2.0 zastąpiła stare biblioteki playlistami, zmieniając obserwowanie bibliotek na obserwowanie playlist, a pod w wersji 2.0 nie federuje się z podami działającymi nadal na wersji 1.x. Obsługuje on również część API Subsonic, z jedną istotną różnicą: każdy użytkownik ustawia osobne hasło Subsonic w swoich ustawieniach, ponieważ protokół Subsonic wymaga hasła, które serwer może odczytać. Funkwhale jest cięższą instalacją, ponieważ oprócz aplikacji webowej wymaga PostgreSQL oraz kolejki zadań.
Wybierz Navidrome, chyba że potrzebujesz federacji lub Jellyfin jest już uruchomiony. Reszta tego przewodnika opisuje konfigurację Navidrome przy użyciu Docker.
Dlaczego API Subsonic decyduje o wyborze aplikacji mobilnej
Subsonic był serwerem muzycznym, którego API HTTP stało się wspólnym językiem dla samodzielnie hostowanych usług audio, a OpenSubsonic to projekt społecznościowy, który stale je rozwija. Ta historia sprawia, że użytkownik telefonu ma wybór. Navidrome nie posiada własnej aplikacji mobilnej i nie potrzebuje jej, ponieważ każdy klient Subsonic loguje się za pomocą adresu serwera oraz danych konta.
Ma to kluczowe znaczenie dla synchronizacji offline, czyli funkcji decydującej o tym, czy konfiguracja sprawdzi się w codziennym użytkowaniu. Telefon w tunelu nie ma dostępu do serwera, więc klient musi wcześniej skopiować pliki do pamięci lokalnej. Każdy klient obsługuje strumieniowanie. Tylko niektóre obsługują pobieranie. Katalog klientów pod adresem navidrome.org/apps wskazuje, które z nich to potrafią, a wybór na obu platformach jest szeroki: Substreamer i Ultrasonic na Androida, Amperfy oraz play:Sub na iOS. Kilka z najlepszych klientów to aplikacje płatne, a Symfonium na Androida jest najczęściej wymienianym wyborem. Przed podjęciem decyzji warto zainstalować dwie aplikacje, ponieważ jest to element systemu, z którego korzysta się codziennie.
Ile miejsca w pamięci masowej wymaga biblioteka muzyczna?
Dane, na których opiera się ten wykres
[
{
"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"
}
]Poniższe wartości to rzędy wielkości wynikające z bitrate'u, a nie pomiary rzeczywistej kolekcji; obliczenia są na tyle proste, że można je zweryfikować na własnych plikach. Przyjmijmy, że album trwa 45 minut, czyli 2700 sekund. Pomnóż bitrate w kilobitach na sekundę przez 2700, a następnie podziel przez 8000, aby uzyskać megabajty. Przy 320 kbps daje to 108 MB na jeden album, więc tysiąc albumów to około 108 GB.
Formaty bezstratne zmieniają wynik. Pliki FLAC o jakości CD mają średnio około 900 kbps w przypadku typowego materiału, więc tysiąc albumów wymaga około 304 GB. Biblioteka 24-bitowa, 96 kHz zajmuje około 1,013 GB, czyli pełny terabajt dla kolekcji, którą można wypisać na kartce papieru. Kopia w formacie Opus przy 128 kbps, zoptymalizowana pod kątem telefonów, mieści te same tysiąc albumów w 43 GB. Uruchom du -sh /path/to/music na posiadanej bibliotece, ponieważ własny średni bitrate jest jedyną wartością, która ma znaczenie przy wyborze planu.
Przepustowość stanowi mniejszą część kosztów. Strumień 320 kbps to 40 kilobajtów na sekundę, więc godzina słuchania generuje około 144 MB ruchu. Sto godzin w miesiącu to około 14 GB, co nie jest zauważalne w limitach transferu żadnego VPS-a. Wyjątkiem jest pierwsza synchronizacja offline telefonu, która może wygenerować transfer rzędu dziesiątek gigabajtów w jeden wieczór.
Warstwa pamięci masowej czy warstwa obliczeniowa?
Serwer muzyczny to duży zbiór danych typu "cold data", który wymaga minimalnych zasobów obliczeniowych. Odczyt pliku z prędkością 40 kilobajtów na sekundę nie obciąża dysku, a procesor wykonuje realną pracę jedynie podczas skanowania biblioteki, transkodowania (które zazwyczaj nie jest wymagane) oraz wyodrębniania i buforowania okładek albumów – podczas skanowania lub przy pierwszym otwarciu elementu. Szybki dysk NVMe w planie obliczeniowym nie przynosi w tym przypadku żadnych korzyści, natomiast jego cena za gigabajt ogranicza możliwość przesyłania plików FLAC. Jest to sytuacja, w której serwer VPS typu storage przewyższa standardowy VPS, ponieważ plany te są wyceniane za terabajt, a nie za rdzeń procesora.
Zapotrzebowanie na pamięć operacyjną jest niewielkie. Navidrome obsługuje bibliotekę osobistą przy użyciu kilkuset megabajtów RAM, a szczytowe zużycie występuje podczas skanowania, a nie odtwarzania. Należy przydzielić jednostce 1 GB lub 2 GB pamięci RAM, a pozostałą część budżetu przeznaczyć na przestrzeń dyskową.
Instalacja Navidrome przy użyciu Docker Compose
Najpierw należy utworzyć katalogi, których właścicielem będzie identyfikator użytkownika uruchamiającego kontener. Jeśli Docker Compose jest nowym narzędziem, artykuł Docker Compose na VPS wyjaśnia założenia przyjęte w tym pliku.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicNależy utworzyć plik docker-compose.yml w osobnym katalogu:
services:
navidrome:
image: deluan/navidrome:0.64.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 psPolecenie docker compose ps powinno wskazywać, że usługa działa, a nie restartuje się w pętli. Kontener restartujący się w pętli niemal zawsze oznacza problem z uprawnieniami do /srv/navidrome, a docker compose logs navidrome wskazuje plik, do którego zapis nie był możliwy.
Cztery szczegóły w tym pliku wymagają wyjaśnienia. Port jest publikowany wyłącznie na 127.0.0.1, dzięki czemu serwer jest dostępny przez reverse proxy, a nie bezpośrednio z Internetu na porcie 4533: Docker samodzielnie zarządza regułami firewalla, więc zwykły wpis 4533:4533 pozostaje wystawiony na świat nawet na maszynie, gdzie ufw zgłasza blokowanie całego ruchu. Wolumen z muzyką jest montowany w trybie tylko do odczytu, co zapobiega usunięciu plików przez ewentualny błąd skanera. Opcja ND_SCANNER_SCHEDULE jest domyślnie wyłączona, a poradniki napisane przed wersją Navidrome 0.55 używają nazwy ND_SCANSCHEDULE, która została zmieniona w wersji 0.55. Trzy ustawienia kopii zapasowych aktywują wbudowany mechanizm backupu bazy danych, na którym opiera się sekcja dotycząca kopii zapasowych poniżej.
Przenoszenie muzyki na serwer
Skopiuj bibliotekę za pomocą rsync, co pozwala na wznowienie przesyłania w przypadku zerwania połączenia, zamiast rozpoczynania procesu od nowa.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/Użycie ukośnika na końcu ścieżki źródłowej jest istotne. Jego brak spowoduje /srv/music/Music. Po zakończeniu kopiowania należy poprawić uprawnienia:
sudo chown -R 1000:1000 /srv/music
id -uKontener działa z identyfikatorem użytkownika 1000, a punkt montowania jest w trybie tylko do odczytu, dlatego ten identyfikator musi posiadać uprawnienia do odczytu każdego pliku oraz uprawnienia do przeglądania każdego katalogu. Jeśli skopiowane pliki będą własnością innego konta z uprawnieniami blokującymi dostęp dla pozostałych użytkowników, skaner nie wykryje żadnych utworów, interfejs WWW pozostanie pusty, a w dzienniku pojawi się open /music: permission denied. Polecenie chown powyżej stanowi jedno z rozwiązań. Jeśli z folderu korzystają również inne programy, dokumentacja Docker dla Navidrome sugeruje nadanie uprawnień do odczytu bez zmiany właściciela: sudo chmod -R a+rX /srv/music. id -u wyświetla rzeczywisty identyfikator użytkownika, a sposób działania PUID i PGID w kontenerach Docker wyjaśnia szczegółowo mechanizm mapowania.
Reverse proxy i TLS zapewniające dostęp do telefonu z dowolnego miejsca
Skieruj rekord DNS A na VPS, a następnie wprowadź w Caddy trzy linie:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy występuje o certyfikat przy pierwszym żądaniu. Port 443 musi być otwarty. Caddy najpierw próbuje wyzwania ACME (automatic certificate management environment) HTTP na porcie 80, a w razie niepowodzenia przełącza się na wyzwanie TLS-ALPN na porcie 443, więc zamknięty port 80 nie blokuje certyfikatu. Mimo to pozostaw port 80 otwarty, ponieważ Caddy serwuje tam automatyczne przekierowanie z HTTP na HTTPS. W przypadku nginx dodaj proxy_buffering off; do bloku location: Navidrome przesyła zdarzenia postępu do interfejsu WWW za pomocą jednego długotrwałego połączenia, a przy włączonym buforowaniu interfejs oczekuje na odpowiedź, którą nginx wciąż przetrzymuje. Jeśli udostępniasz usługę pod ścieżką taką jak /music, zamiast pod własną subdomeną, ustaw ND_BASEURL na tę samą ścieżkę, w przeciwnym razie interfejs załaduje się jako pusta strona. Porównanie trzech popularnych serwerów proxy znajduje się w Nginx, Caddy i Traefik na VPS.
Otwórz stronę i utwórz pierwsze konto. Nie ma domyślnego hasła, a pierwszy odwiedzający jest proszony o utworzenie użytkownika administratora, więc zrób to, zanim udostępnisz komukolwiek adres. Następnie przetestuj dokładną ścieżkę, której używa klient mobilny:
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"Prawidłowa odpowiedź zaczyna się od {"subsonic-response":{"status":"ok" i wskazuje navidrome jako typ serwera. Treść zawierająca "status":"failed" oraz kod błędu 40 oznacza, że proxy działa poprawnie, a dane uwierzytelniające są błędne. Błąd certyfikatu na tym etapie należy naprawić w pierwszej kolejności, ponieważ większość klientów mobilnych odrzuca nieprawidłowy certyfikat komunikatem, który nie dostarcza użytkownikowi żadnych informacji.
Dlaczego biblioteka wygląda nieprawidłowo po pierwszym skanowaniu
Navidrome przegląda pliki na podstawie tagów, a nie struktury folderów, dlatego to tagi decydują o sposobie wyświetlania. Utwór bez tagu album artist jest przypisywany do wykonawcy utworu (track artist), co powoduje, że składanka z różnymi wykonawcami na każdym utworze staje się dwudziestoma albumami po jednym utworze każdy. Należy to poprawić w plikach, a nie w Navidrome: MusicBrainz Picard oraz beets wyszukują album w bazie danych MusicBrainz i zapisują standardowe tagi w plikach.
Navidrome rozdziela również tagi wielu wykonawców na osobnych artystów, więc nazwa zespołu zawierająca separator jest błędnie dzielona; przykładem, z którym spotyka się każdy, jest AC/DC. ND_SCANNER_ARTISTSPLITEXCEPTIONS przechowuje nazwy, które nigdy nie powinny być dzielone.
Nowe pliki są wykrywane przez mechanizm śledzenia zmian (file watcher) kilka sekund po ich zapisaniu. Mechanizm ten polega na powiadomieniach jądra o zmianach, które nie docierają w przypadku plików zapisywanych na udziale sieciowym zamontowanym z innej maszyny. W takiej konfiguracji to okresowe ND_SCANNER_SCHEDULE utrzymuje aktualność biblioteki. Pełne ponowne skanowanie odczytuje tagi każdego pliku, co przy dużej bibliotece jest powolne, dlatego warto chronić bazę danych opisaną poniżej.
Użytkownicy, playlisty i udostępnianie
Administrator tworzy pozostałe konta w interfejsie webowym; rejestracja samodzielna nie jest dostępna. Każdy użytkownik posiada oddzielne statystyki odtworzeń, playlisty, ulubione utwory oraz oceny, dzięki czemu domownicy nie współdzielą jednego profilu preferencji.
Playlisty pochodzą z dwóch źródeł. Playlisty utworzone w kliencie są przechowywane w bazie danych. Plik .m3u umieszczony w folderze biblioteki jest importowany podczas skanowania; jest to najprostszy sposób na przeniesienie playlist z odtwarzacza stacjonarnego. Inteligentne playlisty to pliki .nsp, czyli niewielkie pliki z regułami w formacie JSON, importowane w ten sam sposób; aktualizują się one automatycznie wraz ze zmianami w bibliotece.
Udostępnianie jest domyślnie włączone od wersji 0.63.0, wydanej w lipcu 2026 roku. Funkcja ta pozwala użytkownikowi wygenerować publiczny link do albumu, który może otworzyć każdy bez konieczności logowania. W przypadku serwera przechowującego całą bibliotekę może to być niepożądane; ustawienie ND_ENABLESHARING na false wyłącza tę funkcję.
Tworzenie kopii zapasowej bazy danych oddzielnie od plików muzycznych
Własny mechanizm kopii zapasowych Navidrome obejmuje wyłącznie bazę danych. Dokumentacja jasno określa, że proces ten zabezpiecza bazę danych, czyli użytkowników, statystyki odtworzeń i pozostałe metadane, natomiast nie obejmuje plików muzycznych ani konfiguracji. Takie rozdzielenie jest właściwym podejściem, ponieważ oba te elementy ulegają awariom w różny sposób. Pliki muzyczne można ponownie skopiować z nośnika, z którego zostały zgrane. Statystyki odtworzeń, oceny, ulubione utwory oraz playlisty nie istnieją nigdzie indziej, a ponowne skanowanie biblioteki ich nie przywróci.
Plik Compose automatycznie tworzy nocną kopię w /data/backup i przechowuje siedem ostatnich wersji. Przed aktualizacją należy ręcznie wykonać kopię zapasową:
sudo docker compose run --rm navidrome backup createPrzejście z wersji 0.63 na 0.64 jest aktualizacją, która najbardziej tego wymaga. Wersja 0.64.0 dokonuje ponownego kodowania każdego wewnętrznego identyfikatora w ramach migracji obejmującej wszystkie tabele, co może wymagać ponownej synchronizacji przez klientów przechowujących pliki offline.
Przywracanie danych usuwa bieżącą bazę danych i kopiuje w jej miejsce plik kopii zapasowej; operacja ta musi zostać przeprowadzona przy zatrzymanym procesie Navidrome. Przywracanie danych na działającym serwerze nie jest bezpieczne.
Pliki te nadal znajdują się na tym samym serwerze VPS, więc nie przetrwają jego awarii. Należy regularnie przesyłać zawartość /srv/navidrome na inną maszynę lub do pamięci obiektowej, do czego przeznaczone są narzędzia restic i BorgBackup. Cały katalog zajmuje niewiele miejsca, zazwyczaj znacznie poniżej jednego gigabajta, więc codzienna, zaszyfrowana kopia poza serwerem jest niemal bezkosztowa i pozwala odzyskać wszystko to, czego nie przywróci ponowne skanowanie.
FAQ
Czy muszę transkodować muzykę na VPS?
Prawie nigdy. Telefony samodzielnie dekodują formaty MP3, AAC, Opus oraz FLAC, podobnie jak współczesne przeglądarki na większości systemów, więc serwer przesyła plik w postaci oryginalnej, zużywając znikome zasoby procesora. Należy sprawdzić przeglądarki: Firefox odtwarza AAC tylko wtedy, gdy system operacyjny lub zewnętrzna biblioteka dostarcza dekoder, więc biblioteka AAC w odtwarzaczu internetowym może wymagać transkodowanego strumienia. Przypadkiem, w którym warto włączyć tę funkcję, jest biblioteka FLAC przesyłana przez dane mobilne, gdzie konwersja z około 900 kbps do formatu Opus przy 128 kbps redukuje zużycie danych około siedmiokrotnie. Navidrome zarządza transkodowaniem po stronie serwera od wersji 0.61: wykrywa kodeki obsługiwane przez klienta, stosuje domyślne wartości bitrate zależne od formatu i pozwala ograniczyć bitrate dla poszczególnych odtwarzaczy.
Dlaczego aplikacja w telefonie nie może pobrać muzyki do słuchania offline?
Ponieważ przechowywanie offline jest funkcją klienta, a nie serwera. API Subsonic pozwala każdemu klientowi pobrać cały plik, ale to aplikacja decyduje, czy zachować kopię w telefonie. Należy sprawdzić katalog klientów na stronie navidrome.org/apps i wybrać taki, którego opis wspomina o pobieraniu offline lub buforowaniu. Niektórzy klienci buforują tylko to, co zostało już odtworzone, co nie jest równoznaczne z synchronizacją albumu przed podróżą.
Dlaczego po skanowaniu jeden album rozdzielił się na kilka?
Brakuje znacznika album artist lub jest on niespójny w obrębie utworów. Navidrome grupuje pliki według znaczników, a nie folderów, więc dwanaście utworów z dwunastoma różnymi wartościami artysty i brakiem wspólnego znacznika album artist wygląda jak dwanaście albumów. Należy ustawić znacznik album artist dla każdego utworu w albumie, zazwyczaj na Various Artists w przypadku składanek, a następnie pozwolić na ponowne skanowanie. Narzędzia MusicBrainz Picard lub beets wykonają to dla całego folderu jednocześnie.
Czy samodzielnie hostowany streaming muzyki zastępuje Spotify?
Zastępuje odtwarzacz i bibliotekę, a nie katalog. Użytkownik otrzymuje własną kolekcję na każdym urządzeniu, z listami odtwarzania i statystykami odtworzeń, których żadna zmiana licencyjna nie może odebrać. Nie otrzymuje się nowych wydań ani rekomendacji budowanych na podstawie nawyków innych osób. Większość osób prowadzących takie rozwiązanie kupuje muzykę i utrzymuje tanie konto w serwisie streamingowym w celu odkrywania nowości.