Skip to content

Navidrome

Modern Music Streaming Server

Navidrome is a self-hosted music server and streamer written in Go. It's Subsonic-compatible and provides a modern, lightweight solution for streaming your personal music collection anywhere with a beautiful web interface and extensive mobile app support.

Why Choose Navidrome?

  • Subsonic-compatible - works with 100+ mobile apps
  • Multi-format - MP3, FLAC, OGG, M4A, and more
  • Lightweight - single binary with minimal resources
  • Multi-user - individual libraries with Last.fm scrobbling

Install

Infrastructure as Code

This Navidrome instance is deployed using OpenTofu with custom Incus images. The infrastructure configuration manages container provisioning and persistent storage volumes.

Custom Navidrome Image

The Navidrome Incus image is built and maintained at forgejo.benoit.jp.net/Benoit/Laminar.

Infrastructure Configuration

The OpenTofu configuration provisions:

  • Incus instance running custom Navidrome image
  • Two persistent storage volumes:
    • /var/lib/navidrome - Application data and database
    • /var/backups/navidrome - Backup storage
OpenTofu Configuration
resource "incus_storage_volume" "navidrome_var_lib_navidrome" {
  name = "navidrome_var_lib_navidrome"
  pool = incus_storage_pool.default.name
  config = {
    "initial.gid" = "1001"
    "initial.uid" = "1001"
    "initial.mode" = "755"
  }
}

resource "incus_storage_volume" "navidrome_var_backups_navidrome" {
  name = "navidrome_var_backups_navidrome"
  pool = incus_storage_pool.default.name
}

resource "incus_instance" "navidrome" {
  name  = "navidrome"
  image = "laminar.incus:navidrome-0.58.0-1benoitjpnet"

  device {
    name = "var_lib_navidrome"
    type = "disk"
    properties = {
      path   = "/var/lib/navidrome"
      source = incus_storage_volume.navidrome_var_lib_navidrome.name
      pool   = incus_storage_pool.default.name
    }
  }

  device {
    name = "var_backups_navidrome"
    type = "disk"
    properties = {
      path   = "/var/backups/navidrome"
      source = incus_storage_volume.navidrome_var_backups_navidrome.name
      pool   = incus_storage_pool.default.name
    }
  }
}

Deploy Infrastructure

Apply OpenTofu configuration
tofu apply

After provisioning, configure Navidrome by editing /etc/navidrome.toml with your music library path and preferences.

Upgrade

Incus Image Upgrade

When upgrading to a newer Incus image version, follow these steps to migrate your data.

Backup current instance data before upgrading:

Enter Incus container
incus shell navidrome

Copy configuration file

cp /etc/navidrome.toml /var/backups/navidrome/

Deploy to new Incus image and restore data:

Update OpenTofu configuration

Edit your OpenTofu configuration file to update the image version:

resource "incus_instance" "navidrome" {
  name  = "navidrome"
  image = "laminar.incus:navidrome-NEW-VERSION"  # Update this line
  # ...
}

Apply infrastructure changes

Provision new Incus container
tofu apply
Enter Incus container
incus shell navidrome

Restore configuration file

cp /var/backups/navidrome/navidrome.toml /etc/

Restart Navidrome service

systemctl restart navidrome

Upgrade Complete

Your Navidrome instance is now running on the new Incus image!

Music Library Synchronization

Embedded Syncthing Service

The Navidrome Incus image includes a Syncthing service for seamless music file synchronization to the persistent storage volume. This allows you to easily sync your music collection from other devices to your Navidrome library.

Accessing Syncthing

The Syncthing web interface runs on port 8384 inside the container. Since it's only needed for initial setup, simply connect directly to the container's IP address - no reverse proxy configuration is required.

Find container IP
incus list navidrome

Then navigate to http://<container-ip>:8384 in your browser.

Syncthing Configuration

Music Directory

Configure Syncthing to sync your music files to the directory specified in /etc/navidrome.toml (typically under /var/lib/navidrome/music or your configured music path). Navidrome will automatically detect and index new files.