$linuxjunkies
>

Self-Host Navidrome (Subsonic-compatible Music)

Install Navidrome on Linux, configure your music library, set up systemd, and connect Android/iOS clients via the Subsonic API in under 30 minutes.

BeginnerUbuntuDebianFedoraArch9 min readUpdated June 7, 2026

Before you start

  • A Linux server with sudo access and your music files stored on it
  • Port 4533 accessible or an Nginx/Caddy reverse proxy already configured
  • ffmpeg installed for transcoding support (optional but recommended)
  • Well-tagged music files — ID3v2 or Vorbis comments for best results

Navidrome is a lightweight, self-hosted music server with full Subsonic API compatibility. It streams your personal music library to any Subsonic-compatible client — Android, iOS, or desktop — without phoning home to anyone. A Raspberry Pi 4 handles thousands of tracks without breaking a sweat; on a real server it's practically invisible on resource graphs.

Prerequisites

  • A Linux server (physical, VM, or SBC) with your music files accessible on it
  • A non-root user with sudo privileges
  • Ports 4533 (default) open or a reverse proxy in place
  • Basic familiarity with systemd and editing config files

Install Navidrome

Debian / Ubuntu

Navidrome ships a curated apt repository. Add it and install:

curl -fsSL https://www.navidrome.org/downloads/navidrome.gpg | \
  sudo gpg --dearmor -o /usr/share/keyrings/navidrome.gpg

echo "deb [signed-by=/usr/share/keyrings/navidrome.gpg] \
https://www.navidrome.org/downloads/apt stable main" | \
  sudo tee /etc/apt/sources.list.d/navidrome.list

sudo apt update && sudo apt install navidrome

Fedora / RHEL / Rocky

Use the official RPM repository:

sudo dnf install -y 'dnf-command(config-manager)'
sudo dnf config-manager --add-repo \
  https://www.navidrome.org/downloads/rpm/navidrome.repo
sudo dnf install navidrome

Arch Linux

Navidrome is available in the AUR. Use your preferred AUR helper:

paru -S navidrome

Binary install (any distro)

If your distro isn't covered above, grab the pre-built binary directly. Check the releases page for the latest version tag.

NDVERSION=0.53.3   # replace with latest
ARCH=linux_amd64   # or linux_arm64 for ARM

sudo useradd -r -s /usr/sbin/nologin navidrome
sudo mkdir -p /opt/navidrome /var/lib/navidrome

curl -fsSL "https://github.com/navidrome/navidrome/releases/download/v${NDVERSION}/navidrome_${NDVERSION}_${ARCH}.tar.gz" \
  | sudo tar -xzC /opt/navidrome

sudo chown -R navidrome:navidrome /opt/navidrome /var/lib/navidrome

Configure Navidrome

The package installs drop a config file at /etc/navidrome/navidrome.toml. For a binary install, create it yourself:

sudo mkdir -p /etc/navidrome
sudo tee /etc/navidrome/navidrome.toml <<'EOF'
MusicFolder  = "/srv/music"
DataFolder   = "/var/lib/navidrome"
LogLevel     = "info"
Port         = 4533
Address      = "0.0.0.0"
EOF

Key options to know:

  • MusicFolder — path to your music. Navidrome reads it recursively. Use a flat layout or a well-tagged one; it doesn't care about directory structure, only ID3/Vorbis tags.
  • DataFolder — SQLite database and cache land here. Keep it on fast storage; SSD is ideal.
  • ScanSchedule — cron-style expression for automatic rescanning, e.g. "@every 1h". Omit it to scan only on startup and manual trigger.
  • Address — bind to 127.0.0.1 if you're placing Nginx or Caddy in front; use 0.0.0.0 for direct access.

Make sure the navidrome system user can read your music directory:

sudo setfacl -R -m u:navidrome:rX /srv/music
# or simply:
sudo chown -R navidrome:navidrome /srv/music

Enable and Start the Service

Package installs create the systemd unit automatically. For a binary install, write one manually:

sudo tee /etc/systemd/system/navidrome.service <<'EOF'
[Unit]
Description=Navidrome Music Server
After=network.target

[Service]
User=navidrome
Group=navidrome
Type=simple
ExecStart=/opt/navidrome/navidrome --configfile /etc/navidrome/navidrome.toml
WorkingDirectory=/var/lib/navidrome
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now navidrome

Open the Firewall

ufw (Ubuntu/Debian)

sudo ufw allow 4533/tcp comment "Navidrome"

firewalld (Fedora/RHEL/Rocky)

sudo firewall-cmd --permanent --add-port=4533/tcp
sudo firewall-cmd --reload

Skip this step if Navidrome is bound to 127.0.0.1 behind a reverse proxy.

First Login and Library Setup

Browse to http://<server-ip>:4533. On the very first load Navidrome prompts you to create an admin account — do this immediately; it only shows that prompt once. After logging in, click the scan icon in the top-right or wait for the scheduled scan to complete. Watch progress in Settings → Library.

Navidrome depends heavily on embedded tags. If your library shows up with missing artists or albums, the culprit is almost always untagged or inconsistently tagged files. Tools like MusicBrainz Picard or beets fix that cleanly before you ingest the files.

Bind Navidrome to 127.0.0.1 in the config, then proxy it with TLS:

sudo tee /etc/nginx/sites-available/navidrome <<'EOF'
server {
    listen 443 ssl http2;
    server_name music.example.com;

    ssl_certificate     /etc/letsencrypt/live/music.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/music.example.com/privkey.pem;

    location / {
        proxy_pass         http://127.0.0.1:4533;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/navidrome /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Connect Subsonic-Compatible Clients

Navidrome speaks the Subsonic REST API (plus OpenSubsonic extensions). Every client below connects with the same four fields: server URL, username, password, and API version (leave that on auto if the client asks).

DSub (Android)

DSub is a mature, free Android client. In Settings → Server set the server URL to your Navidrome address (with https:// if behind a proxy). Use your Navidrome username and password — not a separate API key. Enable Force custom protocol if you see authentication errors, which forces the legacy hex-encoded password mode Navidrome accepts.

play:Sub (iOS)

Open Settings → Add Server. Enter the full URL including the port if not using a reverse proxy (e.g. http://192.168.1.10:4533). play:Sub supports offline sync — mark albums for download and they cache locally for airplane mode playback.

Symfonium is a paid client with a polished Material You interface and excellent ReplayGain support. Add a provider under Sources → Add Media Provider → Subsonic. Toggle OpenSubsonic on — Navidrome supports these extensions and Symfonium uses them for better cover art quality and star ratings. Set the base URL without a trailing slash.

Desktop: Sublime Music / Feishin

Feishin is an Electron-based desktop client available as an AppImage or Flatpak that supports Navidrome natively. Sublime Music is a GTK Python app that works well on GNOME desktops. Both find Navidrome at the same server URL/credentials.

Verify Everything Works

# Service status
systemctl status navidrome

# Live logs
journalctl -u navidrome -f

# Quick API smoke-test (replace credentials)
curl -s "http://localhost:4533/rest/ping?u=admin&p=yourpassword&v=1.16.1&c=test&f=json" | python3 -m json.tool

A healthy ping returns {"subsonic-response":{"status":"ok", ...}}. Any 40 status in the logs usually means a file permission problem on the music directory or the data folder.

Troubleshooting

  • Library scan finds 0 tracks: Confirm the navidrome user can actually read the files — sudo -u navidrome ls /srv/music. Also check that files have standard extensions (.mp3, .flac, .opus, .m4a); Navidrome skips unknown extensions by default.
  • Clients can't authenticate: Some older Subsonic clients send MD5-token auth. Navidrome supports it, but only if PasswordEncryption is not set to bcrypt. Check your config. Newer clients should work fine with the default settings.
  • Transcoding not working: Navidrome uses ffmpeg for transcoding. Install it (sudo apt install ffmpeg / sudo dnf install ffmpeg) and restart the service. Without ffmpeg, Navidrome serves files as-is, which is fine on a fast local network but may cause issues on slow mobile connections.
  • High CPU during initial scan: Normal. Navidrome extracts embedded art and builds the SQLite index for all tracks on first run. On a 50,000-track library expect 5-15 minutes. It won't repeat the full scan unless files change.
  • Navidrome not accessible behind reverse proxy: Set BaseURL = "/" in the config if you're serving from a subpath, and make sure the proxy passes X-Forwarded-Proto so Navidrome generates correct HTTPS links.
tested on:Ubuntu 24.04Debian 12Fedora 40Arch rolling

Frequently asked questions

Does Navidrome support gapless playback?
Gapless playback depends on the client, not the server. Symfonium and a few others implement client-side gapless; DSub and play:Sub do not. Navidrome itself just streams the file — it has no control over how the client buffers and stitches tracks.
Can multiple users each have their own library or playlists?
Yes. Navidrome supports multiple user accounts with individual play counts, starred tracks, and playlists. All users share the same music library, but their listening history and ratings are completely separate. There is no per-user folder restriction in the current release.
What audio formats does Navidrome support?
Navidrome reads tags from MP3, FLAC, AAC/M4A, OGG Vorbis, Opus, WMA, WAV, AIFF, and several others. It serves files as-is by default. With ffmpeg installed it can transcode on the fly to MP3 or Opus for clients that request it or for bandwidth limiting.
Is the Subsonic API password sent in plaintext?
Older Subsonic clients send passwords as a hex-encoded string in the URL query — not great, which is why running Navidrome behind HTTPS is strongly recommended. Clients supporting token-based auth (salted MD5) are marginally better. Over a TLS connection the risk is low in practice.
How do I update Navidrome?
If you used an apt or dnf package, a normal system upgrade (apt upgrade / dnf upgrade) picks it up. For binary installs, stop the service, replace the binary in /opt/navidrome with the new release, and restart. The database schema auto-migrates on startup.

Related guides