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
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¶
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:
Deploy to new Incus image and restore data:
Update OpenTofu configuration
Edit your OpenTofu configuration file to update the image version:
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.
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.