Zelf muziek streamen vanaf een eigen VPS
Bouw uw eigen muziekserver met Navidrome op een VPS. Leer hoe u opslag beheert, de Subsonic API gebruikt, TLS configureert en uw muziekcollectie veilig offline synchroniseert.
Wat zelfgehoste muziekstreaming op een VPS u oplevert
Zelfgehoste muziekstreaming op een VPS betekent dat u de speler beheert en zelf de muziek aanlevert. De server bevat bestanden die u reeds bezit en elke telefoon kan deze via internet bereiken met een normale login. Wees eerlijk over de afweging voordat u begint: dit vervangt de speler van een streamingdienst, niet de catalogus. Er verschijnt niets nieuws in uw bibliotheek totdat u het koopt of ript en het bestand naar de server kopieert.
Audio is veel minder belastend voor een server dan video. De bestanden zijn klein, telefoons decoderen elk gangbaar formaat zonder hulp en één luisteraar verbruikt minder bandbreedte dan een videogesprek. CPU is hier het eenvoudige onderdeel. Schijfruimte is de werkelijke beperkende factor. De andere twee zaken die bepalen of dit werkt, zijn de kwaliteit van uw tags en of uw telefoon-app muziek kan downloaden voor offline gebruik.
Welke muziekserver: Navidrome, Jellyfin of Funkwhale?
Navidrome is de standaardkeuze wanneer u alleen om audio geeft. Het is één Go-binary in één container en het houdt de status bij in één SQLite-database. Het ondersteunt de Subsonic API, wat de reden is dat er een grote familie aan externe telefoon-apps bestaat. Versie 0.63.2 was actueel in augustus 2026. Het project beschrijft dat het goed draait op hardware zo klein als een Raspberry Pi Zero, dus de serversoftware is niet het onderdeel waarvoor u zult betalen.
Jellyfin is het overwegen waard als u al Jellyfin als mediaserver op een VPS draait voor video. De muziekbibliotheek werkt en Finamp is een Jellyfin-muziek-app voor Android en iOS die nummers downloadt voor offline luisteren. De beperking is de API. Jellyfin heeft geen ingebouwd Subsonic-eindpunt en de community-plugin die er een toevoegde, wordt sinds 2022 niet meer bijgewerkt, waardoor het Subsonic-app-ecosysteem voor Jellyfin gesloten is. U gebruikt in plaats daarvan de apps die de eigen API van Jellyfin spreken, en daarvan zijn er minder.
Funkwhale is de gefedereerde optie en versie 2.0 werd uitgebracht in maart 2026. Een Funkwhale-server wordt een pod genoemd, pods federeren via ActivityPub (het protocol achter Mastodon) en een gebruiker op de ene pod kan een openbare bibliotheek op een andere volgen. Het ondersteunt ook een deel van de Subsonic API, met één verschil dat het vermelden waard is: elke gebruiker stelt een apart Subsonic-wachtwoord in in de eigen instellingen, omdat het Subsonic-protocol een wachtwoord verwacht dat de server kan teruglezen. Funkwhale is een zwaardere installatie, aangezien het naast de web-app ook PostgreSQL en een takenwachtrij vereist.
Kies Navidrome tenzij u federatie wilt of tenzij Jellyfin al draait. De rest van deze handleiding stelt Navidrome in met Docker.
Waarom de Subsonic API bepaalt welke telefoon-app u gebruikt
Subsonic was een muziekserver waarvan de HTTP API de gemeenschappelijke taal werd voor zelfgehoste audio, en OpenSubsonic is het communityproject dat deze API blijft uitbreiden. Die geschiedenis is de reden waarom u op uw telefoon keuzemogelijkheden heeft. Navidrome levert zelf geen mobiele app en heeft die ook niet nodig, omdat elke Subsonic-client inlogt met een serveradres en uw accountgegevens.
Dit is vooral van belang voor offline synchronisatie, de functie die bepaalt of de opstelling geschikt is voor dagelijks gebruik. Een telefoon in een tunnel kan uw server niet bereiken, dus moet de client de bestanden vooraf naar de lokale opslag hebben gekopieerd. Elke client streamt. Slechts enkele downloaden. De client-directory op navidrome.org/apps geeft aan welke dit doen, en de keuze is ruim op beide platforms: Substreamer en Ultrasonic op Android, Amperfy en play:Sub op iOS. Verschillende van de krachtigste clients zijn betaalde apps, en Symfonium op Android is degene die mensen het vaakst noemen. Installeer er twee voordat u een beslissing neemt, want dit is het onderdeel van het systeem dat u dagelijks gebruikt.
Hoeveel opslagruimte heeft een muziekbibliotheek nodig?
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"
}
]Dit zijn schattingen op basis van de bitrate, geen metingen van een daadwerkelijke collectie. De berekening is eenvoudig genoeg om te controleren aan de hand van uw eigen bestanden. Reken voor een album met 45 minuten, wat neerkomt op 2.700 seconden. Vermenigvuldig de bitrate in kilobits per seconde met 2.700 en deel het resultaat door 8.000 om het aantal megabytes te verkrijgen. Bij 320 kbps geeft dit 108 MB voor één album; duizend albums nemen dus ongeveer 108 GB in beslag.
Bij lossless-bestanden verandert het antwoord. FLAC van cd-kwaliteit haalt gemiddeld bijna 900 kbps bij standaardmateriaal, waardoor diezelfde duizend albums ongeveer 304 GB vereisen. Een bibliotheek met 24-bit, 96 kHz-bestanden loopt op tot ongeveer 1,013 GB, oftewel een volledige terabyte voor een collectie die u op papier zou kunnen noteren. Een voor telefoons geschikte Opus-kopie op 128 kbps past diezelfde duizend albums in 43 GB. Voer du -sh /path/to/music uit op de bibliotheek die u al bezit, aangezien uw eigen gemiddelde bitrate het enige getal is dat ertoe doet bij het kiezen van een abonnement.
Bandbreedte is het kleinste deel van de kosten. Een stream van 320 kbps verbruikt 40 kilobytes per seconde, dus een uur luisteren verplaatst ongeveer 144 MB. Honderd uur per maand komt neer op ongeveer 14 GB, wat binnen de datalimiet van elke VPS valt. De uitzondering is de eerste offline synchronisatie van een telefoon, die op één avond tientallen gigabytes kan verbruiken.
Opslag- of compute-tier?
Een muziekserver is een grote verzameling koude data waarbij nauwelijks rekenkracht nodig is. Het lezen van een bestand met 40 kilobytes per seconde belast een schijf nauwelijks, en de CPU is alleen actief tijdens een library-scan of tijdens transcoding, wat u meestal niet zult doen. De snelle NVMe op een compute-plan biedt hier dus geen voordeel, terwijl de prijs per gigabyte de factor is die u beperkt bij het uploaden van FLAC-bestanden. Dit is een situatie waarin een storage-VPS beter is dan een reguliere VPS, omdat deze abonnementen geprijsd zijn per terabyte in plaats van per core.
Het geheugenverbruik is bescheiden. Navidrome bedient een persoonlijke bibliotheek met enkele honderden megabytes, en de scan vormt de piekbelasting in plaats van het afspelen. Geef de server 1 GB of 2 GB RAM en besteed de rest van het budget aan schijfruimte.
Navidrome installeren met Docker Compose
Maak eerst de mappen aan, met het eigendom van de gebruikers-ID waaronder de container zal draaien. Als Compose nieuw voor u is, behandelt Docker Compose op een VPS de aannames van dit bestand.
sudo install -d -m 755 -o 1000 -g 1000 /srv/navidrome /srv/musicSchrijf docker-compose.yml in een eigen map, zonder verdere toevoegingen:
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 hoort de service als actief te tonen in plaats van als herstartend. Een container die in een lus herstart, heeft bijna altijd een probleem met de rechten op /srv/navidrome, en docker compose logs navidrome benoemt het bestand waarnaar niet geschreven kon worden.
Vier details in dat bestand zijn een toelichting waard. De poort wordt alleen op 127.0.0.1 gepubliceerd, zodat de server bereikbaar is via de reverse proxy en niet op poort 4533 vanaf het open internet: Docker schrijft zijn eigen firewallregels, waardoor een standaard 4533:4533 blootgesteld blijft, zelfs op een systeem waar ufw alles als geweigerd rapporteert. Het muziekvolume is alleen-lezen, wat betekent dat een bug in de scanner uw enige kopie niet kan verwijderen. ND_SCANNER_SCHEDULE is standaard uitgeschakeld, en handleidingen geschreven vóór Navidrome 0.55 noemen het ND_SCANSCHEDULE, een naam die niet langer bestaat. De drie back-upinstellingen schakelen de ingebouwde database-back-up in waar de back-upsectie hieronder op vertrouwt.
Plaats uw muziek op de server
Kopieer de bibliotheek naar de server met rsync. Dit hulpprogramma hervat de overdracht bij een verbroken verbinding in plaats van opnieuw te beginnen.
rsync -av --info=progress2 ~/Music/ user@music.example.com:/srv/music/De afsluitende slash bij de bron is van belang. Zonder deze slash krijgt u /srv/music/Music. Wanneer het kopiëren is voltooid, corrigeert u het eigenaarschap:
sudo chown -R 1000:1000 /srv/music
id -uDe container draait onder gebruikers-ID 1000 en de mount is alleen-lezen, dus elk bestand moet leesbaar zijn voor dit ID. Als uw SSH-account op de VPS niet het UID 1000 heeft, komen de bestanden in het bezit van een andere gebruiker. De scan vindt dan nul nummers en de webinterface blijft leeg. id -u toont uw werkelijke ID, en hoe PUID en PGID werken in Docker-containers legt de mapping volledig uit.
Een reverse proxy en TLS zodat de telefoon overal werkt
Wijs een DNS A-record naar de VPS en geef Caddy vervolgens drie regels:
music.example.com {
reverse_proxy 127.0.0.1:4533
}sudo systemctl reload caddyCaddy vraagt het certificaat aan bij het eerste verzoek. Poort 80 en 443 moeten beide openstaan, omdat de ACME (automatic certificate management environment) challenge op poort 80 wordt beantwoord. Voeg bij nginx proxy_buffering off; toe aan het location-blok: Navidrome verstuurt voortgangsgebeurtenissen naar de webinterface via één langdurige verbinding. Als buffering is ingeschakeld, blijft de interface wachten op een antwoord dat nginx nog vasthoudt. Als u de service serveert onder een pad zoals /music in plaats van een eigen subdomein, stel dan ND_BASEURL in op hetzelfde pad, anders laadt de interface als een lege pagina. De drie gangbare proxies worden vergeleken in Nginx, Caddy en Traefik op een VPS.
Open de site en maak het eerste account aan. Er is geen standaardwachtwoord en de eerste bezoeker wordt gevraagd de admin-gebruiker aan te maken; doe dit dus voordat u het adres aan anderen doorgeeft. Test vervolgens het exacte pad dat een telefoonclient gebruikt:
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"Een correct antwoord begint met {"subsonic-response":{"status":"ok" en noemt navidrome als servertype. Een body die "status":"failed" en foutcode 40 bevat, betekent dat de proxy correct werkt en de inloggegevens onjuist zijn. Een certificaatfout in deze stap moet als eerste worden opgelost, omdat de meeste telefoonclients een ongeldig certificaat afwijzen met een melding die de gebruiker geen bruikbare informatie geeft.
Waarom uw bibliotheek er na de eerste scan onjuist uitziet
Navidrome bladert op basis van tags in plaats van mappen, dus de tags bepalen wat u ziet. Een nummer zonder 'album artist'-tag wordt onder de 'track artist' ingedeeld; dit is de reden waarom een verzamelalbum met voor elk nummer een andere artiest verandert in twintig albums met elk één nummer. Corrigeer dit in de bestanden zelf, niet in Navidrome: MusicBrainz Picard en beets zoeken beide een album op in de MusicBrainz-database en schrijven de standaard tags terug.
Navidrome splitst ook een 'multi artist'-tag in afzonderlijke artiesten, waardoor een bandnaam die een scheidingsteken bevat per ongeluk wordt gesplitst; AC/DC is het voorbeeld dat iedereen tegenkomt. ND_SCANNER_ARTISTSPLITEXCEPTIONS bevat de namen die nooit gesplitst mogen worden.
Nieuwe bestanden worden enkele seconden nadat ze zijn geplaatst opgepikt door een file watcher. De watcher is afhankelijk van kernel-wijzigingsmeldingen, en deze komen niet aan voor bestanden die zijn geschreven op een netwerkshare die vanaf een andere machine is gemount. Bij dat type configuratie is de periodieke ND_SCANNER_SCHEDULE daarom wat de bibliotheek actueel houdt. Een volledige rescan leest de tags van elk bestand, wat traag is bij een grote bibliotheek, en dat is een van de redenen waarom de onderliggende database het beschermen waard is.
Gebruikers, afspeellijsten en delen
Een beheerder maakt de overige accounts aan in de webinterface; zelfregistratie is niet mogelijk. Elke gebruiker krijgt afzonderlijke afspeeltellingen, afspeellijsten, favorieten en beoordelingen, zodat een huishouden niet één gezamenlijk smaakprofiel deelt.
Afspeellijsten komen op twee manieren tot stand. Een afspeellijst die in een client is gemaakt, wordt opgeslagen in de database. Een .m3u-bestand dat in de bibliotheekmap wordt geplaatst, wordt tijdens de scan geïmporteerd; dit is de eenvoudigste manier om afspeellijsten over te zetten vanaf een desktopspeler. Slimme afspeellijsten zijn .nsp-bestanden, kleine JSON-regelbestanden die op dezelfde wijze worden geïmporteerd en die zichzelf bijwerken naarmate de bibliotheek verandert.
Delen is standaard ingeschakeld vanaf versie 0.63.0, uitgebracht in juli 2026. Hiermee kan een gebruiker een openbare link naar een album maken die iedereen kan openen zonder in te loggen. Op een server die uw volledige bibliotheek bevat, is dit mogelijk niet gewenst; door ND_ENABLESHARING in te stellen op false wordt deze functie uitgeschakeld.
Maak een back-up van de database los van de muziekbestanden
De back-up van Navidrome zelf dekt alleen de database. De documentatie is hier duidelijk over: het back-upproces slaat de database op, inclusief gebruikers, afspeeltellingen en overige gegevens, maar het slaat de muziek of de configuratie niet op. Deze scheiding is de juiste manier om dit te benaderen, omdat beide onderdelen op verschillende manieren kunnen falen. Muziekbestanden kunnen opnieuw worden gekopieerd vanaf de schijf waarvan u ze heeft geript. Afspeeltellingen, beoordelingen, favorieten en afspeellijsten bestaan nergens anders en een nieuwe scan haalt deze niet terug.
Het compose-bestand schrijft al een dagelijkse kopie naar /data/backup en bewaart er zeven. Maak handmatig een kopie voor een upgrade:
sudo docker compose run --rm navidrome backup createEen herstelactie wist de huidige database en kopieert de back-up naar die locatie; dit moet gebeuren terwijl Navidrome is gestopt. Een herstelactie is niet veilig op een actieve server.
Deze bestanden staan nog steeds op dezelfde VPS, dus ze overleven het uitvallen van de VPS niet. Verplaats /srv/navidrome volgens een schema naar een andere machine of naar object storage; dit is de taak waarvoor restic en BorgBackup zijn ontworpen. De gehele map is klein, meestal ruim onder een gigabyte, dus een dagelijkse versleutelde kopie buiten de server kost bijna niets en herstelt alles wat een nieuwe scan niet kan terughalen.
FAQ
Moet ik muziek transcoderen op een VPS?
Bijna nooit. Telefoons en browsers decoderen MP3, AAC, Opus en FLAC zelfstandig, waardoor de server het bestand ongewijzigd verstuurt en vrijwel geen CPU verbruikt. Er is één scenario waarin dit nuttig is: een FLAC-bibliotheek die via mobiele data wordt gestreamd. Het converteren van ongeveer 900 kbps naar Opus op 128 kbps vermindert het dataverbruik met ongeveer een factor zeven. Navidrome kan dit per gebruiker en per speler instellen, en de functie blijft uitgeschakeld totdat u deze activeert.
Waarom kan mijn telefoon-app geen muziek downloaden voor offline luisteren?
Omdat offline opslag een functie van de client is, niet van de server. De Subsonic API staat elke client toe om een volledig bestand op te halen, maar de app bepaalt of er een kopie op de telefoon wordt bewaard. Controleer de client-directory op navidrome.org/apps en kies een app waarvan de beschrijving offline downloads of caching vermeldt. Sommige clients cachen alleen wat u al heeft afgespeeld; dit is niet hetzelfde als het synchroniseren van een album voor een reis.
Waarom is één album na de scan opgesplitst in meerdere albums?
De tag voor albumartiest ontbreekt of is inconsistent over de tracks heen. Navidrome groepeert op basis van tags in plaats van mappen. Twaalf tracks met twaalf verschillende artiestwaarden en zonder gedeelde albumartiestwaarde worden daarom als twaalf albums weergegeven. Stel de tag voor albumartiest in op elke track van het album, meestal op Various Artists voor een verzamelalbum, en laat de scan opnieuw uitvoeren. MusicBrainz Picard of beets kunnen dit voor een hele map tegelijk doen.
Vervangt zelfgehoste muziekstreaming Spotify?
Het vervangt de speler en de bibliotheek, niet de catalogus. U beschikt over uw eigen collectie op elk apparaat, met afspeellijsten en afspeeltellers die door geen enkele licentiewijziging van u kunnen worden afgenomen. U krijgt geen nieuwe releases en u krijgt geen aanbevelingen op basis van het luistergedrag van anderen. De meeste gebruikers die dit draaien, kopen hun muziek en houden een goedkoop streaming-abonnement aan voor het ontdekken van nieuwe muziek.