// Tutorial · Musik · Self-Hosting

Navidrome selbst hosten: Die Spotify-Alternative für deine eigene Musik

📅 22.09.2026 ⏱ 10 Min. Lesezeit ✍️ Redaktion

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 von data/ 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.jpg im 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.limits2 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 kurz docker stats navidrome beobachten.

Die wichtigsten Umgebungsvariablen

Alle Navidrome-Optionen lassen sich über ND_…-Umgebungsvariablen setzen (Groß-/Kleinschreibung egal). Die vier aus der Konfiguration:

VariableWertBedeutung
ND_SCANSCHEDULE1hNeuer 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_LOGLEVELinfoLog-Level; debug hilft bei der Fehlersuche, ist im Alltag aber zu laut.
ND_SESSIONTIMEOUT24hNach so langer Inaktivität muss man sich neu anmelden – angenehm für Apps, die dauerhaft verbunden bleiben.
ND_BASEURLhttps://musik.meine.domainExterne 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: /music bzw. /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:

ClientPlattformBesonderheit
SymfoniumAndroidDer meistgenutzte Subsonic-Client – Offline-Cache, Chromecast, sehr pflegeleicht.
play:Sub / AmperfyiOSSolide Subsonic-Clients für iPhone & iPad (Amperfy ist Open Source).
Sonixd / FeishinDesktopModernes „Spotify-Feeling“ am Rechner; Feishin ist der aktiv weiterentwickelte Nachfolger von Sonixd.
Web-UIBrowserImmer 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: :latest ist 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

ProblemLösung
„Permission denied“ / keine Datenbank beim StartUID/GID stimmen nicht: chown -R 1000:1000 data/ ausführen (oder user: an deine UID anpassen).
Musik taucht nicht auf / leere BibliothekPfad 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 angezeigtCover 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 verbindenIn 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 abReverse 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.

R
Von der Selfhosted-Redaktion

Wir betreiben unsere komplette Infrastruktur selbst auf Open-Source-Software und schreiben nur über Tools, die wir im Alltag wirklich einsetzen. Fragen zum Artikel? Schreib uns.