Cum îți faci propriul „Spotify” acasă cu Navidrome + Caddy (HTTPS pe 8443) — ghid pas cu pas

Scop: să faci streaming din colecția ta de MP3-uri de pe un HDD vechi, cu acces din LAN și WAN, folosind un PC vechi + OpenWrt, fără să atingi porturile 80/443 ale routerului.

Arhitectura finală:

Internet/WAN
  ↓ (TCP 8443)
OpenWrt Port Forward 8443 → server:8443
  ↓
Caddy (HTTPS pe 8443, certificat self-signed)
  ↓
Navidrome (localhost:4533)
  ↓
HDD montat read-only: /mnt/music/mp3

0) Ce ai nevoie

  • Un PC / mini-server (Linux)
  • HDD cu muzică montat la: /mnt/music/mp3
  • Docker + Docker Compose
  • Domeniu (ex: music.exemplu.ro) cu A record spre IP-ul tău public
  • Router OpenWrt

1) Montează HDD-ul permanent (read-only)

  1. Ia UUID:
sudo blkid /dev/sdb1
  1. Creează mountpoint:
sudo mkdir -p /mnt/music
  1. Adaugă în /etc/fstab (înlocuiești UUID-ul):
sudo nano /etc/fstab

Linie exemplu:

UUID=1E40C31640C2F415  /mnt/music  ntfs-3g  ro,noatime  0  0
  1. Test:
sudo mount -a
ls /mnt/music/mp3

2) Instalează Docker + Compose

sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER

Re-login (logout/login) și verifică:

docker ps

3) Pornește Navidrome (Docker)

  1. Creează foldere:
mkdir -p ~/navidrome/data
cd ~/navidrome
  1. Creează docker-compose.yml:
nano docker-compose.yml

Pune:

version: "3"

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    ports:
      - "4533:4533"
    volumes:
      - /mnt/music/mp3:/music:ro
      - ./data:/data
    environment:
      ND_LOGLEVEL: info
      ND_SCANINTERVAL: 1h
      ND_SESSIONTIMEOUT: 24h
    restart: unless-stopped
  1. Start:
docker-compose up -d
docker ps
  1. Accesează în LAN:
http://IP_SERVER:4533

Creează user admin, apoi un user non-admin pentru ascultat.


4) Instalează Caddy (reverse proxy)

sudo apt install caddy -y

5) Creează certificat self-signed pentru HTTPS (pe 8443)

  1. Creează director:
sudo mkdir -p /etc/caddy/certs
  1. Generează cert + key (înlocuiește domeniul):
sudo openssl req -x509 -newkey rsa:2048 -sha256 -days 825 -nodes \
  -keyout /etc/caddy/certs/navidrome.key \
  -out /etc/caddy/certs/navidrome.crt \
  -subj "/CN=music.exemplu.ro"
  1. Permisiuni corecte (Caddy rulează ca user caddy):
sudo chown root:caddy /etc/caddy/certs/navidrome.key /etc/caddy/certs/navidrome.crt
sudo chmod 640 /etc/caddy/certs/navidrome.key
sudo chmod 644 /etc/caddy/certs/navidrome.crt

6) Configurează Caddy să servească HTTPS pe 8443

Editează:

sudo nano /etc/caddy/Caddyfile

Pune (exact așa):

https://:8443 {
  reverse_proxy localhost:4533
  tls /etc/caddy/certs/navidrome.crt /etc/caddy/certs/navidrome.key
}

Restart:

sudo systemctl restart caddy

Verifică:

sudo ss -tuln | grep :8443
curl -vk https://127.0.0.1:8443/ 2>&1 | head -n 15

7) Firewall pe server (UFW)

sudo ufw allow 22/tcp
sudo ufw allow 8443/tcp
sudo ufw enable
sudo ufw status

Nu expune 4533 în internet (rămâne intern).


8) DNS: domeniul spre IP public

La providerul domeniului:

  • A record: music → IP-ul tău public (ex: 5.12.25.xx)

Verifică de pe server:

curl -4 ifconfig.me

9) OpenWrt: Port Forward 8443 → server:8443

În LuCI:
Network → Firewall → Port Forwards → Add

Setări:

  • Name: navidrome-8443
  • Protocol: TCP
  • External zone: wan
  • External port: 8443
  • Internal zone: lan
  • Internal IP: IP_SERVER (ex: 172.30.0.xx)
  • Internal port: 8443
  • Enable: ✔

Save & Apply.


10) Test final LAN + WAN

LAN

  • În browser:
https://IP_SERVER:8443

Acceptă warning-ul (self-signed).

WAN

  • Pe telefon cu Wi-Fi OFF (date mobile):
https://music.exemplu.ro:8443

Acceptă warning-ul (self-signed).


11) Aplicații mobile

Android (Symfonium)

  • Server type: Subsonic
  • URL: https://music.exemplu.ro:8443
  • User: non-admin
  • Ignore SSL errors: ON

iOS (play:Sub)

  • Server: Subsonic
  • URL: https://music.exemplu.ro:8443
  • Allow invalid SSL: ON

12) Calitate audio + caching (recomandat)

  • Streaming quality: Original
  • Transcoding: Off
  • Cache: 2–5 GB
  • Gapless playback: On
  • Offline downloads: Original

13) (Opțional) Last.fm scrobbling

În Navidrome:
Settings → Users → user-ul de ascultat → Last.fm scrobbling → Authorize


Troubleshooting rapid (cele mai frecvente)

  • „SSL wrong version number”: ai accesat https:// către un endpoint HTTP. Asigură-te că Caddy servește HTTPS pe 8443.
  • „permission denied” pe key: rulează chown root:caddy și chmod 640 pe fișierul .key.
  • WAN nu merge, LAN merge: verifică port forward OpenWrt și UFW 8443/tcp.
  • Se deschide UI-ul routerului: nu forwarda spre 443; folosește 8443 → 8443.