Navidrome es un servidor de streaming de música ligero y open source escrito en Go. Indexa tu colección (MP3, FLAC, Opus, AAC y otros formatos), ofrece un reproductor web y es compatible con la API de Subsonic, por lo que funciona con decenas de aplicaciones para móvil y escritorio. En este tutorial instalarás Navidrome en Ubuntu 24.04 como servicio systemd con un usuario dedicado, lo publicarás con Nginx y HTTPS y conectarás una aplicación cliente.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS de 64 bits, por ejemplo un VPS de CubePath. Navidrome consume muy poco: 512 MB de RAM bastan para una colección de decenas de miles de canciones.
- Un usuario no root con privilegios
sudo. - Un subdominio (en esta guía,
music.your_domain) con un registro DNS A que apunte a la IP pública del servidor. - Tu colección de música copiada al servidor o lista para subirla.
Paso 1: Instalar FFmpeg y crear el usuario
Navidrome usa FFmpeg para transcodificar al vuelo, por ejemplo para enviar un FLAC como Opus de 128 kbps a un móvil con datos limitados. Instálalo desde los repositorios de Ubuntu:
sudo apt update
sudo apt install -y ffmpeg
Crea un usuario de sistema sin shell para ejecutar el servicio:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin navidrome
Crea el directorio del programa, el de datos (base de datos y caché) y el de la música. Tu usuario será el dueño de la música para poder subir archivos, y el grupo navidrome tendrá solo lectura. Sustituye your_user por tu usuario:
sudo install -d -o navidrome -g navidrome /opt/navidrome /var/lib/navidrome
sudo install -d -o your_user -g navidrome -m 2750 /srv/music
El modo 2750 activa el bit setgid, de modo que lo que subas a /srv/music hereda el grupo navidrome.
Paso 2: Descargar Navidrome
Navidrome se distribuye como un único binario en las versiones de GitHub. Consulta cuál es la última versión publicada:
VERSION=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep -Po '"tag_name": "v\K[^"]+')
echo "$VERSION"
0.xx.x
Descarga el archivo para amd64 (en un servidor ARM, cambia amd64 por arm64) y extráelo en /opt/navidrome:
curl -fL -o /tmp/navidrome.tar.gz "https://github.com/navidrome/navidrome/releases/download/v${VERSION}/navidrome_${VERSION}_linux_amd64.tar.gz"
sudo tar -xzf /tmp/navidrome.tar.gz -C /opt/navidrome
sudo chown -R navidrome:navidrome /opt/navidrome
Comprueba que el binario funciona:
/opt/navidrome/navidrome --version
0.xx.x (xxxxxxxx)
Paso 3: Configurar Navidrome
Navidrome lee su configuración de un archivo TOML. Créalo en el directorio de datos:
sudo nano /var/lib/navidrome/navidrome.toml
Añade este contenido:
MusicFolder = "/srv/music"
DataFolder = "/var/lib/navidrome"
Address = "127.0.0.1"
Port = 4533
ScanSchedule = "@every 1h"
LogLevel = "info"
TranscodingCacheSize = "1GiB"
Address = "127.0.0.1": Navidrome solo escucha en local. Nginx será la única puerta de entrada, con HTTPS.ScanSchedule: cada cuánto se revisa la carpeta en busca de música nueva. Navidrome también la escanea al arrancar.TranscodingCacheSize: espacio máximo para guardar las canciones ya transcodificadas y no repetir el trabajo.
Ajusta el propietario del archivo:
sudo chown navidrome:navidrome /var/lib/navidrome/navidrome.toml
Paso 4: Crear el servicio systemd
Crea la unidad:
sudo nano /etc/systemd/system/navidrome.service
Añade este contenido:
[Unit]
Description=Navidrome Music Server
After=network-online.target
Wants=network-online.target
[Service]
User=navidrome
Group=navidrome
Type=simple
ExecStart=/opt/navidrome/navidrome --configfile /var/lib/navidrome/navidrome.toml
WorkingDirectory=/var/lib/navidrome
TimeoutStopSec=20
Restart=on-failure
# Endurecimiento: el proceso solo puede escribir en su directorio de datos
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/navidrome
[Install]
WantedBy=multi-user.target
Recarga systemd, habilita el servicio y arráncalo:
sudo systemctl daemon-reload
sudo systemctl enable --now navidrome
Comprueba que está activo y escuchando en el puerto 4533:
systemctl status navidrome --no-pager
sudo ss -tlnp | grep 4533
LISTEN 0 4096 127.0.0.1:4533 0.0.0.0:* users:(("navidrome",pid=...,fd=...))
Paso 5: Subir la música
Navidrome lee las etiquetas de los archivos (artista, álbum, número de pista, carátula incrustada), no los nombres de carpeta, así que lo más importante es que la música esté bien etiquetada. Aun así, una estructura Artista/Álbum/ facilita la gestión y permite que Navidrome encuentre portadas sueltas como cover.jpg o folder.jpg:
/srv/music/Pink Floyd/The Dark Side of the Moon (1973)/01 - Speak to Me.flac
/srv/music/Pink Floyd/The Dark Side of the Moon (1973)/cover.jpg
/srv/music/Radiohead/OK Computer (1997)/01 - Airbag.mp3
Desde tu equipo local, sube un álbum con rsync. Con -rt no se copian permisos ni grupos locales, y los archivos heredan el grupo navidrome:
rsync -rtvP "Pink Floyd" your_user@your_server_ip:/srv/music/
Comprueba que el servicio puede leer lo que has subido:
sudo -u navidrome ls -R /srv/music | head
Paso 6: Publicar Navidrome con Nginx y HTTPS
Instala Nginx y Certbot, y abre en UFW los puertos de SSH, HTTP y HTTPS:
sudo apt install -y nginx certbot python3-certbot-nginx
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
Crea el sitio:
sudo nano /etc/nginx/sites-available/navidrome
Añade esta configuración, sustituyendo music.your_domain:
server {
listen 80;
listen [::]:80;
server_name music.your_domain;
location / {
proxy_pass http://127.0.0.1:4533;
proxy_http_version 1.1;
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;
# Envía el audio sin almacenarlo en búfer
proxy_buffering off;
}
}
Activa el sitio, comprueba la sintaxis y recarga Nginx:
sudo ln -s /etc/nginx/sites-available/navidrome /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Solicita el certificado. Certbot añade el bloque HTTPS y la redirección desde HTTP:
sudo certbot --nginx -d music.your_domain
Paso 7: Crear la cuenta de administrador
La primera vez que abres Navidrome, te pide crear la cuenta de administrador. Hazlo en cuanto termine el paso anterior: visita https://music.your_domain, elige un nombre de usuario y una contraseña robusta, y entra.
El escaneo inicial se lanza al arrancar el servicio. Si subiste la música después, fuérzalo desde el icono de actividad de la barra superior (Escanear biblioteca) o espera al siguiente escaneo programado. Los álbumes aparecerán en la vista Álbumes y podrás reproducirlos en el navegador.
Para añadir más personas, entra en Configuración > Usuarios y crea una cuenta para cada una. Cada usuario tiene sus propias listas de reproducción, favoritos y estadísticas.
Paso 8: Conectar una aplicación cliente
Navidrome implementa la API de Subsonic, así que puedes usar cualquier aplicación compatible, por ejemplo:
| Plataforma | Aplicaciones |
|---|---|
| Android | Symfonium, Tempo, Ultrasonic |
| iOS | Amperfy, play:Sub, Substreamer |
| Escritorio | Feishin, Supersonic |
En la aplicación, añade un servidor Subsonic o Navidrome con:
- Dirección:
https://music.your_domain(sin puerto; Nginx atiende en el 443). - Usuario y contraseña: los de tu cuenta de Navidrome.
Para comprobar la API desde el servidor, haz un ping. Sustituye el usuario y la contraseña; como la contraseña viaja en la URL, haz esta prueba solo contra localhost:
curl -s "http://127.0.0.1:4533/rest/ping.view?u=your_admin&p=your_password&v=1.16.1&c=test&f=json"; echo
{"subsonic-response":{"status":"ok","version":"1.16.1","type":"navidrome","serverVersion":"0.xx.x (xxxxxxxx)","openSubsonic":true}}
En cada cliente puedes fijar un bitrate máximo para datos móviles. Navidrome usará FFmpeg para transcodificar a ese bitrate y guardará el resultado en la caché.
Actualizar Navidrome
Para actualizar, repite la descarga del paso 2 con la nueva versión, deteniendo antes el servicio:
sudo systemctl stop navidrome
sudo tar -xzf /tmp/navidrome.tar.gz -C /opt/navidrome
sudo chown -R navidrome:navidrome /opt/navidrome
sudo systemctl start navidrome
Antes de actualizar entre versiones con cambios grandes, copia /var/lib/navidrome/navidrome.db por si necesitas volver atrás.
Solución de problemas
La biblioteca aparece vacía. Revisa el registro del servicio en busca de errores de permisos durante el escaneo:
sudo journalctl -u navidrome --no-pager -n 50
Si ves permission denied, comprueba que los archivos pertenecen al grupo navidrome y que tienen permiso de lectura para el grupo:
ls -l "/srv/music/Pink Floyd"
Error 502 Bad Gateway. Navidrome no está en marcha o escucha en otra dirección. Comprueba systemctl status navidrome y que Address y Port del archivo TOML coinciden con el proxy_pass de Nginx.
Faltan álbumes o salen mezclados. Casi siempre son etiquetas incompletas o inconsistentes, por ejemplo el mismo álbum con dos valores distintos de Album Artist. Corrígelas con un editor de etiquetas como MusicBrainz Picard y espera al siguiente escaneo.
Conclusión
Tienes Navidrome funcionando en Ubuntu 24.04 como servicio con permisos mínimos, publicado con HTTPS y accesible desde aplicaciones compatibles con Subsonic. Como siguientes pasos, puedes programar una copia de seguridad de /var/lib/navidrome, que contiene usuarios, listas y estadísticas, etiquetar tu colección con MusicBrainz Picard para obtener mejores metadatos y crear cuentas para el resto de la familia.
