Configure Navidrome Music Server #47

Open
opened 2025-09-14 08:14:13 +00:00 by tonym · 0 comments
Owner

Navidrome Music Server Configuration Guide

Overview

Navidrome is a lightweight, web-based music server that implements the Subsonic API. It allows you to organize, browse, and stream your personal music collection from any device with a web browser or Subsonic-compatible app.


Container Installation

Docker Run Command

docker run -d \
  --name=navidrome \
  --restart=unless-stopped \
  -e PUID=99 \
  -e PGID=100 \
  -e TZ=America/Chicago \
  -p 4533:4533 \
  -v /mnt/user/appdata/navidrome:/config \
  -v /mnt/user/media/music:/music:ro \
  deluan/navidrome:latest

Docker Compose

version: "3.8"
services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    restart: unless-stopped
    environment:
      - PUID=99
      - PGID=100
      - TZ=America/Chicago
      - ND_MUSICFOLDER=/music
      - ND_DATAFOLDER=/config
      - ND_LOGLEVEL=info
      - ND_SCANSCHEDULE=1h
      - ND_SESSIONTIMEOUT=24h
      - ND_BASEURL=/navidrome
    ports:
      - "4533:4533"
    volumes:
      - /mnt/user/appdata/navidrome:/config
      - /mnt/user/media/music:/music:ro
    networks:
      - media

Container Configuration

Port Configuration

  • 4533: Web interface and API (HTTP)

Volume Mounts

  • /mnt/user/appdata/navidrome:/config: Configuration, database, and cache
  • /mnt/user/media/music:/music:ro: Music library (read-only)

Environment Variables

  • PUID=99: User ID (nobody)
  • PGID=100: Group ID (users)
  • TZ: Timezone setting
  • ND_MUSICFOLDER: Path to music files
  • ND_DATAFOLDER: Path to config and database
  • ND_LOGLEVEL: Logging level (debug, info, warn, error)
  • ND_SCANSCHEDULE: Library scan interval
  • ND_SESSIONTIMEOUT: Session timeout duration

Initial Configuration

Web Interface Setup

  1. Access Web Interface: http://your-server-ip:4533
  2. First User Setup: Create admin user
  3. Initial Scan: Automatic scan will begin

Configuration File

Create /mnt/user/appdata/navidrome/navidrome.toml:

# Navidrome Configuration
MusicFolder = "/music"
DataFolder = "/config"
ScanSchedule = "1h"
LogLevel = "info"
Port = 4533
BaseURL = ""

# Database
DbPath = "/config/navidrome.db"

# Authentication
SessionTimeout = "24h"
JWTSecret = "your-secret-key-here"

# Features
EnableTranscodingConfig = true
EnableDownloads = true
EnableSharing = true
EnableFavourites = true
EnableStarRating = true
DefaultTheme = "Dark"

# Advanced
ScanInterval = "1m"
SearchFullString = false
IgnoredArticles = "The El La Los Las Le Les Os As O A"
IndexGroups = "A B C D E F G H I J K L M N O P Q R S T U V W X-Z(XYZ) [Unknown]([)"  

# Transcoding
[Transcoding]
mp3 = "ffmpeg -i %s -map 0:0 -b:a %bk -v quiet -f mp3 -"
ogg = "ffmpeg -i %s -map 0:0 -c:a libvorbis -b:a %bk -v quiet -f ogg -"
opus = "ffmpeg -i %s -map 0:0 -c:a libopus -b:a %bk -v quiet -f opus -"

# LastFM Integration
[LastFM]
Enabled = true
ApiKey = "your-lastfm-api-key"
Secret = "your-lastfm-secret"

# Spotify Integration
[Spotify]
ID = "your-spotify-client-id"
Secret = "your-spotify-client-secret"

Service Configuration

Music Library Structure

# Recommended folder structure:
/mnt/user/media/music/
├── Artist Name/
│   ├── Album Name (Year)/
│   │   ├── 01 - Track Name.flac
│   │   ├── 02 - Track Name.flac
│   │   ├── cover.jpg
│   │   └── folder.jpg
│   └── Album Name 2 (Year)/
│       ├── 01 - Track Name.mp3
│       └── cover.jpg
├── Various Artists/
│   └── Compilation Album (Year)/
└── Soundtracks/
    └── Movie Soundtrack (Year)/

User Management

Create Additional Users

  1. Web Interface → Users → Add User
  2. Set Username/Password
  3. Configure Permissions:
    • Admin: Full access
    • User: Listen only
    • Guest: Limited access

User Configuration

# Via Web Interface:
# - Username and Email
# - Password
# - Admin privileges
# - LastFM integration
# - Transcoding quality
# - Default theme

Transcoding Configuration

Quality Settings

# High quality (320kbps MP3)
[Transcoding.high]
mp3 = "ffmpeg -i %s -map 0:0 -b:a 320k -v quiet -f mp3 -"

# Medium quality (128kbps MP3)
[Transcoding.medium]
mp3 = "ffmpeg -i %s -map 0:0 -b:a 128k -v quiet -f mp3 -"

# Low quality (64kbps MP3)
[Transcoding.low]
mp3 = "ffmpeg -i %s -map 0:0 -b:a 64k -v quiet -f mp3 -"

Format Support

  • Native: MP3, FLAC, OGG, M4A, WAV
  • Transcoded: Any format supported by FFmpeg
  • Playlists: M3U, PLS

Integration Points

With Lidarr

Lidarr Connection Setup

  1. Lidarr Settings → Connect → Add Connection
  2. Type: Subsonic
  3. Host: http://navidrome:4533
  4. Username: navidrome-user
  5. Password: user-password
  6. Test Connection

With Mobile Apps

  • Android:
    • DSub
    • Ultrasonic
    • Subsonic
    • Power Ampache
  • iOS:
    • play:Sub
    • Amperfy
    • Subsonic
  • Desktop:
    • Sublime Music
    • Sonixd
    • Supersonic

App Configuration

# Connection settings for apps:
Server: http://your-server-ip:4533
Username: your-username
Password: your-password
Subsonic Version: Latest (6.1.6)

With Last.FM

Last.FM Integration Setup

  1. Get API Key from Last.FM
  2. Add to Configuration:
    [LastFM]
    Enabled = true
    ApiKey = "your-api-key"
    Secret = "your-secret"
    
  3. User Scrobbling Setup:
    • Web interface → Profile → Last.FM
    • Link Last.FM account

With Reverse Proxy

Nginx Configuration

server {
    listen 80;
    server_name music.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name music.yourdomain.com;
    
    ssl_certificate /etc/ssl/certs/music.crt;
    ssl_certificate_key /etc/ssl/private/music.key;
    
    location / {
        proxy_pass http://192.168.0.5: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 $scheme;
        
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Monitoring & Notifications

Health Monitoring

# Check Navidrome health
curl -I http://localhost:4533

# Check API status
curl -u "username:password" "http://localhost:4533/rest/ping.view?v=1.16.1&c=test"

# Monitor active sessions
curl -u "username:password" "http://localhost:4533/rest/getUsers.view?v=1.16.1&c=test" | jq

Library Monitoring

# Check scan status
curl -u "username:password" "http://localhost:4533/rest/getScanStatus.view?v=1.16.1&c=test"

# Trigger manual scan
curl -X POST -u "username:password" "http://localhost:4533/rest/startScan.view?v=1.16.1&c=test"

# Get library statistics
curl -u "username:password" "http://localhost:4533/rest/getGenres.view?v=1.16.1&c=test" | jq

Performance Monitoring

#!/bin/bash
# Monitor Navidrome performance
echo "=== Database Size ==="
du -h /mnt/user/appdata/navidrome/navidrome.db

echo "=== Active Users ==="
curl -s -u "admin:password" "http://localhost:4533/rest/getUsers.view?v=1.16.1&c=monitor" | \
  grep -o "lastLoginDate=\"[^\"]*\"" | sort

echo "=== Recent Activity ==="
tail -10 /mnt/user/appdata/navidrome/navidrome.log

Backup Configuration

Database Backup

#!/bin/bash
# Backup Navidrome database
DATE=$(date +%Y%m%d)
BACKUP_DIR="/mnt/user/backups/navidrome"

# Stop container for consistent backup
docker stop navidrome

# Backup database
cp /mnt/user/appdata/navidrome/navidrome.db $BACKUP_DIR/navidrome_$DATE.db

# Backup configuration
cp /mnt/user/appdata/navidrome/navidrome.toml $BACKUP_DIR/navidrome_config_$DATE.toml

# Restart container
docker start navidrome

# Compress backups
tar -czf $BACKUP_DIR/navidrome_backup_$DATE.tar.gz -C $BACKUP_DIR \
  navidrome_$DATE.db navidrome_config_$DATE.toml

# Cleanup individual files
rm $BACKUP_DIR/navidrome_$DATE.db $BACKUP_DIR/navidrome_config_$DATE.toml

# Retain last 30 days
find $BACKUP_DIR -name "navidrome_backup_*.tar.gz" -mtime +30 -delete

Playlist Backup

#!/bin/bash
# Export playlists
API_URL="http://localhost:4533/rest"
USER="admin"
PASS="password"

# Get all playlists
curl -u "$USER:$PASS" "$API_URL/getPlaylists.view?v=1.16.1&c=backup" | \
  jq -r ".playlists.playlist[] | \"\(.id),\(.name)\"" | \
  while IFS=, read -r id name; do
    echo "Backing up playlist: $name"
    curl -u "$USER:$PASS" "$API_URL/getPlaylist.view?v=1.16.1&c=backup&id=$id" > \
      "/mnt/user/backups/navidrome/playlist_${name// /_}.json"
  done

Testing Procedures

Functionality Tests

Basic API Tests

# Test authentication
curl -u "username:password" "http://localhost:4533/rest/ping.view?v=1.16.1&c=test"

# Test library access
curl -u "username:password" "http://localhost:4533/rest/getArtists.view?v=1.16.1&c=test"

# Test search functionality
curl -u "username:password" "http://localhost:4533/rest/search3.view?v=1.16.1&c=test&query=test"

Streaming Tests

# Test audio streaming
curl -u "username:password" -o test.mp3 \
  "http://localhost:4533/rest/stream.view?v=1.16.1&c=test&id=SONG_ID"

# Test transcoding
curl -u "username:password" -o test_transcoded.mp3 \
  "http://localhost:4533/rest/stream.view?v=1.16.1&c=test&id=SONG_ID&format=mp3&maxBitRate=128"

Mobile App Tests

  1. Connection Test: Verify app can connect
  2. Library Browsing: Test artist/album navigation
  3. Search: Test search functionality
  4. Playback: Test streaming and offline sync
  5. Playlists: Test playlist creation/editing

Performance Tests

# Load test with multiple concurrent streams
for i in {1..5}; do
  curl -u "username:password" -o test_$i.mp3 \
    "http://localhost:4533/rest/stream.view?v=1.16.1&c=test&id=SONG_ID" &
done
wait

# Monitor resource usage
docker stats navidrome --no-stream

Troubleshooting

Common Issues

  1. Library Not Scanning:

    # Check permissions
    docker exec navidrome ls -la /music
    
    # Force scan
    curl -X POST -u "username:password" \
      "http://localhost:4533/rest/startScan.view?v=1.16.1&c=troubleshoot"
    
  2. Transcoding Not Working:

    # Check FFmpeg availability
    docker exec navidrome ffmpeg -version
    
    # Test transcoding manually
    docker exec navidrome ffmpeg -i /music/test.flac -b:a 128k /tmp/test.mp3
    
  3. Mobile App Connection Issues:

    # Check API version compatibility
    curl -I http://localhost:4533/rest/ping.view?v=1.16.1&c=test
    
    # Verify Subsonic API response
    curl -u "username:password" "http://localhost:4533/rest/ping.view?v=1.16.1&c=test"
    

Log Analysis

# View Navidrome logs
docker logs navidrome

# Monitor real-time logs
docker logs -f navidrome

# Check scan logs
grep "scan" /mnt/user/appdata/navidrome/navidrome.log

# Check API access logs
grep "rest/" /mnt/user/appdata/navidrome/navidrome.log

Database Issues

# Check database integrity
sqlite3 /mnt/user/appdata/navidrome/navidrome.db "PRAGMA integrity_check;"

# Vacuum database
sqlite3 /mnt/user/appdata/navidrome/navidrome.db "VACUUM;"

# Check database size
du -h /mnt/user/appdata/navidrome/navidrome.db

Maintenance

Regular Updates

# Update Navidrome container
docker pull deluan/navidrome:latest
docker stop navidrome
docker rm navidrome
docker-compose up -d

Database Maintenance

# Optimize database weekly
#!/bin/bash
echo "Optimizing Navidrome database..."
docker stop navidrome
sqlite3 /mnt/user/appdata/navidrome/navidrome.db "VACUUM;"
sqlite3 /mnt/user/appdata/navidrome/navidrome.db "REINDEX;"
docker start navidrome
echo "Database optimization complete"

Cache Management

# Clear artwork cache
rm -rf /mnt/user/appdata/navidrome/cache/

# Clear transcoding cache
rm -rf /mnt/user/appdata/navidrome/transcoding_cache/

# Trigger rescan after cache clear
curl -X POST -u "username:password" \
  "http://localhost:4533/rest/startScan.view?v=1.16.1&c=maintenance"

Security Considerations

User Authentication

# Strong password requirements
[Authentication]
SessionTimeout = "24h"
JWTSecret = "complex-secret-key-change-this"
PasswordComplexity = true

Network Security

# Bind to localhost only
# Use reverse proxy for external access
Address = "127.0.0.1"
Port = 4533

# Enable HTTPS via reverse proxy
# Configure firewall rules

API Security

# Monitor API usage
grep "rest/" /mnt/user/appdata/navidrome/navidrome.log | \
  awk '{print $1, $4}' | sort | uniq -c

# Rate limiting via reverse proxy
# Implement fail2ban for brute force protection

Advanced Configuration

Custom Themes

/* Custom CSS for dark theme */
:root {
  --primary-color: #1976d2;
  --accent-color: #ff4081;
  --background-color: #121212;
  --surface-color: #1e1e1e;
}

Plugin Development

// Example plugin structure
package main

import "github.com/navidrome/navidrome/server"

func init() {
    server.RegisterPlugin("custom", NewCustomPlugin)
}

Smart Playlists

-- Example smart playlist queries
-- Recently added tracks
SELECT * FROM media_file 
WHERE created_at > datetime('now', '-7 days') 
ORDER BY created_at DESC;

-- Top rated tracks
SELECT * FROM media_file 
WHERE rating >= 4 
ORDER BY rating DESC, play_count DESC;

This guide provides comprehensive coverage of Navidrome music server configuration for personal music streaming and management.

# Navidrome Music Server Configuration Guide ## Overview Navidrome is a lightweight, web-based music server that implements the Subsonic API. It allows you to organize, browse, and stream your personal music collection from any device with a web browser or Subsonic-compatible app. --- ## Container Installation ### Docker Run Command ```bash docker run -d \ --name=navidrome \ --restart=unless-stopped \ -e PUID=99 \ -e PGID=100 \ -e TZ=America/Chicago \ -p 4533:4533 \ -v /mnt/user/appdata/navidrome:/config \ -v /mnt/user/media/music:/music:ro \ deluan/navidrome:latest ``` ### Docker Compose ```yaml version: "3.8" services: navidrome: image: deluan/navidrome:latest container_name: navidrome restart: unless-stopped environment: - PUID=99 - PGID=100 - TZ=America/Chicago - ND_MUSICFOLDER=/music - ND_DATAFOLDER=/config - ND_LOGLEVEL=info - ND_SCANSCHEDULE=1h - ND_SESSIONTIMEOUT=24h - ND_BASEURL=/navidrome ports: - "4533:4533" volumes: - /mnt/user/appdata/navidrome:/config - /mnt/user/media/music:/music:ro networks: - media ``` --- ## Container Configuration ### Port Configuration - **4533**: Web interface and API (HTTP) ### Volume Mounts - `/mnt/user/appdata/navidrome:/config`: Configuration, database, and cache - `/mnt/user/media/music:/music:ro`: Music library (read-only) ### Environment Variables - `PUID=99`: User ID (nobody) - `PGID=100`: Group ID (users) - `TZ`: Timezone setting - `ND_MUSICFOLDER`: Path to music files - `ND_DATAFOLDER`: Path to config and database - `ND_LOGLEVEL`: Logging level (debug, info, warn, error) - `ND_SCANSCHEDULE`: Library scan interval - `ND_SESSIONTIMEOUT`: Session timeout duration --- ## Initial Configuration ### Web Interface Setup 1. **Access Web Interface**: `http://your-server-ip:4533` 2. **First User Setup**: Create admin user - Username: admin - Password: secure-password - Email: admin@yourdomain.com 3. **Initial Scan**: Automatic scan will begin ### Configuration File Create `/mnt/user/appdata/navidrome/navidrome.toml`: ```toml # Navidrome Configuration MusicFolder = "/music" DataFolder = "/config" ScanSchedule = "1h" LogLevel = "info" Port = 4533 BaseURL = "" # Database DbPath = "/config/navidrome.db" # Authentication SessionTimeout = "24h" JWTSecret = "your-secret-key-here" # Features EnableTranscodingConfig = true EnableDownloads = true EnableSharing = true EnableFavourites = true EnableStarRating = true DefaultTheme = "Dark" # Advanced ScanInterval = "1m" SearchFullString = false IgnoredArticles = "The El La Los Las Le Les Os As O A" IndexGroups = "A B C D E F G H I J K L M N O P Q R S T U V W X-Z(XYZ) [Unknown]([)" # Transcoding [Transcoding] mp3 = "ffmpeg -i %s -map 0:0 -b:a %bk -v quiet -f mp3 -" ogg = "ffmpeg -i %s -map 0:0 -c:a libvorbis -b:a %bk -v quiet -f ogg -" opus = "ffmpeg -i %s -map 0:0 -c:a libopus -b:a %bk -v quiet -f opus -" # LastFM Integration [LastFM] Enabled = true ApiKey = "your-lastfm-api-key" Secret = "your-lastfm-secret" # Spotify Integration [Spotify] ID = "your-spotify-client-id" Secret = "your-spotify-client-secret" ``` --- ## Service Configuration ### Music Library Structure ```bash # Recommended folder structure: /mnt/user/media/music/ ├── Artist Name/ │ ├── Album Name (Year)/ │ │ ├── 01 - Track Name.flac │ │ ├── 02 - Track Name.flac │ │ ├── cover.jpg │ │ └── folder.jpg │ └── Album Name 2 (Year)/ │ ├── 01 - Track Name.mp3 │ └── cover.jpg ├── Various Artists/ │ └── Compilation Album (Year)/ └── Soundtracks/ └── Movie Soundtrack (Year)/ ``` ### User Management #### Create Additional Users 1. **Web Interface → Users → Add User** 2. **Set Username/Password** 3. **Configure Permissions**: - Admin: Full access - User: Listen only - Guest: Limited access #### User Configuration ```bash # Via Web Interface: # - Username and Email # - Password # - Admin privileges # - LastFM integration # - Transcoding quality # - Default theme ``` ### Transcoding Configuration #### Quality Settings ```toml # High quality (320kbps MP3) [Transcoding.high] mp3 = "ffmpeg -i %s -map 0:0 -b:a 320k -v quiet -f mp3 -" # Medium quality (128kbps MP3) [Transcoding.medium] mp3 = "ffmpeg -i %s -map 0:0 -b:a 128k -v quiet -f mp3 -" # Low quality (64kbps MP3) [Transcoding.low] mp3 = "ffmpeg -i %s -map 0:0 -b:a 64k -v quiet -f mp3 -" ``` #### Format Support - **Native**: MP3, FLAC, OGG, M4A, WAV - **Transcoded**: Any format supported by FFmpeg - **Playlists**: M3U, PLS --- ## Integration Points ### With Lidarr #### Lidarr Connection Setup 1. **Lidarr Settings → Connect → Add Connection** 2. **Type**: Subsonic 3. **Host**: http://navidrome:4533 4. **Username**: navidrome-user 5. **Password**: user-password 6. **Test Connection** ### With Mobile Apps #### Recommended Apps - **Android**: - DSub - Ultrasonic - Subsonic - Power Ampache - **iOS**: - play:Sub - Amperfy - Subsonic - **Desktop**: - Sublime Music - Sonixd - Supersonic #### App Configuration ```bash # Connection settings for apps: Server: http://your-server-ip:4533 Username: your-username Password: your-password Subsonic Version: Latest (6.1.6) ``` ### With Last.FM #### Last.FM Integration Setup 1. **Get API Key from Last.FM** 2. **Add to Configuration**: ```toml [LastFM] Enabled = true ApiKey = "your-api-key" Secret = "your-secret" ``` 3. **User Scrobbling Setup**: - Web interface → Profile → Last.FM - Link Last.FM account ### With Reverse Proxy #### Nginx Configuration ```nginx server { listen 80; server_name music.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name music.yourdomain.com; ssl_certificate /etc/ssl/certs/music.crt; ssl_certificate_key /etc/ssl/private/music.key; location / { proxy_pass http://192.168.0.5: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 $scheme; # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` --- ## Monitoring & Notifications ### Health Monitoring ```bash # Check Navidrome health curl -I http://localhost:4533 # Check API status curl -u "username:password" "http://localhost:4533/rest/ping.view?v=1.16.1&c=test" # Monitor active sessions curl -u "username:password" "http://localhost:4533/rest/getUsers.view?v=1.16.1&c=test" | jq ``` ### Library Monitoring ```bash # Check scan status curl -u "username:password" "http://localhost:4533/rest/getScanStatus.view?v=1.16.1&c=test" # Trigger manual scan curl -X POST -u "username:password" "http://localhost:4533/rest/startScan.view?v=1.16.1&c=test" # Get library statistics curl -u "username:password" "http://localhost:4533/rest/getGenres.view?v=1.16.1&c=test" | jq ``` ### Performance Monitoring ```bash #!/bin/bash # Monitor Navidrome performance echo "=== Database Size ===" du -h /mnt/user/appdata/navidrome/navidrome.db echo "=== Active Users ===" curl -s -u "admin:password" "http://localhost:4533/rest/getUsers.view?v=1.16.1&c=monitor" | \ grep -o "lastLoginDate=\"[^\"]*\"" | sort echo "=== Recent Activity ===" tail -10 /mnt/user/appdata/navidrome/navidrome.log ``` --- ## Backup Configuration ### Database Backup ```bash #!/bin/bash # Backup Navidrome database DATE=$(date +%Y%m%d) BACKUP_DIR="/mnt/user/backups/navidrome" # Stop container for consistent backup docker stop navidrome # Backup database cp /mnt/user/appdata/navidrome/navidrome.db $BACKUP_DIR/navidrome_$DATE.db # Backup configuration cp /mnt/user/appdata/navidrome/navidrome.toml $BACKUP_DIR/navidrome_config_$DATE.toml # Restart container docker start navidrome # Compress backups tar -czf $BACKUP_DIR/navidrome_backup_$DATE.tar.gz -C $BACKUP_DIR \ navidrome_$DATE.db navidrome_config_$DATE.toml # Cleanup individual files rm $BACKUP_DIR/navidrome_$DATE.db $BACKUP_DIR/navidrome_config_$DATE.toml # Retain last 30 days find $BACKUP_DIR -name "navidrome_backup_*.tar.gz" -mtime +30 -delete ``` ### Playlist Backup ```bash #!/bin/bash # Export playlists API_URL="http://localhost:4533/rest" USER="admin" PASS="password" # Get all playlists curl -u "$USER:$PASS" "$API_URL/getPlaylists.view?v=1.16.1&c=backup" | \ jq -r ".playlists.playlist[] | \"\(.id),\(.name)\"" | \ while IFS=, read -r id name; do echo "Backing up playlist: $name" curl -u "$USER:$PASS" "$API_URL/getPlaylist.view?v=1.16.1&c=backup&id=$id" > \ "/mnt/user/backups/navidrome/playlist_${name// /_}.json" done ``` --- ## Testing Procedures ### Functionality Tests #### Basic API Tests ```bash # Test authentication curl -u "username:password" "http://localhost:4533/rest/ping.view?v=1.16.1&c=test" # Test library access curl -u "username:password" "http://localhost:4533/rest/getArtists.view?v=1.16.1&c=test" # Test search functionality curl -u "username:password" "http://localhost:4533/rest/search3.view?v=1.16.1&c=test&query=test" ``` #### Streaming Tests ```bash # Test audio streaming curl -u "username:password" -o test.mp3 \ "http://localhost:4533/rest/stream.view?v=1.16.1&c=test&id=SONG_ID" # Test transcoding curl -u "username:password" -o test_transcoded.mp3 \ "http://localhost:4533/rest/stream.view?v=1.16.1&c=test&id=SONG_ID&format=mp3&maxBitRate=128" ``` #### Mobile App Tests 1. **Connection Test**: Verify app can connect 2. **Library Browsing**: Test artist/album navigation 3. **Search**: Test search functionality 4. **Playback**: Test streaming and offline sync 5. **Playlists**: Test playlist creation/editing ### Performance Tests ```bash # Load test with multiple concurrent streams for i in {1..5}; do curl -u "username:password" -o test_$i.mp3 \ "http://localhost:4533/rest/stream.view?v=1.16.1&c=test&id=SONG_ID" & done wait # Monitor resource usage docker stats navidrome --no-stream ``` --- ## Troubleshooting ### Common Issues 1. **Library Not Scanning**: ```bash # Check permissions docker exec navidrome ls -la /music # Force scan curl -X POST -u "username:password" \ "http://localhost:4533/rest/startScan.view?v=1.16.1&c=troubleshoot" ``` 2. **Transcoding Not Working**: ```bash # Check FFmpeg availability docker exec navidrome ffmpeg -version # Test transcoding manually docker exec navidrome ffmpeg -i /music/test.flac -b:a 128k /tmp/test.mp3 ``` 3. **Mobile App Connection Issues**: ```bash # Check API version compatibility curl -I http://localhost:4533/rest/ping.view?v=1.16.1&c=test # Verify Subsonic API response curl -u "username:password" "http://localhost:4533/rest/ping.view?v=1.16.1&c=test" ``` ### Log Analysis ```bash # View Navidrome logs docker logs navidrome # Monitor real-time logs docker logs -f navidrome # Check scan logs grep "scan" /mnt/user/appdata/navidrome/navidrome.log # Check API access logs grep "rest/" /mnt/user/appdata/navidrome/navidrome.log ``` ### Database Issues ```bash # Check database integrity sqlite3 /mnt/user/appdata/navidrome/navidrome.db "PRAGMA integrity_check;" # Vacuum database sqlite3 /mnt/user/appdata/navidrome/navidrome.db "VACUUM;" # Check database size du -h /mnt/user/appdata/navidrome/navidrome.db ``` --- ## Maintenance ### Regular Updates ```bash # Update Navidrome container docker pull deluan/navidrome:latest docker stop navidrome docker rm navidrome docker-compose up -d ``` ### Database Maintenance ```bash # Optimize database weekly #!/bin/bash echo "Optimizing Navidrome database..." docker stop navidrome sqlite3 /mnt/user/appdata/navidrome/navidrome.db "VACUUM;" sqlite3 /mnt/user/appdata/navidrome/navidrome.db "REINDEX;" docker start navidrome echo "Database optimization complete" ``` ### Cache Management ```bash # Clear artwork cache rm -rf /mnt/user/appdata/navidrome/cache/ # Clear transcoding cache rm -rf /mnt/user/appdata/navidrome/transcoding_cache/ # Trigger rescan after cache clear curl -X POST -u "username:password" \ "http://localhost:4533/rest/startScan.view?v=1.16.1&c=maintenance" ``` --- ## Security Considerations ### User Authentication ```toml # Strong password requirements [Authentication] SessionTimeout = "24h" JWTSecret = "complex-secret-key-change-this" PasswordComplexity = true ``` ### Network Security ```bash # Bind to localhost only # Use reverse proxy for external access Address = "127.0.0.1" Port = 4533 # Enable HTTPS via reverse proxy # Configure firewall rules ``` ### API Security ```bash # Monitor API usage grep "rest/" /mnt/user/appdata/navidrome/navidrome.log | \ awk '{print $1, $4}' | sort | uniq -c # Rate limiting via reverse proxy # Implement fail2ban for brute force protection ``` --- ## Advanced Configuration ### Custom Themes ```css /* Custom CSS for dark theme */ :root { --primary-color: #1976d2; --accent-color: #ff4081; --background-color: #121212; --surface-color: #1e1e1e; } ``` ### Plugin Development ```go // Example plugin structure package main import "github.com/navidrome/navidrome/server" func init() { server.RegisterPlugin("custom", NewCustomPlugin) } ``` ### Smart Playlists ```sql -- Example smart playlist queries -- Recently added tracks SELECT * FROM media_file WHERE created_at > datetime('now', '-7 days') ORDER BY created_at DESC; -- Top rated tracks SELECT * FROM media_file WHERE rating >= 4 ORDER BY rating DESC, play_count DESC; ``` This guide provides comprehensive coverage of Navidrome music server configuration for personal music streaming and management.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tonym/NastyNAS#47
No description provided.