Navidrome

Self-hosted music streaming server (12k ⭐). Subsonic-compatible, works with every music client (Sonix, DSub, Subtracks), supports transcoding,Gapless playback, and library scanning.

yaml

docker-compose.yml

volumes:
  navidrome_data:
services:
  navidrome:
    container_name: navidrome
    image: deluan/navidrome:latest
    restart: unless-stopped
    ports:
      - ${ND_PORT:-4533}:4533
    environment:
      - ND_SCANINTERVAL=${ND_SCANINTERVAL:-1m}
      - ND_LOGLEVEL=${ND_LOGLEVEL:-info}
      - ND_MUSICFOLDER=${ND_MUSICFOLDER:-./music}
      - ND_DATAFOLDER=${ND_DATAFOLDER:-./data}
      - ND_SESSIONTIMEOUT=${ND_SESSIONTIMEOUT:-0}
      - ND_BASEURL=${ND_BASEURL:-}
      - ND_ENABLETRANSCODINGCONFIG=${ND_ENABLETRANSCODINGCONFIG:-false}
      - ND_TRANSCODINGCACHESIZE=${ND_TRANSCODINGCACHESIZE:-100MB}
      - ND_READAHEADSECONDS=${ND_READAHEADSECONDS:-}
      - ND_LOGPATH=${ND_LOGPATH:-}
      - PUID=${PUID:-1000}
      - PGID=${PGID:-1000}
      - TZ=${TZ:-UTC}
    volumes:
      - navidrome_data:/data
      - ${ND_MUSIC_PATH:-./music}:/music:ro
    read_only: true

.ENV

.env example

# Navidrome — Self-hosted Music Streaming Server
# =============================================

# --- Core ---
ND_PORT=4533
ND_MUSICFOLDER=./music
ND_DATAFOLDER=./data
ND_SCANINTERVAL=1m
ND_LOGLEVEL=info
ND_SESSIONTIMEOUT=0
ND_BASEURL=http://navidrome.local
ND_ENABLETRANSCODINGCONFIG=false
ND_TRANSCODINGCACHESIZE=100MB
ND_LOGPATH=./log

# --- Transcoding ---
# ND_READAHEADSECONDS=60

# --- Paths (mounted from host) ---
ND_MUSIC_PATH=./music

# --- User/Group ---
PUID=1000
PGID=1000

# --- Locale ---
TZ=UTC

deployment

Quick Start

  1. Create a working directory named after the service.
  2. Copy the compose file and generated `.env` into that directory.
  3. Review the variables and replace placeholders with real values.
  4. Run `docker compose up -d`.
mkdir navidrome
cd navidrome
# create docker-compose.yml
# create .env
docker compose up -d