Navidrome selbst hosten: Die Spotify-Alternative für deine eigene Musik
Musikstreaming-Abos kosten Geld, liefern verlustbehaftete Kompression und können jederzeit Titel aus dem Katalog werfen. Navidrome dreht das um: Deine Musiksammlung – als FLAC, MP3 oder Opus – wird auf deinem Server gespielt, gestreamt und verwaltet. Dank der Subsonic-API funktionieren praktisch alle gängigen Player-Apps damit. Wir richten den kompletten Stack mit Docker Compose ein und erklären jede Einstellung der Konfiguration.
Warum Navidrome?
Navidrome ist ein freier, quelloffener Musik-Streaming-Server (Go + React) – im Kern eine „Spotify-ähnliche“ Weboberfläche für deine eigene Sammlung:
- Deine Dateien, dein Sound: lossless (FLAC) statt komprimiert, keine Region-Limits, keine Katalog-Lücken.
- Modernes Web-UI mit Suchen, Playlists, Favoriten, Alben-/Künstler-Ansicht und „Radio“-Funktionen (Ähnliche Titel, Mixe).
- Subsonic-API: das De-facto-Protokoll der Self-Hosting-Szene – kompatibel mit Sonixd, Symfonium, play:Sub, Amperfy, Feishin u. v. m.
- Mehrbenutzer-fähig: jedes Familienmitglied bekommt sein eigenes Konto mit eigener Playlist-Historie und eigenen Favoriten.
- Schlank im Betrieb: ein einzelner Container, SQLite-Datenbank, kein extra Datenbankserver nötig.
Die unten gezeigte Konfiguration ist unsere produktive Variante: Web-UI nur auf dem Loopback hinter einem Reverse Proxy, Musik schreibgeschützt eingebunden und mit CPU-/RAM-Limits, damit der Musikserver dem Rest des Hosts nie in die Quere kommt.
Vorbereitung: Musik, Tags & Dateirechte
mkdir -p ~/navidrome/data ~/navidrome/music && cd ~/navidrome
# Struktur:
# ~/navidrome/
# ├── docker-compose.yml
# ├── data/ ← Navidrome-Datenbank, Bilder, Cache (beschreibbar!)
# └── music/ ← deine Musik (read-only eingebunden)
Zwei Dinge entscheiden über den Erfolg des Setups – und beide liegen vor dem ersten Start:
-
Ordner-Rechte: Der Container läuft mit
user: 1000:1000– der Nutzer (UID 1000) muss also Eigentümer vondata/sein, sonst kann Navidrome die Datenbank nicht anlegen. Prüfen:id -u && id -g(bei abweichender UID den Wert in der Compose-Datei anpassen). -
Metadaten (Tags): Navidrome liest Interpreten, Alben, Titel und Cover aus den
Tags deiner Dateien – nicht aus Dateinamen. Eine Sammlung mit konsistenten ID3-/Vorbis-Tags
(am besten kuratiert mit MusicBrainz Picard)
erspart dir später unzählige „Unknown Artist“-Einträge. Cover als
cover.jpg/folder.jpgim Albumordner oder direkt in den Tag eingebettet.
docker-compose.yml – die Konfiguration
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: "1000:1000" # Muss Eigentümer der Volumes sein!
ports:
- "127.0.0.1:50533:4533"
restart: unless-stopped
deploy:
resources:
limits:
cpus: "2.0"
memory: 4G
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: https://musik.meine.domain
volumes:
- ./data:/data
- ./music:/music:ro
Gegenüber der ursprünglichen Vorlage sind drei Dinge bereinigt: das versehentlich angehängte
" am Ende der Music-Volume-Zeile (ein Copy-&-Paste-Rest, der die Datei als YAML
ungültig gemacht hätte), der leere networks: {}-Block (unnötig, da der Dienst ohnehin im
Standard-bridge-Netzwerk läuft) sowie der dadurch überflüssige
network_mode: bridge. Außerdem wurden der container_name ergänzt und die
Werte in Anführungszeichen gesetzt.
Die Bausteine im Einzelnen:
user: "1000:1000"– der Container-Prozess läuft nicht als Root, sondern als UID/GID 1000. Das ist das offiziell empfohlene Vorgehen; die Volumes müssen diesem Nutzer gehören (siehe oben).ports: 127.0.0.1:50533:4533– Navidromes Web-UI (Container-Port 4533) wird nur auf dem Loopback gemappt. Wer von außen zugreifen will, macht das über den Reverse Proxy – nie durch direktes Öffnen des Ports../data:/data– Datenbank (SQLite), Thumbnails, Cache. Dieser Ordner muss beschreibbar sein../music:/music:ro– deine Musiksammlung wird read-only eingebunden: Navidrome kann nichts verändern, die Dateien bleiben exakt so, wie sie sind. Musik darf auch auf einem NAS/Netzlaufwerk liegen, solange der Docker-Host sie gemountet hat.deploy.resources.limits– 2 CPUs / 4 GB RAM: reichlich fürs Scannen großer Sammlungen und gleichzeitiges Streaming, aber kein Freibrief für den Host. Beim ersten Scan großer Bibliotheken kurzdocker stats navidromebeobachten.
Die wichtigsten Umgebungsvariablen
Alle Navidrome-Optionen lassen sich über ND_…-Umgebungsvariablen setzen (Groß-/Kleinschreibung
egal). Die vier aus der Konfiguration:
| Variable | Wert | Bedeutung |
|---|---|---|
ND_SCANSCHEDULE | 1h | Neuer Musikordner-Scan im Intervall. 1h heißt: höchstens einmal pro Stunde – reicht für die meisten, wer oft neue Musik hinzufügt, nimmt 5m. |
ND_LOGLEVEL | info | Log-Level; debug hilft bei der Fehlersuche, ist im Alltag aber zu laut. |
ND_SESSIONTIMEOUT | 24h | Nach so langer Inaktivität muss man sich neu anmelden – angenehm für Apps, die dauerhaft verbunden bleiben. |
ND_BASEURL | https://musik.meine.domain | Externe Basis-URL, unter der Navidrome erreichbar ist. Wichtig: Ohne führenden/abschließenden Slash setzen und nur verwenden, wenn wirklich ein Reverse Proxy davor hängt – sonst weglassen. |
Weitere praktische Optionen für später:
ND_MUSICFOLDER/ND_DATAFOLDER– Pfade umdefinieren (Standard:/musicbzw./data).ND_PORT– interner HTTP-Port (Standard 4533); im Compose-File nur relevant, wenn du ihn änderst.ND_ENABLESHARING– öffentliche Album-/Playlist-Links („Share“) aktivieren.ND_LASTFM_APIKEY/ND_LASTFM_SECRET– Last.fm-Anbindung für Ähnlichkeits- und Artist-Info.ND_PROXYWHITELIST– Client-IPs für den Reverse-Proxy-Modus (dazu unten mehr).
Erster Start: Admin-Konto & der erste Scan
cd ~/navidrome
docker compose up -d
# Läuft er? Logs beobachten (Scan-Fortschritt!)
docker compose logs -f navidrome
Beim ersten Start legt Navidrome die Datenbank an und scannt die Musik-Bibliothek. Je nach
Sammlungsgröße und Dateianzahl dauert das ein paar Minuten – bei mehreren zehntausend Titeln auch
länger. Anschließend ist die Weboberfläche unter http://127.0.0.1:50533 erreichbar (oder
per SSH-Tunnel: ssh -L 50533:127.0.0.1:50533 dein-server).
💡 Der erste Nutzer wird automatisch Admin. Danach gibt es keine offene Registrierung mehr – weitere Konten legst du als Admin selbst an (Web-UI → „Persönlich“ → „Nutzer verwalten“). Das ist ein bewährtes Sicherheitsmuster: keine selbstregistrierten Fremdkonten.
Neue Musik einfach in ~/navidrome/music/ legen – der nächste planmäßige Scan
(hier: stündlich) nimmt sie auf. Wer nicht warten will, stößt den Scan über „Personen >
Einstellungen → Scan jetzt“ an oder per Befehl anstoßen:
docker exec navidrome /app/navidrome scan
Zugriff von außen: Reverse Proxy & Subsonic-API
Hinter einem Reverse Proxy mit HTTPS musst du nur drei Dinge beachten: die ND_BASEURL
(siehe oben), ein passendes ND_PROXYWHITELIST und – wichtig fürs Streaming – dass der
Proxy große Dateien und WebSocket-Verbindungen durchlässt. Caddy erledigt das von Haus aus korrekt:
# Caddyfile
musik.meine.domain {
encode zstd gzip
reverse_proxy 127.0.0.1:50533
}
Für Traefik/Nginx entsprechend den X-Forwarded-Header konfigurieren. Sobald der Proxy korrekt auflöst, ergänzt du in der Compose-Datei:
environment:
ND_BASEURL: https://musik.meine.domain
ND_PROXYWHITELIST: "127.0.0.1,::1" # nur der lokale Proxy darf sich ausgeben
Die Subsonic-API braucht keine Extra-Konfiguration: Sie läuft unter derselben URL –
für Apps gibst du einfach https://musik.meine.domain (bzw. http://IP:50533)
plus Benutzername und Passwort deines Navidrome-Kontos an. Standard-Subsonic-Pfade wie
/rest/… werden von Navidrome direkt beantwortet.
Apps & Clients: Musik auf allen Geräten
Navidrome bringt eine sehr gute Weboberfläche mit – die meisten nutzen aber zusätzlich eine App:
| Client | Plattform | Besonderheit |
|---|---|---|
| Symfonium | Android | Der meistgenutzte Subsonic-Client – Offline-Cache, Chromecast, sehr pflegeleicht. |
| play:Sub / Amperfy | iOS | Solide Subsonic-Clients für iPhone & iPad (Amperfy ist Open Source). |
| Sonixd / Feishin | Desktop | Modernes „Spotify-Feeling“ am Rechner; Feishin ist der aktiv weiterentwickelte Nachfolger von Sonixd. |
| Web-UI | Browser | Immer dabei – inklusive eigener Playlist-Verwaltung und „Jetzt läuft“-Ansicht. |
Updates & Backups
cd ~/navidrome
docker compose pull
docker compose up -d
- Backup = der
data/-Ordner. Darin liegen die komplette Datenbank, Playlists und Einstellungen.music/muss nicht gesichert werden, wenn du die Originaldateien ohnehin anderswo aufbewahrst (genau dafür ist der Read-only-Mount da). - Vor größeren Updates die Datenbank sichern, solange Navidrome gestoppt ist
(
docker compose stop navidrome→ Kopie →docker compose start navidrome), um konsistente SQLite-Stände zu bekommen. - Versions-Tag:
:latestist hier praktikabel – wer konservativer fahren will, pinnt auf ein konkretes Release-Tag aus der Docker-Hub-Übersicht und aktualisiert bewusst.
Fehlerbehebung: Die häufigsten Stolperfallen
| Problem | Lösung |
|---|---|
| „Permission denied“ / keine Datenbank beim Start | UID/GID stimmen nicht: chown -R 1000:1000 data/ ausführen (oder user: an deine UID anpassen). |
| Musik taucht nicht auf / leere Bibliothek | Pfad prüfen (./music:/music:ro) und Logs ansehen (docker compose logs navidrome). Scan abwarten oder manuell anstoßen – bei neu hinzugefügten Dateien hilft ein manueller Scan schneller als der stündliche. |
| Alben/Interpreten heißen „Unknown“ | Die Dateien haben keine oder widersprüchliche Tags. Mit MusicBrainz Picard sauber taggen und erneut scannen. |
| Cover werden nicht angezeigt | Cover als cover.jpg im Albumordner oder in die Datei eingebettet. Nach dem Einbetten erneut scannen (Thumbnail-Cache aktualisiert sich beim nächsten Scan). |
| App kann sich nicht verbinden | In der App den Server-Typ „Subsonic“ wählen (nicht „Navidrome“ als eigenes Protokoll) und bei HTTPS die ND_BASEURL ohne Slash prüfen; Zertifikat muss gültig sein. |
| Streaming bricht bei großen FLACs ab | Reverse Proxy auf große Antworten/kein Timeout prüfen (Caddy ist unkritisch; bei Nginx proxy_read_timeout erhöhen). WebUI- und API-Zugriff laufen über Port 4533 im Container – Port 4533 niemals doppelt mappen. |
Fazit
Navidrome ist die unkomplizierteste Art, eine eigene Musikbibliothek auf allen Geräten zu streamen – ohne Abo, ohne Cloud und ohne Kompromisse beim Klang. Der Einstieg ist klein: ein Container, ein Daten-Ordner, ein Reverse Proxy. Die einzige echte Arbeit liegt in der Musik selbst – wer seine Sammlung einmal sauber getaggt hat, bekommt dafür eine Oberfläche, die sich mit kommerziellen Streaming-Diensten messen kann.
✅ Zum Mitnehmen: (1) user: 1000:1000 + korrekte Ordner-Rechte vor
dem ersten Start prüfen. (2) Musik-Volume read-only (:ro) einbinden, data/
ist dein Backup. (3) Web-UI nur auf 127.0.0.1, Zugriff von außen ausschließlich über den
Reverse Proxy mit ND_BASEURL + ND_PROXYWHITELIST. (4) Tags entscheiden über
die Qualität der Bibliothek – vor dem Scannen aufräumen. (5) Subsonic-API nutzen: praktisch jeder
Player kann Navidrome als Quelle verwenden.