Instalación de Navidrome: Servidor de Música en Linux

Navidrome es un servidor de streaming de música ligero y moderno que implementa la API Subsonic, lo que lo hace compatible con decenas de aplicaciones cliente para iOS, Android, escritorio y web. Con soporte para MP3, FLAC, OPUS y otros formatos, indexación rápida de bibliotecas y gestión de usuarios, Navidrome es la alternativa open-source perfecta a servicios como Spotify para tu colección personal. Esta guía cubre la instalación de Navidrome en Linux.

Requisitos Previos

  • Ubuntu 20.04+, Debian 11+, CentOS 8+ o Rocky Linux 8+
  • Mínimo 256 MB de RAM (Navidrome es muy eficiente)
  • FFmpeg instalado (para transcodificación)
  • Puerto 4533 disponible
  • Colección musical organizada en el servidor

Instalación de Navidrome

Instalación del Binario

# Crear usuario dedicado para Navidrome
sudo useradd -r -s /bin/false navidrome

# Crear directorios
sudo mkdir -p /opt/navidrome /var/lib/navidrome
sudo chown navidrome:navidrome /opt/navidrome /var/lib/navidrome

# Descargar la última versión de Navidrome
NAVIDROME_VERSION="0.53.3"
wget "https://github.com/navidrome/navidrome/releases/download/v${NAVIDROME_VERSION}/navidrome_${NAVIDROME_VERSION}_linux_amd64.tar.gz" -O /tmp/navidrome.tar.gz

# Extraer e instalar
sudo tar -xzf /tmp/navidrome.tar.gz -C /opt/navidrome/
sudo chown navidrome:navidrome /opt/navidrome/navidrome
sudo chmod +x /opt/navidrome/navidrome

# Verificar la instalación
/opt/navidrome/navidrome --version

Instalación de FFmpeg

# Ubuntu/Debian
sudo apt install -y ffmpeg

# CentOS/Rocky (requiere repositorio RPM Fusion)
sudo dnf install -y epel-release
sudo dnf install -y --enablerepo=epel https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
sudo dnf install -y ffmpeg

# Verificar la instalación de ffmpeg
ffmpeg -version | head -1

Configuración de Navidrome

# Crear archivo de configuración
sudo tee /opt/navidrome/navidrome.toml << 'EOF'
# Directorio con la colección musical
MusicFolder = "/mnt/musica"

# Directorio para datos de Navidrome (base de datos, caché, etc.)
DataFolder = "/var/lib/navidrome"

# Puerto de escucha
Port = 4533

# Dirección de escucha (127.0.0.1 si usas proxy inverso)
Address = "0.0.0.0"

# Nivel de logs
LogLevel = "info"

# Intervalo de escaneo de la biblioteca (en horas, 0 = solo al inicio)
ScanSchedule = "@every 1h"

# Máximo de álbumes en la lista de reproducción por defecto
PlaylistsPath = "/var/lib/navidrome/playlists"

# Habilitar las funciones de transcodificación
TranscodingCacheSize = "1GiB"
EOF

Crear el Servicio Systemd

sudo tee /etc/systemd/system/navidrome.service << 'EOF'
[Unit]
Description=Navidrome Music Server and Streamer
After=network.target

[Service]
User=navidrome
Group=navidrome
Type=simple
ExecStart=/opt/navidrome/navidrome --configfile /opt/navidrome/navidrome.toml
WorkingDirectory=/opt/navidrome
TimeoutStopSec=20
KillMode=process
Restart=on-failure
RestartSec=5

# Seguridad
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ReadWritePaths=/var/lib/navidrome

[Install]
WantedBy=multi-user.target
EOF

# Habilitar e iniciar
sudo systemctl daemon-reload
sudo systemctl enable --now navidrome

# Verificar el estado
sudo systemctl status navidrome

Instalación con Docker

# Crear estructura de directorios
mkdir -p ~/navidrome/{data,music}

# Ejecutar con Docker
docker run -d \
  --name navidrome \
  --restart unless-stopped \
  -e ND_LOGLEVEL=info \
  -e ND_SCANSCHEDULE="@every 1h" \
  -e ND_SESSIONTIMEOUT=24h \
  -v ~/navidrome/data:/data \
  -v ~/navidrome/music:/music:ro \
  -p 4533:4533 \
  -u $(id -u):$(id -g) \
  deluan/navidrome:latest

Con Docker Compose:

cat > ~/navidrome/docker-compose.yml << 'EOF'
version: '3'

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: "1000:1000"
    restart: unless-stopped
    environment:
      ND_SCANSCHEDULE: "@every 1h"
      ND_LOGLEVEL: info
      ND_SESSIONTIMEOUT: 24h
      ND_BASEURL: ""
    volumes:
      - ./data:/data
      - ./music:/music:ro
    ports:
      - 4533:4533
EOF

docker compose up -d

Configuración de la Biblioteca Musical

Navidrome escanea recursivamente el directorio musical configurado. Estructura recomendada:

# Organización recomendada (Artista/Album/Canción)
/mnt/musica/
├── Pink Floyd/
│   ├── The Dark Side of the Moon (1973)/
│   │   ├── 01 - Speak to Me.flac
│   │   ├── 02 - Breathe.flac
│   │   └── cover.jpg
│   └── The Wall (1979)/
│       ├── 01 - In the Flesh.flac
│       └── cover.jpg
├── Radiohead/
│   └── OK Computer (1997)/
│       ├── 01 - Airbag.mp3
│       └── folder.jpg
# Ajustar permisos de la biblioteca musical
sudo chown -R navidrome:navidrome /mnt/musica/
sudo chmod -R 755 /mnt/musica/

# Forzar un escaneo completo de la biblioteca
curl -u admin:contrasena "http://localhost:4533/rest/startScan.view?v=1.16.1&c=scan&f=json"

# Ver el estado del escaneo
curl -u admin:contrasena "http://localhost:4533/rest/getScanStatus.view?v=1.16.1&c=scan&f=json"

Transcodificación de Audio

Navidrome soporta transcodificación en tiempo real usando FFmpeg:

# Verificar que FFmpeg está disponible para Navidrome
which ffmpeg

# Configurar perfiles de transcodificación en navidrome.toml
# Los perfiles permiten convertir FLAC a MP3/AAC para clientes con ancho de banda limitado

Los perfiles de transcodificación se configuran automáticamente. En el panel web (Configuración > Perfiles de Transcodificación) puedes ajustar:

  • MP3: Máxima compatibilidad, bitrate configurable (128/192/320 kbps)
  • Opus: Mejor calidad a bajo bitrate para móviles
  • AAC: Para clientes iOS nativos
# Ejemplo de configuración de transcodificación en navidrome.toml
[Transcoding]
# Perfil para móviles con ancho de banda limitado
# Se activa desde la app cliente al configurar el servidor
MaxBitRate = 320

Gestión de Usuarios

El primer usuario creado al iniciar Navidrome es el administrador:

  1. Acceder a http://TU-SERVIDOR:4533
  2. Crear cuenta de administrador en el primer inicio
  3. Ir a Configuración > Usuarios para agregar más usuarios
# Navidrome gestiona usuarios a través del panel web
# No hay herramienta CLI de gestión de usuarios

# Para crear usuarios via API Subsonic (compatible)
curl "http://localhost:4533/rest/createUser.view?v=1.16.1&c=admin&f=json" \
  -u admin:contrasena \
  -d "username=usuario1&password=pass123&[email protected]"

# Listar usuarios
curl "http://localhost:4533/rest/getUsers.view?v=1.16.1&c=admin&f=json" \
  -u admin:contrasena | python3 -m json.tool

Aplicaciones Cliente

Navidrome es compatible con todos los clientes que soporten la API Subsonic:

Android:

  • DSub (gratuito)
  • Ultrasonic (open-source)
  • Symfonium (de pago, muy recomendado)
  • Substreamer

iOS:

  • play:Sub
  • Amperfy
  • Substreamer

Escritorio:

  • Sublime Music (Linux)
  • Sonixd (multiplataforma, Electron)

Configuración en el cliente:

  • Servidor: https://musica.tu-dominio.com
  • Puerto: 443 (con proxy SSL) o 4533
  • Usuario y contraseña de Navidrome
  • Versión API: 1.16.1
# Probar la API Subsonic directamente
curl -s "http://localhost:4533/rest/ping.view?v=1.16.1&c=test&f=json" \
  -u admin:contrasena | python3 -m json.tool

Proxy Inverso con Nginx

# Instalar Nginx y Certbot
sudo apt install -y nginx certbot python3-certbot-nginx

# Obtener certificado SSL
sudo certbot --nginx -d musica.tu-dominio.com

# Configuración de Nginx para Navidrome
sudo tee /etc/nginx/sites-available/navidrome << 'EOF'
server {
    listen 443 ssl http2;
    server_name musica.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/musica.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/musica.tu-dominio.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:4533;
        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 https;
        # Necesario para streaming de audio
        proxy_buffering off;
        proxy_read_timeout 600s;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/navidrome /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Solución de Problemas

La biblioteca no se escanea:

# Ver logs de Navidrome
sudo journalctl -u navidrome -f
# Docker:
docker logs navidrome -f

# Verificar permisos del directorio musical
ls -la /mnt/musica/
id navidrome  # Verificar UID/GID

# Iniciar escaneo manual desde la API
curl -u admin:pass "http://localhost:4533/rest/startScan.view?v=1.16.1&c=test&f=json"

Problemas de transcodificación:

# Verificar que FFmpeg está instalado y accesible por Navidrome
sudo -u navidrome which ffmpeg
sudo -u navidrome ffmpeg -version

# Ver logs de transcodificación
sudo journalctl -u navidrome | grep -i "transcode\|ffmpeg\|error"

La app cliente no conecta:

# Probar la conexión desde el servidor
curl -s "http://localhost:4533/rest/ping.view?v=1.16.1&c=test&u=admin&p=contrasena&f=json"

# Comprobar que el puerto está abierto
sudo ufw allow 4533/tcp  # Si no usas proxy inverso
# o verificar el proxy Nginx
sudo nginx -t

Conclusión

Navidrome es un servidor de música extraordinariamente eficiente que funciona incluso en servidores con recursos limitados. Su compatibilidad con la API Subsonic garantiza acceso desde cualquier cliente popular, y su bajo consumo de recursos lo hace ideal para coexistir con otros servicios en el mismo VPS o servidor baremetal.