SSD Nodes Learn 🎉 VPS od $5.50/mies.
Przewodniki Matt ConnorAutor: Matt Connor

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.

Wybór serwera muzycznego: Navidrome, Jellyfin czy Funkwhale?

Navidrome to domyślny wybór, jeśli priorytetem jest wyłącznie obsługa plików audio. Aplikacja składa się z jednego pliku binarnego Go w jednym kontenerze, a jej stan przechowywany jest w pojedynczej bazie danych SQLite. Serwer obsługuje API Subsonic, co stanowi przyczynę dostępności szerokiej gamy zewnętrznych aplikacji mobilnych. Wersja 0.63.2 była aktualna w sierpniu 2026 roku. Projekt charakteryzuje się niskim zapotrzebowaniem na zasoby, co pozwala na uruchomienie go nawet na Raspberry Pi Zero, zatem oprogramowanie serwerowe nie generuje kosztów sprzętowych.

Jellyfin jest rozwiązaniem wartym uwagi, jeśli użytkownik korzysta już z Jellyfin jako serwer multimediów na VPS do obsługi wideo. Biblioteka muzyczna działa poprawnie, a Finamp, aplikacja muzyczna dla Jellyfin na systemy Android i iOS, umożliwia pobieranie utworów do odsłuchu offline. Ograniczeniem jest API. Jellyfin nie posiada wbudowanego punktu końcowego Subsonic, a społecznościowa wtyczka dodająca tę funkcjonalność przestała być aktualizowana w 2022 roku, przez co ekosystem aplikacji Subsonic jest dla tego serwera niedostępny. Należy korzystać z aplikacji obsługujących natywne API Jellyfin, których wybór jest mniejszy.

Funkwhale to opcja sfederowana, której wersja 2.0 została wydana w marcu 2026 roku. Serwer Funkwhale określany jest mianem pod. Pody federują się za pośrednictwem protokołu ActivityPub (wykorzystywanego również przez Mastodon), co pozwala użytkownikowi jednego poda na obserwowanie publicznej biblioteki na innym. Serwer obsługuje również część API Subsonic, przy czym istotna jest jedna różnica: każdy użytkownik ustawia osobne hasło Subsonic w swoich ustawieniach, ponieważ protokół Subsonic wymaga hasła, które serwer może odczytać. Instalacja Funkwhale jest bardziej wymagająca, gdyż poza aplikacją webową wymaga ona PostgreSQL oraz kolejki zadań.

Należy wybrać Navidrome, chyba że wymagana jest federacja lub Jellyfin jest już uruchomiony. Dalsza część 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?

ChartStorage per 1,000 albums by audio format
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"
  }
]

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 nie wymaga niemal żadnych zasobów obliczeniowych. Odczyt pliku z prędkością 40 kilobajtów na sekundę nie obciąża dysku, a procesor pracuje jedynie podczas skanowania biblioteki lub transkodowania, co w większości przypadków nie będzie konieczne. Szybki dysk NVMe w planie obliczeniowym nie przynosi tu żadnych korzyści, a jego cena za gigabajt ogranicza możliwość przesyłania kopii w formacie 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 skanowanie jest procesem bardziej wymagającym niż samo odtwarzanie. Należy przydzielić jednostce 1 GB lub 2 GB pamięci RAM, a pozostałą część budżetu przeznaczyć na dysk.

Instalacja Navidrome przy użyciu Docker Compose

Najpierw należy utworzyć katalogi, których właścicielem będzie identyfikator użytkownika, na którym uruchomiony zostanie kontener. Jeśli Docker Compose jest nowym narzędziem, 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/music

Należy utworzyć plik docker-compose.yml w osobnym katalogu, nie dodając tam żadnych innych plików:

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:ro
docker compose up -d
docker compose ps

Polecenie 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 nazwę pliku, do którego nie można było zapisać danych.

Cztery szczegóły w tym pliku wymagają wyjaśnienia. Port jest publikowany wyłącznie na 127.0.0.1, dzięki czemu serwer jest osiągalny przez reverse proxy, a nie bezpośrednio z Internetu na porcie 4533: Docker samodzielnie zarządza regułami firewalla, więc zwykłe 4533:4533 pozostaje wystawione na świat, nawet jeśli ufw zgłasza, że wszystko jest zablokowane. Wolumen z muzyką jest montowany w trybie tylko do odczytu, co oznacza, że błąd skanera nie doprowadzi do usunięcia posiadanej kopii plików. Opcja ND_SCANNER_SCHEDULE jest domyślnie wyłączona, a poradniki napisane przed wersją Navidrome 0.55 używają nazwy ND_SCANSCHEDULE, która już nie istnieje. Trzy ustawienia kopii zapasowych aktywują wbudowany mechanizm backupu bazy danych, na którym opiera się sekcja dotycząca tworzenia 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 do plików:

sudo chown -R 1000:1000 /srv/music
id -u

Kontener działa z identyfikatorem użytkownika 1000, a punkt montowania jest w trybie tylko do odczytu, więc każdy plik musi być dostępny dla tego identyfikatora. Jeśli konto SSH na VPS nie posiada uid 1000, skopiowane pliki będą należeć do innego użytkownika, przez co skanowanie nie wykryje żadnych utworów, a interfejs WWW pozostanie pusty. Polecenie id -u wyświetla bieżący identyfikator użytkownika, a jak działają PUID i PGID w kontenerach Docker zawiera szczegółowe wyjaśnienie mapowania.

Reverse proxy i TLS dla zdalnego dostępu z telefonu

Skieruj rekord DNS typu A na adres VPS, a następnie dodaj w Caddy trzy linie:

music.example.com {
    reverse_proxy 127.0.0.1:4533
}
sudo systemctl reload caddy

Caddy występuje o certyfikat przy pierwszym żądaniu. Porty 80 oraz 443 muszą być otwarte, ponieważ wyzwanie ACME (automatic certificate management environment) jest obsługiwane na porcie 80. 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 usługa jest serwowana pod ścieżką taką jak /music, a nie jako osobna subdomena, 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 istnieje domyślne hasło, a pierwszy użytkownik jest proszony o utworzenie konta administratora, dlatego wykonaj tę czynność przed udostępnieniem adresu. Następnie przetestuj ścieżkę, z której korzysta 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 podane dane uwierzytelniające są błędne. Błąd certyfikatu na tym etapie należy usunąć w pierwszej kolejności, ponieważ większość klientów mobilnych odrzuca nieprawidłowy certyfikat, wyświetlając użytkownikowi niejasny komunikat.

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 wskazuje, że proces ten zabezpiecza bazę danych, czyli użytkowników, statystyki odtworzeń i pozostałe metadane, ale 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 źródłowego. 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ą warto ręcznie wykonać kopię zapasową:

sudo docker compose run --rm navidrome backup create

Przywracanie danych usuwa bieżącą bazę i zastępuje ją kopią, dlatego operacja ta musi być przeprowadzana przy zatrzymanym Navidrome. Przywracanie danych na działającym serwerze nie jest bezpieczne.

Pliki te nadal znajdują się na tym samym VPS, więc nie przetrwają awarii całego serwera. Należy regularnie przesyłać /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 codzienne tworzenie zaszyfrowanej kopii poza serwerem jest niemal bezkosztowe i pozwala odzyskać dane, których nie da się odtworzyć przez ponowne skanowanie.

FAQ

Czy muszę transkodować muzykę na VPS?

Prawie nigdy. Telefony i przeglądarki samodzielnie dekodują formaty MP3, AAC, Opus oraz FLAC, więc serwer przesyła plik w postaci oryginalnej, zużywając znikome zasoby procesora. Istnieje jeden przypadek, w którym warto to włączyć: biblioteka FLAC przesyłana przez sieć komórkową. Konwersja z około 900 kbps do formatu Opus przy 128 kbps zmniejsza zużycie danych około siedmiokrotnie. Navidrome umożliwia konfigurację tej opcji dla każdego użytkownika i odtwarzacza z osobna; domyślnie funkcja ta pozostaje wyłączona.

Dlaczego aplikacja w telefonie nie może pobrać muzyki do słuchania offline?

Ponieważ przechowywanie plików 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 pamięci telefonu. Należy sprawdzić listę klientów pod adresem navidrome.org/apps i wybrać taki, którego opis wspomina o pobieraniu offline lub buforowaniu. Niektóre aplikacje buforują tylko to, co zostało już odtworzone, co nie jest równoznaczne z synchronizacją całego albumu przed podróżą.

Dlaczego po skanowaniu jeden album rozdzielił się na kilka osobnych?

Brakuje znacznika album artist lub jest on niespójny w obrębie utworów. Navidrome grupuje muzykę według tagów, a nie folderów. W rezultacie dwanaście utworów z dwunastoma różnymi wartościami artysty i brakiem wspólnego znacznika album artist jest interpretowanych jako dwanaście oddzielnych albumów. Należy ustawić znacznik album artist dla każdego utworu w albumie (w przypadku składanek zazwyczaj na Various Artists), a następnie wymusić ponowne skanowanie. Narzędzia takie jak MusicBrainz Picard lub beets pozwalają wykonać tę operację dla całego folderu jednocześnie.

Czy własny serwer muzyczny zastępuje Spotify?

Zastępuje odtwarzacz i bibliotekę, ale nie katalog utworów. Użytkownik otrzymuje własną kolekcję na każdym urządzeniu, z playlistami i statystykami odtworzeń, których nie usunie żadna zmiana licencyjna. Nie otrzymuje się jednak nowych wydań ani rekomendacji opartych na gustach innych osób. Większość osób prowadzących własny serwer kupuje muzykę, zachowując jednocześnie tanią subskrypcję w serwisie streamingowym do odkrywania nowości.

#navidrome#music#streaming#self-hosting#media-server