What is Navidrome?
Navidrome is a lightweight, self-hosted music server and streamer that turns your own music collection into a personal Spotify. It is open source under the GPL-3.0 license and written in Go, so it runs on almost anything, including a Raspberry Pi. It includes a modern web player, multi-user support, smart playlists, and compatibility with dozens of Subsonic mobile and desktop apps.
Requirements
- A Linux server with 1 vCPU and 512 MB of RAM. Very large libraries scan faster with more memory.
- Docker Engine and Docker Compose v2.
- Your music files (MP3, FLAC, Opus, AAC and more) in a folder, ideally with clean tags.
Step 1: Prepare the server
This guide assumes Ubuntu 24.04 with Docker installed. If you need Docker, follow the official install guide. Create a data folder and note your user and group IDs:
mkdir -p ~/navidrome/data && cd ~/navidrome
id -u && id -g
Navidrome identifies albums and artists from embedded tags, not folder names, so tag your files with a tool such as MusicBrainz Picard or beets before the first scan.
Step 2: Create the Docker Compose file
Save this as docker-compose.yml, changing the music path and user line to match your system:
services:
navidrome:
image: deluan/navidrome:0.64.2
container_name: navidrome
user: "1000:1000"
restart: unless-stopped
ports:
- "4533:4533"
environment:
ND_SCANSCHEDULE: "1h"
ND_LOGLEVEL: "info"
ND_SESSIONTIMEOUT: "24h"
ND_BASEURL: ""
ND_ENABLEINSIGHTSCOLLECTOR: "false"
volumes:
- ./data:/data
- /srv/music:/music:ro
The music folder is mounted read-only, so Navidrome can never change your files. ND_SCANSCHEDULE sets how often Navidrome rescans the library; newer versions also watch the folder for changes. ND_ENABLEINSIGHTSCOLLECTOR: "false" turns off the anonymous usage statistics Navidrome sends by default. Leave it on if you want to help the developers. There are no secrets in the Compose file: you create the admin account in the browser.
Pin the image to a release from the Navidrome releases page, or use latest if you prefer automatic updates.
Step 3: Start and open the app
docker compose up -d
docker compose logs -f navidrome
Open http://YOUR_SERVER_IP:4533 straight away. The first visitor to a new Navidrome instance is asked to create the admin user, so do this before anyone else can reach the port. Choose a strong password. The initial library scan starts automatically; you can watch its progress in the activity panel at the top right of the web UI.
To use a mobile app, enter your server URL, username and password in any Subsonic-compatible client. Create separate, non-admin users for family members under Settings, Users.
Step 4: Put it behind HTTPS
For streaming outside your home network, put Navidrome behind a reverse proxy. With Caddy:
music.example.com {
reverse_proxy 127.0.0.1:4533
}
Subsonic apps send credentials with every request, so HTTPS matters here. Once HTTPS works, change the port mapping to "127.0.0.1:4533:4533" so the plain HTTP port is no longer exposed. If you serve Navidrome under a sub-path such as example.com/music, set ND_BASEURL: "/music" to match. Nginx Proxy Manager works the same way with a proxy host to port 4533.
Backups and upgrades
Navidrome stores its database, cache and settings in ./data. The database (navidrome.db) holds users, playlists, play counts, ratings and favourites, which you cannot rebuild from your files. The cache subfolder can be excluded from backups. Navidrome can also create scheduled database backups itself with ND_BACKUP_PATH, ND_BACKUP_SCHEDULE and ND_BACKUP_COUNT. Back up your music library separately; it is the most valuable part.
Upgrade by changing the version tag, reading the changelog, then:
docker compose pull && docker compose up -d
Major releases sometimes trigger a full rescan, which can take a while on large libraries.
Troubleshooting
- Library is empty after the scan: the container user cannot read
/srv/music, or the path is wrong. Rundocker compose exec navidrome ls /musicto check. - Albums are split or merged incorrectly: the tags are inconsistent. Fix the Album Artist and Album tags, then run a full rescan from the web UI.
- Mobile app says the login is invalid: some older Subsonic apps need legacy authentication. Check the app's settings, and make sure you use the full HTTPS URL.
- Cover art is missing: add
cover.jpgorfolder.jpgfiles in album folders, or embed artwork in the tags.
Next steps
Install a Subsonic app such as Symfonium or Feishin, create smart playlists with .nsp files, connect Last.fm or ListenBrainz scrobbling in your user settings, and enable transcoding profiles for mobile data.
Spotted something out of date? Tell us and we will update the guide.