How to Deploy Navidrome – Self-Hosted Music Streaming Server

Updated on 19 February, 2026
Deploy Navidrome music server with Docker Compose, Traefik, HTTPS, and streaming support.
How to Deploy Navidrome – Self-Hosted Music Streaming Server header image

Navidrome is an open-source music streaming server that lets you browse and listen to your music collection in a web browser. It runs as a lightweight service on a self-managed server and provides features such as library organization, metadata handling, and audio streaming to compatible clients.

This article demonstrates how to deploy Navidrome on a Linux server using Docker Compose. It covers service configuration, storage setup, and initial access to the Navidrome dashboard.

Prerequisites

Before you begin, you need to:

Set Up the Directory Structure, Configuration, and Environment Variables

Navidrome needs directories to store application data and music files, along with environment variables that define paths, timezone, and domain settings. This section prepares the directory structure and the .env file used by Docker Compose.

  1. Create the project directory and required subdirectories.

    console
    $ mkdir -p ~/navidrome/{data,music}
    
    • data stores the Navidrome database, cache, and application metadata.
    • music stores your music library files that Navidrome scans and streams.
  2. Navigate to the project directory.

    console
    $ cd ~/navidrome
    
  3. Create a .env file to store environment variables.

    console
    $ nano .env
    
  4. Add the following variables.

    ini
    TZ=Asia/Kolkata
    
    ND_MUSICFOLDER=/music
    ND_DATAFOLDER=/data
    ND_LOGLEVEL=info
    ND_PORT=4533
    
    DOMAIN=navidrome.example.com
    EMAIL=admin@example.com
    

    Replace:

    • Asia/Kolkata with your preferred timezone.
    • navidrome.example.com with your actual domain name pointing to this server.
    • admin@example.com with your email address.

    Save and close the file.

Deploy Navidrome with Docker Compose

The Docker Compose configuration defines two services - Navidrome, which handles music streaming, and Traefik, which acts as a reverse proxy. Traefik terminates HTTPS traffic using a Let's Encrypt certificate and routes incoming requests to Navidrome based on the domain name defined in the .env file.

  1. Add your user to the Docker group.

    console
    $ sudo usermod -aG docker $USER
    
  2. Apply the group membership change.

    console
    $ newgrp docker
    
  3. Create a Docker Compose file.

    console
    $ nano docker-compose.yml
    
  4. Add the following configuration.

    yaml
    services:
      traefik:
        image: traefik:v3.6
        container_name: traefik
        restart: unless-stopped
        command:
          - "--providers.docker=true"
          - "--providers.docker.exposedbydefault=false"
          - "--entrypoints.web.address=:80"
          - "--entrypoints.websecure.address=:443"
          - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
          - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
          - "--certificatesresolvers.le.acme.httpchallenge=true"
          - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
          - "--certificatesresolvers.le.acme.email=${EMAIL}"
          - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - traefik_letsencrypt:/letsencrypt
    
      navidrome:
        image: deluan/navidrome:0.60.3
        container_name: navidrome
        restart: unless-stopped
        environment:
          - ND_MUSICFOLDER=${ND_MUSICFOLDER}
          - ND_DATAFOLDER=${ND_DATAFOLDER}
          - ND_LOGLEVEL=${ND_LOGLEVEL}
          - TZ=${TZ}
        volumes:
          - ./music:${ND_MUSICFOLDER}
          - ./data:${ND_DATAFOLDER}
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.navidrome.rule=Host(`${DOMAIN}`)"
          - "traefik.http.routers.navidrome.entrypoints=websecure"
          - "traefik.http.routers.navidrome.tls=true"
          - "traefik.http.routers.navidrome.tls.certresolver=le"
          - "traefik.http.services.navidrome.loadbalancer.server.port=${ND_PORT}"
    
    volumes:
      traefik_letsencrypt:
    

    Save and close the file.

    The above Docker Compose configuration includes the following services.

    navidrome service

    • Runs Navidrome using the deluan/navidrome image.
    • Reads music files from the ./music directory mounted inside the container.
    • Stores application data in the ./data directory to preserve the database and settings.
    • Uses environment variables from the .env file to set paths, log level, and timezone.
    • Exposes the web interface internally on port 4533 for Traefik to route traffic.

    traefik service

    • Runs Traefik as a reverse proxy and HTTPS router.
    • Exposes ports 80 and 443 on the host.
    • Automatically redirects HTTP traffic to HTTPS.
    • Requests and renews TLS certificates using Let’s Encrypt.
    • Routes requests for the configured domain to the Navidrome container using Docker labels.
  5. Start the services.

    console
    $ docker compose up -d
    
  6. Verify that both containers are running.

    console
    $ docker compose ps
    

    The output lists the navidrome and traefik services with the status set to Up.

    Note
    For more information about managing Docker Compose applications, refer to the How to Use Docker Compose documentation.

Access and Configure Navidrome

  1. Open your web browser and navigate to your domain over HTTPS, such as https://navidrome.example.com.

  2. Enter a username and password, then click Create Admin to create the administrator account. Navidrome stores the credentials in the persistent data directory.

    Create administrator account screen

  3. After the administrator account is created, Navidrome opens the main dashboard. If no music files are present in the configured music directory, the interface displays an empty library.

    Navidrome dashboard

Add Music to the Library and Test Streaming

Navidrome scans the configured music directory and indexes supported audio files automatically. The following steps add a sample file and verify that streaming works through the web interface.

  1. Download a public-domain audio file directly into the Navidrome music directory.

    console
    $ sudo wget https://archive.org/download/testmp3testfile/mpthreetest.mp3 -P ~/navidrome/music/
    
  2. Ensure the file is readable by the container.

    console
    $ sudo chmod -R 755 ~/navidrome/music
    
    Note
    Navidrome monitors the music directory. After the file is added, the library updates automatically.
  3. Wait for the automatic scan to complete, then verify that the album appears in the library.

    Navidrome add album

  4. Select the track and start playback in the built-in audio player to confirm that streaming works.

    Navidrome start playback

Conclusion

You have successfully deployed Navidrome using Docker Compose and secure access through Traefik with automatic HTTPS. The configuration persists application data and music files on the host, allowing the service to index and stream your collection through a web browser. For additional configuration options and advanced features, refer to the official Navidrome documentation.

Comments