Spotify casero con TrueNAS + Proxmox + Navidrome + Nginx + Tailscale (Android Auto)
🎧💡 ¿Cansado de pagar cada mes por escuchar la música que ya tienes? ¿Te gustaría tener tu propio Spotify casero, sin límites, sin anuncios y accesible desde cualquier parte — incluso en tu coche con Android Auto? 🚗🎶
Entonces este proyecto es para ti 👇
Con TrueNAS, Proxmox, Navidrome, Nginx y Tailscale puedes montar en casa un servidor musical privado, estable y seguro, que convierte tu biblioteca local en una plataforma de streaming profesional.
➡️ Subes tu música una vez a tu dataset de TrueNAS. ➡️ Proxmox aloja el contenedor de Navidrome que la gestiona. ➡️ Nginx y Tailscale se encargan de servirla cifrada por Internet. ➡️ Y desde tu móvil, con Symfonium, accedes a toda tu colección con portadas, artistas y álbumes perfectamente organizados.
🎶 En este artículo te cuento paso a paso cómo lo he montado yo, los problemas que me encontré y cómo los resolví. Y lo mejor: una vez lo dejas funcionando, todo se actualiza solo. 💪
⚠️ Nota legal: desde sergiogd.es no se fomenta ni se apoya la piratería digital. Este proyecto está pensado exclusivamente para reproducir archivos de audio obtenidos legalmente, comprados o creados por el propio usuario. El objetivo es promover el aprendizaje técnico y el uso responsable de la tecnología. 🎓💿
Arquitectura
- TrueNAS comparte la música por NFS (dataset
/mnt/Datos/MUSICA). - Proxmox monta el NFS y lo inyecta a un LXC Debian para Navidrome.
- Nginx (VM) hace de reverse proxy con TLS de Tailscale en
/navidrome. - Symfonium (Android / Android Auto) reproduce vía HTTPS.
1) TrueNAS: NFS del dataset de música
- Sharing → Unix Shares (NFS) → Add → Path:
/mnt/Datos/MUSICA. - En Advanced Options: Maproot User = root, Maproot Group = wheel. Guarda y reinicia NFS.
- (Opcional SMB para Windows) Asegura RW para tu usuario y ACL heredables.
2) Proxmox (host): montar NFS y pasarlo al LXC
# Host Proxmox
mkdir -p /mnt/truenas_musica
mount -t nfs 192.168.1.65:/mnt/Datos/MUSICA /mnt/truenas_musica
# Persistente
echo "192.168.1.65:/mnt/Datos/MUSICA /mnt/truenas_musica nfs defaults,_netdev 0 0" >> /etc/fstab
systemctl daemon-reload
mount -a
# Inyectar en LXC 103 (Navidrome)
pct set 103 -mp0 /mnt/truenas_musica,mp=/mnt/musica
pct restart 103
3) Instalar Navidrome en el LXC (Debian)
apt update && apt install -y curl ca-certificates ffmpeg
cd /tmp
curl -L -o navidrome.tar.gz https://github.com/navidrome/navidrome/releases/download/v0.58.0/navidrome_0.58.0_linux_amd64.tar.gz
tar -xvzf navidrome.tar.gz
install -m 0755 navidrome /usr/local/bin/navidrome
navidrome --version
4) Config y servicio systemd
/etc/navidrome/navidrome.toml:
MusicFolder = "/mnt/musica"
DataFolder = "/var/lib/navidrome"
Port = 4533
Address = "0.0.0.0"
BaseURL = "/navidrome"
EnableTranscoding = true
LogLevel = "info"
ScanInterval = "15m"
/etc/systemd/system/navidrome.service:
[Unit]
Description=Navidrome Music Server
After=network.target
[Service]
ExecStart=/usr/local/bin/navidrome --configfile /etc/navidrome/navidrome.toml
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now navidrome
systemctl status navidrome
5) Nginx + Tailscale: reverse proxy en /navidrome
Usa el mismo vhost que Nextcloud (un único server_name) y añade la subruta. Ojo: sin “/” final en proxy_pass.
server {
listen 443 ssl http2;
server_name ngix.tailXXXX.ts.net;
ssl_certificate /var/lib/tailscale/certs/ngix.tailXXXX.ts.net.crt;
ssl_certificate_key /var/lib/tailscale/certs/ngix.tailXXXX.ts.net.key;
# Nextcloud en raíz
location / {
proxy_pass http://192.168.1.65:30027;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Navidrome en /navidrome
location = /navidrome { return 301 /navidrome/; }
location ^~ /navidrome/ {
proxy_http_version 1.1;
proxy_pass http://192.168.1.70:4533; # <-- sin barra final
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /navidrome;
proxy_redirect off;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}
6) Symfonium (Android / Android Auto)
- Nuevo servidor → Subsonic / Navidrome
- URL:
https://ngix.tailXXXX.ts.net/navidrome - Usuario/clave: los de Navidrome → Guardar → Sincronizar.
7) Metadatos y carátulas (MusicBrainz Picard)
- Clúster → Analizar/Lookup → revisa álbum, año y portada.
- Opciones → Carátula: Incrustar carátula + guardar
folder.jpg. - Guardar (💾). Navidrome leerá títulos, artista, álbum, portada, etc.
8) Cron: full scan cada 6 horas
En el LXC (como root):
crontab -e
# Añade:
0 */6 * * * /usr/local/bin/navidrome scan --configfile /etc/navidrome/navidrome.toml --full >> /var/log/navidrome_cron.log 2>&1
9) Backups en Proxmox
# VM Nginx (102)
vzdump 102 --storage backups --mode snapshot --compress zstd
# LXC Navidrome (103)
vzdump 103 --storage backups --mode snapshot --compress zstd
Solución de problemas
- Permisos en LXC salen nobody:nogroup → en TrueNAS NFS pon Maproot User = root, Group = wheel, reinicia NFS y remonta en Proxmox.
- 404/502 en /navidrome → quita la barra final de
proxy_passy confirmaBaseURL="/navidrome". - No hay carátulas → instala
ffmpeg, incrusta portadas con Picard o añadefolder.jpgpor álbum. - DNS falla en LXC →
pct set 103 -nameserver "8.8.8.8 1.1.1.1" && pct reboot 103.