Skip to content
appsgit

Deploy guide

How to self-host Navidrome with Docker Compose

Stream your own music collection with Navidrome and Docker Compose: music folder, first admin user, Subsonic apps, HTTPS reverse proxy, backups and upgrades.

  • Updated
  • Beginner
  • About 10 minutes

You will need

  • 1 vCPU / 512 MB RAM (a Raspberry Pi works)
  • Docker + Docker Compose v2
  • Your music library in a folder on the server
  • A domain name (optional, for remote streaming)

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. Run docker compose exec navidrome ls /music to 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.jpg or folder.jpg files 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.

FAQ

Navidrome Music Server questions

Still curious? Email info@appsgit.com.

What port does Navidrome use?

Navidrome listens on port 4533 by default. You can change it with the ND_PORT environment variable or by mapping a different host port.

Is Navidrome free?

Yes. Navidrome is free and open source under the GPL-3.0 license, with no paid tier.

Which apps work with Navidrome?

Navidrome implements the Subsonic API, so it works with apps such as Symfonium, Substreamer, Tempo, play:Sub, Amperfy, Feishin and Sonixd, plus its own built-in web player.

Does Navidrome support transcoding?

Yes. The official Docker image includes ffmpeg, so Navidrome can transcode to formats such as Opus or MP3 on the fly to save bandwidth on mobile connections.

Navidrome vs Jellyfin for music?

Navidrome is built only for music, uses very little memory and works with the large Subsonic app ecosystem. Jellyfin handles music too, but it is a full media server for video and its music apps are less mature.