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. 🎓💿


Panel de Navidrome funcionando con TrueNAS y Proxmox

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

  1. Sharing → Unix Shares (NFS) → Add → Path: /mnt/Datos/MUSICA.
  2. En Advanced Options: Maproot User = root, Maproot Group = wheel. Guarda y reinicia NFS.
  3. (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)

  1. Nuevo servidor → Subsonic / Navidrome
  2. URL: https://ngix.tailXXXX.ts.net/navidrome
  3. 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_pass y confirma BaseURL="/navidrome".
  • No hay carátulas → instala ffmpeg, incrusta portadas con Picard o añade folder.jpg por álbum.
  • DNS falla en LXCpct set 103 -nameserver "8.8.8.8 1.1.1.1" && pct reboot 103.

Resultado: servidor musical privado, estable y accesible por VPN, compatible con Android Auto y con escaneo automático.

Todos los derechos resarvados © | Política de Privacidad | Política de Cookies
Scroll al inicio