# 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.

## Key facts

| Fact | Value |
|---|---|
| App | Navidrome Music Server (https://appsgit.com/apps/navidrome-music-server) |
| Difficulty | beginner |
| Time | about 10 minutes |
| Requirements | 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) |
| Last updated | 2026-10-06 |

## 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](https://docs.docker.com/engine/install/ubuntu/). Create a data folder and note your user and group IDs:

```bash
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:

```yaml
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](https://github.com/navidrome/navidrome/releases), or use `latest` if you prefer automatic updates.

## Step 3: Start and open the app

```bash
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](https://caddyserver.com/docs/):

```caddyfile
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:

```bash
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.

## FAQ

### 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.

Prefer not to do it yourself? [appsgit installation help](https://appsgit.com/services/install) installs it on your server for a fixed quote.

---

Canonical page: https://appsgit.com/guides/navidrome-music-server
Source: appsgit (https://appsgit.com), the app store for github. Data from the GitHub API, refreshed nightly.
Machine access: JSON API https://appsgit.com/api/v1/apps (OpenAPI: https://appsgit.com/openapi.json), MCP server https://mcp.appsgit.com/mcp, full index https://appsgit.com/llms-full.txt.
