Navidrome on TrueNAS Scale (Day 23)

Got an old music collection sitting around? try Navidrome

Navidrome on TrueNAS Scale (Day 23)
Photo by Namroud Gorguis / Unsplash

I found some old hard drives from my campus days (surprisingly still working) with a bunch of songs. Rather than letting these sit idle, figured it was time to make this collection accessible on the go.

So I went looking for something I could use and found Navidrome.

Setting Up TrueNAS Datasets

First, create two datasets through the TrueNAS GUI (I prefer this over regular folders for better permission control):

navidrome
├── data
└── music

Installing Navidrome

TrueNAS Scale's ElectricEel release moved to Docker for apps (instead of Kubernetes)

Install:

  1. Create the necessary datasets
  2. Install Navidrome from the apps catalog
  3. Configure:
    1. Set environment variables if needed
    2. Point to your data and music folders
    3. Set user/group IDs
    4. Configure resource

Adding Traefik Routing

This part assumes you already have Traefik set up as a reverse proxy with cert-manager and HTTPS redirect middleware configured.

If you're starting fresh, you'll want to get those pieces in place first.

Once Navidrome is running, we need to make it accessible through a reverse proxy. This requires two pieces:

  • an external service
  • ingress route

An external service definition:

apiVersion: v1
kind: Service
metadata:
  name: navidrome
  namespace: routes
spec:
  ports:
    - port: <port>
      targetPort: <port>
  type: ExternalName
  externalName: <Ip>

HTTP redirect route:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: navidrome-redirect
  namespace: routes
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`<host>`)
      kind: Rule
      middlewares:
        - name: https-redirect
      services:
        - name: noop@internal
          kind: TraefikService

And the actual route over HTTPS:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: navidrome
  namespace: routes
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`<host>`)
      kind: Rule
      services:
        - name: navidrome
          port: <port>
          scheme: http
  tls:
    secretName: <ssl cert secret>

Beyond the Web UI

While Navidrome's web interface is solid, one of its strengths is Subsonic API compatibility.

This means you can use various Subsonic-compatible apps as front-ends for your music collection.

I chose to use Symfonium as my client of choice and it's been impressive.

Went for a photo walk and with gapless playback and a smart queue that keeps playing similar tracks (like Spotify's song radio'ish), it basically works, I forgot it was a self hosted thing. Also thanks to Tailscale, I can stream my music anywhere without noticing any difference from other services.

Now this isn't a replacement and I will still most definitely keep my spotify playlists