Navidrome is what happens when someone builds a Subsonic-API server the way Uptime Kuma builds a status page: one small binary, one file for a database, and nothing else asking for RAM.Navidrome ist das, was passiert, wenn jemand einen Subsonic-API-Server so baut, wie Uptime Kuma eine Status-Seite baut: eine kleine Binary, eine Datei für die Datenbank, und sonst nichts, das nach RAM verlangt.
Navidrome is a single Go binary with an embedded SQLite database, and it idles in the tens of megabytes — nowhere near the ceiling of even the cheapest tier we sell. Compare that to Jellyfin, which spikes hard whenever it has to transcode video, or Nextcloud, which spikes during previews: Navidrome's own workload (scanning tags, serving audio, occasionally re-encoding one stream) barely troubles a single vCPU. The one thing that actually determines the right tier is disk, because a music library is disk. Our vps-starter tier — 1 vCPU, 1 GiB RAM, 25 GB disk — runs Navidrome itself without strain; whether it holds your library is a different question entirely.Navidrome ist eine einzelne Go-Binary mit eingebetteter SQLite-Datenbank und dümpelt im Leerlauf bei ein paar Dutzend Megabyte — weit entfernt von der Obergrenze selbst unseres günstigsten Tarifs. Vergleiche das mit Jellyfin, das bei jedem Video-Transcode heftig ausschlägt, oder Nextcloud, das bei Vorschaubildern ausschlägt: Navidromes eigene Arbeitslast (Tags scannen, Audio ausliefern, gelegentlich einen Stream neu kodieren) bringt einen einzelnen vCPU kaum ins Schwitzen. Das Einzige, was tatsächlich über den richtigen Tarif entscheidet, ist die Festplatte, denn eine Musikbibliothek ist Festplatte. Unser vps-starter-Tarif — 1 vCPU, 1 GiB RAM, 25 GB Speicher — betreibt Navidrome selbst ohne jede Anstrengung; ob er deine Bibliothek fasst, ist eine ganz andere Frage.
Work backwards from what you actually own, and be honest about format. A well-tagged MP3 library at a normal bitrate runs roughly 1 GB per 200-250 songs. The same library ripped or bought as lossless FLAC is commonly four to eight times the size for the same songs, sometimes more if the MP3s were ripped at a low bitrate — the compression is lossless, not aggressive, so a FLAC collection that would fit in 10 GB as MP3 can easily want 40-80 GB as FLAC. That difference is the entire sizing decision:Rechne rückwärts von dem, was du tatsächlich besitzt, und sei ehrlich, was das Format angeht. Eine sauber getaggte MP3-Bibliothek mit normaler Bitrate braucht etwa 1 GB pro 200-250 Songs. Dieselbe Bibliothek als verlustfreies FLAC gerippt oder gekauft ist für dieselben Songs üblicherweise vier- bis achtmal so groß, manchmal mehr, wenn die MP3s mit niedriger Bitrate gerippt wurden — die Kompression ist verlustfrei, nicht aggressiv, sodass eine FLAC-Sammlung, die als MP3 in 10 GB passen würde, als FLAC leicht 40-80 GB will. Dieser Unterschied ist die gesamte Dimensionierungsentscheidung:
Navidrome's own data (the SQLite database, cached artwork, and full-text search index) stays small — tens to a couple of hundred megabytes even for a large library — so it is never what fills the disk. The music is.Navidromes eigene Daten (die SQLite-Datenbank, gecachtes Artwork und der Volltext-Suchindex) bleiben klein — ein paar Dutzend bis ein paar hundert Megabyte selbst bei einer großen Bibliothek —, sodass sie nie das sind, was die Festplatte füllt. Die Musik ist es.
A fresh VPS has no music folder yet, and rsync will not create more than the last missing directory on the far side, so make the path first over SSH:Ein frischer VPS hat noch keinen Musik-Ordner, und rsync legt auf der Gegenseite höchstens das letzte fehlende Verzeichnis an — leg den Pfad also zuerst über SSH an:
ssh -p 2222 user@your-vps-ip "mkdir -p /srv/navidrome/music"
Then sync the library over the same encrypted connection, using your VPS's dedicated SSH port, not port 22:Synchronisiere die Bibliothek dann über dieselbe verschlüsselte Verbindung, über den dedizierten SSH-Port deines VPS, nicht Port 22:
rsync -avP -e "ssh -p 2222" ./Music/ user@your-vps-ip:/srv/navidrome/music/
-a preserves timestamps and permissions, -P shows progress and lets an interrupted transfer resume rather than restart from zero, which matters once you are moving tens of gigabytes of FLAC rather than a handful of test files. connect to your VPS over SSH covers finding your actual port if you have not connected before. Run the same command again after adding new albums later — rsync only sends what changed.-a erhält Zeitstempel und Berechtigungen, -P zeigt Fortschritt an und lässt eine unterbrochene Übertragung fortsetzen statt bei null neu zu beginnen — das zählt, sobald du zig Gigabyte FLAC statt einer Handvoll Testdateien bewegst. Über SSH mit deinem VPS verbinden beschreibt, wie du deinen tatsächlichen Port findest, falls du dich noch nie verbunden hast. Führe denselben Befehl später nach neuen Alben erneut aus — rsync überträgt nur, was sich geändert hat.
services:
navidrome:
image: deluan/navidrome:0.54.5 # check hub.docker.com/r/deluan/navidrome/tags for the current release
restart: unless-stopped
environment:
- ND_SCANSCHEDULE=1h
- ND_LOGLEVEL=info
volumes:
- navidrome_data:/data
- /srv/navidrome/music:/music:ro
ports:
- "127.0.0.1:4533:4533"
volumes:
navidrome_data:
name: navidrome_data
/music is mounted read-only on purpose: Navidrome only ever needs to read your files to scan and stream them, and a read-only mount means a bug in the server, or a bad plugin, cannot touch the library itself. /data is a named volume holding the SQLite database, cached cover art, and the search index — the one thing you actually need to back up. The published port is bound to 127.0.0.1, the same as every other web app in this series: Caddy on the same host is the only thing that should reach port 4533 directly./music ist absichtlich nur lesbar eingehängt: Navidrome muss deine Dateien nur lesen, um sie zu scannen und zu streamen, und ein Nur-Lese-Mount bedeutet, dass ein Bug im Server oder ein fehlerhaftes Plugin die Bibliothek selbst nicht anrühren kann. /data ist ein benanntes Volume, das die SQLite-Datenbank, gecachtes Artwork und den Suchindex enthält — das Einzige, das du tatsächlich sichern musst. Der veröffentlichte Port ist an 127.0.0.1 gebunden, genau wie bei jeder anderen Web-App in dieser Serie: Nur Caddy auf demselben Host sollte Port 4533 direkt erreichen.
The name: navidrome_data line under volumes: is the thing that bites later if you skip it: Compose normally prefixes a named volume with the project name (the directory the compose file lives in), so the volume actually created on disk is not literally navidrome_data unless you pin it. The backup command further down assumes that exact literal name — skip the pin, and that command silently creates and tars a brand-new empty volume instead of the one Navidrome is using, with no error to warn you.Die Zeile name: navidrome_data unter volumes: ist das, was dich später beißt, wenn du sie weglässt: Compose stellt einem benannten Volume normalerweise den Projektnamen voran (das Verzeichnis, in dem die Compose-Datei liegt), sodass das tatsächlich angelegte Volume auf der Festplatte nicht wörtlich navidrome_data heißt, solange du es nicht festnagelst. Der Backup-Befehl weiter unten setzt genau diesen wörtlichen Namen voraus — lässt du die Festlegung weg, legt dieser Befehl stillschweigend ein brandneues, leeres Volume an und sichert dieses statt des von Navidrome genutzten, ohne dich mit einem Fehler zu warnen.
Navidrome ships a long list of ND_-prefixed variables; three matter for a first deployment:Navidrome bringt eine lange Liste von Variablen mit ND_-Präfix mit; drei sind für ein erstes Deployment wichtig:
ND_SCANSCHEDULE — how often Navidrome rescans the music folder for new or changed files, given as a duration like 1h or 24h. Leave it at an hour or so unless you add music rarely, in which case a longer interval saves a little disk I/O for no real benefit.ND_SCANSCHEDULE — wie oft Navidrome den Musik-Ordner nach neuen oder geänderten Dateien erneut scannt, angegeben als Zeitdauer wie 1h oder 24h. Lass es bei etwa einer Stunde, außer du fügst nur selten Musik hinzu — dann spart ein längeres Intervall etwas Festplatten-I/O ohne echten Nutzen.ND_LOGLEVEL — info for normal operation, debug only while you are chasing a scanning or playback problem, since debug logging is verbose and not something to leave on indefinitely.ND_LOGLEVEL — info für den Normalbetrieb, debug nur, während du einem Scan- oder Wiedergabeproblem nachjagst, denn Debug-Logging ist ausführlich und nichts, das du dauerhaft eingeschaltet lassen solltest.ND_BASEURL — only needed if you serve Navidrome under a sub-path of a domain that also hosts something else, for example https://example.com/music rather than its own subdomain. Set it to that path (/music) and Navidrome rewrites its own links and API responses to match; leave it unset entirely when Navidrome gets its own subdomain, which is the simpler setup and the one this guide uses.ND_BASEURL — nur nötig, wenn du Navidrome unter einem Unterpfad einer Domain auslieferst, die auch noch etwas anderes hostet, zum Beispiel https://example.com/music statt unter einer eigenen Subdomain. Setze es auf diesen Pfad (/music), und Navidrome schreibt seine eigenen Links und API-Antworten entsprechend um; lass es ganz ungesetzt, wenn Navidrome eine eigene Subdomain bekommt — das ist der einfachere Aufbau und der, den diese Anleitung verwendet.Bring the stack up and open the server once, either through an SSH tunnel or straight from the box before Caddy is in front of it:Fahre den Stack hoch und öffne den Server einmal, entweder über einen SSH-Tunnel oder direkt von der Maschine aus, bevor Caddy davor steht:
docker compose up -d
Navidrome has no separate setup wizard — the first account you create in the web UI automatically becomes an administrator. Create that account deliberately, with a real password, before you ever expose the port publicly; do not leave the first-run screen sitting open on the internet while you decide on a username.Navidrome hat keinen separaten Einrichtungsassistenten — der erste Account, den du in der Web-Oberfläche anlegst, wird automatisch zum Administrator. Lege diesen Account bewusst an, mit einem echten Passwort, bevor du den Port jemals öffentlich freigibst; lass den Erststart-Bildschirm nicht offen im Internet stehen, während du dich noch für einen Benutzernamen entscheidest.
music.example.com {
reverse_proxy 127.0.0.1:4533
}
That line is the whole file. Caddy requests and renews the certificate itself the first time it sees a request for that hostname, as long as the domain's A record already points at the box.Diese Zeile ist die ganze Datei. Caddy fordert das Zertifikat selbst an und erneuert es, sobald es zum ersten Mal eine Anfrage für diesen Hostnamen sieht, vorausgesetzt der A-Eintrag der Domain zeigt schon auf die Maschine.
The catch is not about Navidrome at all — it is about the network under it. Our VPS plans forward a small number of ports besides the dedicated SSH port, and whether 80 and 443 are among them depends on the plan, so check what your specific plan actually forwards before you point a domain at the box: NAT IPv4, ports and forwarding. If 443 is forwarded, the Caddyfile above works unchanged. If it is not, Caddy can still serve on whatever port you do have — Navidrome's own web UI and every Subsonic client accept a port appended to the address — but Caddy still needs port 80 or 443 reachable to complete the ACME certificate challenge in the first place; a forwarded high port alone gives it neither. A dedicated IPv4 removes the question entirely, since 80 and 443 are then yours; on our plans that's arranged by e-mail.Die Falle hat nichts mit Navidrome selbst zu tun — sie liegt im Netzwerk darunter. Unsere VPS-Tarife leiten eine kleine Anzahl von Ports zusätzlich zum dedizierten SSH-Port weiter, und ob 80 und 443 darunter sind, hängt vom Tarif ab — prüfe also, was dein konkreter Tarif tatsächlich weiterleitet, bevor du eine Domain auf die Maschine zeigen lässt: NAT IPv4, Ports und Weiterleitung. Ist 443 weitergeleitet, funktioniert die Caddyfile oben unverändert. Ist es nicht, kann Caddy trotzdem auf jedem Port ausliefern, den du hast — Navidromes eigene Web-Oberfläche und jeder Subsonic-Client akzeptieren einen an die Adresse angehängten Port —, aber Caddy braucht trotzdem erreichbaren Port 80 oder 443, um die ACME-Zertifikats-Challenge überhaupt abzuschließen; ein weitergeleiteter hoher Port allein gibt ihm keines von beidem. Eine dedizierte IPv4 erledigt die Frage vollständig, da 80 und 443 dann dir gehören; bei unseren Tarifen wird das per E-Mail geregelt.
Navidrome transcodes on the fly using ffmpeg, and only when a client actually asks for it — a mobile app set to a lower bitrate on cellular data, say, or a browser that cannot play FLAC natively. Direct streaming of the original file costs almost nothing; a live transcode is real CPU work, decoding and re-encoding audio in real time. On a single vCPU that is genuinely fine for one or two simultaneous transcoded streams, which covers a household. It is not a workload built for a dozen people all transcoding at once from the same box — audio is far lighter than video, but it is not free, and a 1 vCPU tier only has the one core to give.Navidrome transkodiert im laufenden Betrieb mit ffmpeg, und nur, wenn ein Client tatsächlich danach verlangt — etwa eine mobile App, die im Mobilfunknetz auf eine niedrigere Bitrate eingestellt ist, oder ein Browser, der FLAC nicht nativ abspielen kann. Direktes Streaming der Originaldatei kostet fast nichts; ein Live-Transcode ist echte CPU-Arbeit, Audio in Echtzeit dekodieren und neu kodieren. Auf einem einzelnen vCPU ist das für ein oder zwei gleichzeitig transkodierte Streams wirklich unproblematisch, das deckt einen Haushalt ab. Es ist keine Arbeitslast, die für ein Dutzend Leute gedacht ist, die alle gleichzeitig von derselben Maschine transkodieren — Audio ist weit leichter als Video, aber nicht kostenlos, und ein 1-vCPU-Tarif hat nur den einen Kern zu vergeben.
Navidrome speaks the Subsonic API, so any Subsonic-compatible client works without anything specific to Navidrome itself: give it the server URL (https://music.example.com, with the port appended if you landed on the non-standard-port path above), your username, and your password. That is the entire pairing step — there is no app-specific setup beyond the address and the account you created in the first-run step.Navidrome spricht die Subsonic-API, sodass jeder Subsonic-kompatible Client funktioniert, ohne dass irgendetwas Navidrome-Spezifisches nötig wäre: Gib ihm die Server-URL (https://music.example.com, mit angehängtem Port, falls du oben auf dem Weg mit dem nicht standardmäßigen Port gelandet bist), deinen Benutzernamen und dein Passwort. Das ist der gesamte Kopplungsschritt — es gibt kein App-spezifisches Setup über die Adresse und den im Erststart-Schritt angelegten Account hinaus.
The music files are large and usually replaceable — you ripped or bought them once, and could again. The navidrome_data volume is the opposite: small, and the one thing genuinely painful to lose, because it holds the database, every playlist, and every play count and rating you have built up.Die Musikdateien sind groß und meist ersetzbar — du hast sie einmal gerippt oder gekauft und könntest es wieder tun. Das Volume navidrome_data ist das Gegenteil: klein, und das Einzige, dessen Verlust wirklich wehtut, weil es die Datenbank enthält, jede Playlist und jeden Play-Count und jede Bewertung, die du aufgebaut hast.
Stop the container first. Navidrome's SQLite database can be mid-write when you least expect it, and a plain file copy taken while the process is still running is not guaranteed to be consistent — stopping it for the few seconds a tar of a small volume takes is cheap insurance:Stoppe zuerst den Container. Navidromes SQLite-Datenbank kann mitten in einem Schreibvorgang sein, wenn du es am wenigsten erwartest, und eine reine Dateikopie, während der Prozess noch läuft, ist nicht garantiert konsistent — ihn für die paar Sekunden zu stoppen, die ein Tar eines kleinen Volumes braucht, ist billige Versicherung:
docker compose stop navidrome
docker run --rm \
-v navidrome_data:/data:ro \
-v "$PWD":/backup \
alpine:3.21 tar czf /backup/navidrome-data-$(date +%F).tar.gz -C /data .
docker compose start navidrome
Copy that tarball off the VPS on a schedule; a backup on the same disk as the service it protects does not survive that disk failing. back up your VPS covers what off-machine backup means in practice on any provider.Kopiere diesen Tarball nach Zeitplan vom VPS herunter; ein Backup auf derselben Festplatte wie der Dienst, den es schützt, überlebt einen Ausfall dieser Festplatte nicht. Backup deines VPS beschreibt, was Backup abseits der Maschine bei jedem Anbieter in der Praxis bedeutet.
docker compose pull
docker compose up -d
Bump the pinned tag deliberately rather than tracking latest, and take the backup above first. Navidrome runs its own schema migrations against the SQLite database on startup, and a migration you can roll back from is one where the backup came from ten minutes earlier, not from after something looked wrong.Erhöhe den gepinnten Tag bewusst, statt latest zu verfolgen, und mach vorher das obige Backup. Navidrome führt beim Start seine eigenen Schema-Migrationen gegen die SQLite-Datenbank aus, und eine Migration, von der du zurückrollen kannst, ist eine, bei der das Backup zehn Minuten vorher entstand, nicht eine, die du improvisierst, nachdem schon etwas falsch aussah.
Full disclosure: this is what we sell. A vps-starter (1 vCPU / 1 GiB / 25 GB) runs Navidrome comfortably for one or two listeners; the reason to move up is never CPU or RAM, it is running out of the 25 GB disk once the library grows.Zur vollen Transparenz: Das ist, was wir verkaufen. Ein vps-starter (1 vCPU / 1 GiB / 25 GB) betreibt Navidrome bequem für ein oder zwei Hörer; der Grund zum Hochstufen ist nie CPU oder RAM, sondern dass die 25 GB Speicher ausgehen, sobald die Bibliothek wächst.
Linux KVM VPS — EUR 4.99 to EUR 59.99 a month, on our own single-tenant bare metal in Dallas, TX and Charlotte, NC. Full hardware virtualisation (KVM), your own kernel, full root. Six tiers, vps-starter to vps-ultra. Starter is 1 vCPU, 1 GiB RAM, 25 GB disk.Linux-KVM-VPS — 4,99 bis 59,99 EUR im Monat, auf unserer eigenen Single-Tenant-Bare-Metal-Hardware in Dallas, TX und Charlotte, NC. Vollständige Hardware-Virtualisierung (KVM), eigener Kernel, volles Root. Sechs Tarife, vps-starter bis vps-ultra. Starter hat 1 vCPU, 1 GiB RAM, 25 GB Speicher.
You order in the shop, pay by card (Stripe) or SEPA bank transfer, and your login details are e-mailed to you once the service is set up. Support is e-mail, run by one person, with no guaranteed response time. All prices are final totals under the German small-business rule (§19 UStG); no VAT is added or shown.Du bestellst im Shop, zahlst per Karte (Stripe) oder SEPA-Überweisung, und deine Zugangsdaten werden dir per E-Mail zugeschickt, sobald der Dienst eingerichtet ist. Support läuft per E-Mail, von einer einzelnen Person betrieben, ohne garantierte Reaktionszeit. Alle Preise sind Endpreise. Gemäß § 19 UStG wird keine Umsatzsteuer ausgewiesen.
Order vps-starter → · Linux KVM VPS overviewvps-starter bestellen → · Übersicht Linux-KVM-VPS
Written by the person who runs overnight.host: a small, honest hosting company on dedicated bare metal — Linux VPS, game servers, web hosting. Live status at up.overnight.host.Geschrieben von der Person, die overnight.host betreibt: ein kleines, ehrliches Hosting-Unternehmen auf dedizierter Bare-Metal-Hardware — Linux-VPS, Gameserver, Webhosting. Live-Status unter up.overnight.host.
No. It embeds SQLite in the data volume, so there is nothing else to run or size — one more reason the cheapest tier is enough rather than a starting compromise.Nein. Es bettet SQLite im Daten-Volume ein, sodass nichts anderes läuft oder dimensioniert werden muss — ein weiterer Grund, warum der günstigste Tarif reicht und kein Kompromiss zum Einstieg ist.
For one or two simultaneous transcoded streams, yes — audio transcoding is far lighter than video. What it will not do gracefully is many people transcoding at once from the same core; most of that load only shows up if clients are set to demand a lower bitrate than the source file, so check client settings before assuming the box is the problem.Für ein oder zwei gleichzeitig transkodierte Streams, ja — Audio-Transcoding ist weit leichter als Video. Was er nicht anständig schafft, sind viele Leute, die gleichzeitig vom selben Kern transkodieren; das meiste dieser Last taucht nur auf, wenn Clients auf eine niedrigere Bitrate als die Quelldatei eingestellt sind, prüf also die Client-Einstellungen, bevor du annimmst, die Maschine sei das Problem.
Any client built against the Subsonic API, since that is the interface Navidrome exposes rather than a bespoke protocol of its own. Point it at your server URL and the account created on first run; there is nothing Navidrome-specific to configure beyond that.Jeder Client, der gegen die Subsonic-API gebaut ist, denn das ist die Schnittstelle, die Navidrome anbietet, statt eines eigenen proprietären Protokolls. Richte ihn auf deine Server-URL und den im Erststart angelegten Account aus; darüber hinaus gibt es nichts Navidrome-Spezifisches zu konfigurieren.
Check the format before the song count. A modest MP3 collection fits easily; the same collection in FLAC is commonly four to eight times larger for identical songs, and that difference alone is usually what decides whether 25 GB is enough or you need more disk.Prüfe das Format vor der Songzahl. Eine bescheidene MP3-Sammlung passt problemlos; dieselbe Sammlung in FLAC ist für identische Songs üblicherweise vier- bis achtmal größer, und allein dieser Unterschied entscheidet meist, ob 25 GB reichen oder du mehr Speicher brauchst.
Every playlist, play count, rating, and user account is gone, because it all lives in that one SQLite database. The music itself is untouched, since it is a separate read-only mount, but re-adding the library and rebuilding playlists by hand is tedious enough that the backup above is worth doing on day one.Jede Playlist, jeder Play-Count, jede Bewertung und jeder Benutzeraccount ist weg, weil alles in dieser einen SQLite-Datenbank lebt. Die Musik selbst bleibt unberührt, da sie ein separater Nur-Lese-Mount ist, aber die Bibliothek neu hinzuzufügen und Playlists von Hand wiederaufzubauen ist mühsam genug, dass sich das obige Backup schon am ersten Tag lohnt.
Prices are final totals; no VAT is shown (§19 UStG). Need something the shop does not list? Email us for a written offer.Alle Preise sind Endpreise ohne ausgewiesene USt. (§19 UStG). Du brauchst etwas, das nicht im Shop steht? Schreib uns für ein schriftliches Angebot.
Order now →Jetzt bestellen → Request a custom configIndividuelle Konfiguration anfragen