Configure Self-Hosted Music Streamer

Configure Self-Hosted Music Streamer

I stopped paying for Spotify last year and built my own music streaming service instead. Within an afternoon, I had Navidrome running on my homelab, serving my entire music collection to my phone, laptop, and living room speakers. No algorithms, no ads, no monthly bill — just music I own, streamed the way I want it.

If you've ever wanted to break free from subscription services or simply enjoy the control that comes with self-hosting, a personal music streamer is one of the most satisfying projects you can tackle. It's easier than you'd think, and I'll walk you through the entire setup.

Why Self-Host Your Music?

The obvious reason: cost. Streaming subscriptions add up. But there's more to it. When you self-host, you own your data. No tracking. No algorithm deciding what you should hear. No sudden removal of artists you love because of licensing disputes. Your music collection stays yours, forever.

I prefer self-hosting music because I have a large collection of rare albums, live bootlegs, and regional artists that never made it to commercial streaming platforms. With a personal streamer, everything lives in one place. I can play the same song on my phone during my commute, switch to my home speaker, then continue from my browser without any nonsense.

Beyond control, there's the technical satisfaction. Unlike most self-hosted projects, a music streamer is genuinely lightweight. You don't need enterprise-grade hardware. A Raspberry Pi 4, an old laptop, or even a small VPS from RackNerd works beautifully.

Choosing Your Music Streamer

Two platforms dominate the self-hosted music space: Navidrome and Subsonic. I went with Navidrome because it's open-source, actively maintained, and requires minimal resources.

Navidrome is a lightweight Subsonic-compatible server. That compatibility matters — it means you can use any Subsonic-compatible client (like Subsonic Mobile, Feishin, or Plex) to play your music. Navidrome handles the streaming, transcoding, and library management without the bloat of full media center solutions.

Subsonic itself is proprietary but mature. If you want battle-tested stability and don't mind paying for a license, Subsonic is solid. For this tutorial, I'm using Navidrome because it's free and runs on minimal hardware.

Prerequisites: What You'll Need

First, a place to run it. I recommend:

Second, your music. You'll need MP3s, FLACs, or other common formats stored somewhere accessible. I keep mine on a 2TB external drive plugged into my Raspberry Pi, mounted as a network share.

Third, a reverse proxy for remote access. I use Caddy, but Nginx or Traefik work too. If you're only streaming at home, you can skip this for now.

Tip: Use FLAC or Opus if you care about audio quality, but MP3 works fine for everything. Navidrome automatically transcodes larger files to lower bitrates for mobile clients, so your original quality is preserved on disk.

Installation with Docker Compose

Docker Compose is the easiest path. I've been running Navidrome this way for months without a single restart required.

mkdir -p ~/navidrome/{music,data}
cd ~/navidrome

cat > docker-compose.yml << 'EOF'
version: '3'
services:
  navidrome:
    image: deluan/navidrome:latest
    ports:
      - "4533:4533"
    environment:
      ND_LOGLEVEL: "info"
      ND_BASEURL: "http://navidrome.local:4533"
      ND_MUSICFOLDER: "/music"
      ND_SCANSCHEDULE: "@every 2h"
      ND_DEFAULTLANGUAGE: "en"
      ND_ENABLETRANSCODINGCONFIG: "true"
      ND_TRANSCODINGCACHESIZE: "100MB"
    volumes:
      - ./music:/music:ro
      - ./data:/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4533"]
      interval: 30s
      timeout: 10s
      retries: 3
EOF

docker-compose up -d

Once that's running, point your browser to http://localhost:4533 and log in with the default credentials (admin / admin). Change that password immediately.

The ./music directory is mounted as read-only, which is intentional. It prevents the container from accidentally modifying your files. I sync my music to this folder using rsync from my main storage.

Configuring Navidrome for Real Use

Out of the box, Navidrome works. But you'll want to tweak a few settings for actual streaming.

Log in to Navidrome, click Settings (gear icon), and configure:

Navidrome reads metadata from your files. If your library is tagged poorly, spend an hour with MusicBrainz Picard to fix it. Trust me — proper tags make everything better.

Setting Up Transcoding for Mobile Streaming

Streaming full-quality FLACs over mobile connections will drain your data plan. Transcoding solves this. Here's how I configured it:

docker exec navidrome-navidrome-1 which ffmpeg

# If ffmpeg isn't installed, you'll need a custom Dockerfile
# Create a new file called Dockerfile:

cat > Dockerfile << 'EOF'
FROM deluan/navidrome:latest
RUN apk add --no-cache ffmpeg
EOF

docker build -t navidrome-custom .

# Then update docker-compose.yml to use:
# image: navidrome-custom
# Then: docker-compose up -d --build

Once FFmpeg is available, Navidrome automatically handles transcoding. In the mobile client settings, you can request lower bitrates. I typically use 128k MP3 for mobile, 320k for home WiFi.

Remote Access with a Reverse Proxy

Navidrome on localhost is fine, but you probably want to stream from work or while traveling. This is where a reverse proxy comes in. I use Caddy because it's simple and automatically handles HTTPS with Let's Encrypt.

If you're running Navidrome on a home server, you need either:

  1. Port forwarding (risky, requires DDNS)
  2. Cloudflare Tunnel (zero trust, no open ports)
  3. Tailscale (private VPN, seamless access)
  4. Small VPS with Caddy (full control, costs ~$3/month)

I recommend Tailscale for simplicity or a tiny VPS if you want external clients who don't have Tailscale to access your music.

Watch out: If you expose Navidrome directly to the internet without authentication, someone will find it and start streaming your music. Use a firewall, strong credentials, and preferably a reverse proxy with basic auth or OAuth.

Choosing a Music Client

Navidrome is Subsonic-compatible, so you have options:

I use Feishin on desktop and Subsonic Mobile on my phone. The Navidrome web player is surprisingly good for quick listening in a browser.

Ongoing Maintenance

After setup, there's very little to do. Navidrome runs silently. Update it every few months:

cd ~/navidrome
docker-compose pull
docker-compose up -d

Monitor your library. When you add new music, Navidrome picks it up automatically during the next scan. If you want to force a scan immediately, click the refresh icon in the Settings.

Keep an eye on disk space. The ./data folder holds your Navidrome database and transcode cache. Mine sits at about 500MB with 5,000 songs.

Wrapping Up

Setting up a self-hosted music streamer is one of the most practical self-hosting projects you can do. You get tangible benefits — lower costs, better control, offline listening — and the technical satisfaction of running something elegant and minimal.

Start small. Get Navidrome running on Docker. Organize your music library properly. Then add remote access when you need it. The beauty of self-hosting music is that you can iterate without worrying about service changes or policy updates.

Next step: Download the latest Navidrome image, spin up the Docker Compose stack, and add your first 100 songs. Once you see your library working flawlessly across all your devices, you'll understand why self-hosting music is worth the effort.

```