Self-hosted music streaming on Raspberry Pi 4, powered by Navidrome and Kubernetes (k3s).
┌─────────────────────────────────────────┐
│ Raspberry Pi 4 │
Internet │ k3s │
│ │ │
▼ │ ┌─────────────────────────────────┐ │
Cloudflare ────────┼──▶│ namespace: resonance │ │
Tunnel │ │ │ │
music.ytchop.com │ │ ┌──────────┐ │ │
│ │ │Navidrome │◀── /data (SQLite) │ │
│ │ │ :4533 │ 1TB OS SSD │ │
│ │ │ │ │ │
│ │ │ │◀── /music (read) │ │
│ │ └──────────┘ 2TB Music SSD │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
▲
Subsonic API (HTTPS)
│
┌──────────────────┼──────────────────┐
│ │ │
Substreamer Feishin Web UI
(iOS/Android) (Desktop) (Browser)
| Component |
Technology |
| Hardware |
Raspberry Pi 4 (8GB RAM), 1TB OS SSD, 2TB Music SSD |
| OS |
Ubuntu 24.04 (arm64) |
| Orchestration |
k3s (lightweight Kubernetes) |
| Application |
Navidrome (music streaming server) |
| Audio Format |
Opus (~128-160kbps via yt-dlp) |
| Ingress |
Cloudflare Tunnel (music.ytchop.com) |
| Monitoring |
Prometheus + Grafana (existing cluster stack) |
| Path |
Device |
Purpose |
/mnt/music |
2TB SSD (USB) |
Music library — mounted read-only to Navidrome |
/data/navidrome |
1TB OS SSD |
Navidrome SQLite DB, cache, transcoding temp |
- k3s cluster running on Raspberry Pi
- 2TB SSD mounted at
/mnt/music with music organized as:
/mnt/music/
Artist Name/
Album Name (Year)/
01 - Track Name.opus
cover.jpg
- Cloudflare Tunnel configured
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/navidrome.yaml
kubectl apply -f k8s/service.yaml
kubectl get pods -n resonance
curl http://localhost:30093
On first access, create an admin user via the web UI. Signup is automatically disabled after the first user is created.
| Client |
URL / Config |
| Web UI |
https://music.ytchop.com |
| Mobile (Substreamer) |
Server: https://music.ytchop.com, Subsonic API |
| Desktop (Feishin) |
Server: https://music.ytchop.com, Subsonic API |
- External: Cloudflare Tunnel →
music.ytchop.com → NodePort 30093
- Internal:
http://192.168.1.64:30093
- USB throughput: ~30 MB/s (USB 2.0 hub) — sufficient for audio streaming