Media Guide

    Self-Hosted Navidrome

    Deploy your own music streaming server with Navidrome on RamNode VPS. Subsonic-compatible, lightweight, and stream your music library from anywhere.

    Ubuntu/Debian
    Navidrome + Nginx
    ⏱️ 15-20 minutes

    Prerequisites & VPS Selection

    Minimum

    • • 1GB RAM
    • • 1 vCPU
    • • Small library

    Recommended

    • • 2GB RAM
    • • 2 vCPU
    • • Large library

    Heavy Use

    • • 4GB+ RAM
    • • 4 vCPU
    • • Transcoding

    Additional Requirements

    • Ubuntu 22.04 or 24.04 LTS
    • Root or sudo access
    • Domain name (optional but recommended for SSL)
    • Your music library ready to upload
    2

    Initial Server Setup

    Update your system and install essential packages:

    Update System
    apt update && apt upgrade -y
    apt install -y wget ffmpeg

    💡 Note: FFmpeg enables Navidrome's transcoding capabilities, allowing you to stream in different formats and bitrates.

    3

    Create Dedicated User

    Running Navidrome under its own user improves security:

    Create Navidrome User
    useradd -r -s /bin/false navidrome
    4

    Install Navidrome

    Create directories and download Navidrome:

    Create Directories
    mkdir -p /opt/navidrome
    mkdir -p /var/lib/navidrome
    Download and Extract
    cd /opt/navidrome
    wget https://github.com/navidrome/navidrome/releases/download/v0.53.3/navidrome_0.53.3_linux_amd64.tar.gz
    tar -xvzf navidrome_0.53.3_linux_amd64.tar.gz
    rm navidrome_0.53.3_linux_amd64.tar.gz

    ⚠️ Note: Check the Navidrome releases page for the latest version.

    Set Ownership
    chown -R navidrome:navidrome /opt/navidrome
    chown -R navidrome:navidrome /var/lib/navidrome
    5

    Configure Navidrome

    Create the configuration file:

    /var/lib/navidrome/navidrome.toml
    MusicFolder = "/path/to/your/music"
    DataFolder = "/var/lib/navidrome"
    Address = "127.0.0.1"
    Port = 4533
    LogLevel = "info"
    ScanSchedule = "@every 1h"
    TranscodingCacheSize = "150MB"
    ImageCacheSize = "100MB"

    ⚠️ Important: Replace /path/to/your/music with your actual music directory path. Binding to 127.0.0.1 ensures Navidrome only accepts connections from localhost.

    Set Config Permissions
    chown navidrome:navidrome /var/lib/navidrome/navidrome.toml
    chmod 600 /var/lib/navidrome/navidrome.toml
    6

    Prepare Music Directory

    Create and configure your music folder:

    Create Music Directory
    mkdir -p /home/music
    chown navidrome:navidrome /home/music

    💡 Supported Formats: Upload your music library via SFTP, rsync, or your preferred method. Navidrome supports MP3, FLAC, OGG, OPUS, AAC, and most common formats.

    7

    Create Systemd Service

    Create a service file for automatic startup:

    /etc/systemd/system/navidrome.service
    [Unit]
    Description=Navidrome Music Server
    After=network.target
    
    [Service]
    User=navidrome
    Group=navidrome
    Type=simple
    ExecStart=/opt/navidrome/navidrome --configfile "/var/lib/navidrome/navidrome.toml"
    WorkingDirectory=/var/lib/navidrome
    Restart=on-failure
    RestartSec=5
    TimeoutStopSec=20
    LimitNOFILE=65536
    NoNewPrivileges=yes
    PrivateTmp=yes
    ProtectSystem=strict
    ProtectHome=read-only
    ReadWritePaths=/var/lib/navidrome
    
    [Install]
    WantedBy=multi-user.target
    Enable and Start Service
    systemctl daemon-reload
    systemctl enable navidrome
    systemctl start navidrome
    systemctl status navidrome
    8

    Configure Nginx Reverse Proxy

    Install Nginx and set up reverse proxy:

    Install Nginx and Certbot
    apt install -y nginx certbot python3-certbot-nginx
    /etc/nginx/sites-available/navidrome
    server {
        listen 80;
        server_name music.yourdomain.com;
    
        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 $scheme;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 600s;
            proxy_send_timeout 600s;
            client_max_body_size 50M;
        }
    }

    ⚠️ Important: Replace music.yourdomain.com with your actual domain!

    Enable Site and Get SSL
    ln -s /etc/nginx/sites-available/navidrome /etc/nginx/sites-enabled/
    nginx -t
    systemctl reload nginx
    certbot --nginx -d music.yourdomain.com
    9

    Firewall Configuration

    Configure UFW firewall:

    Configure Firewall
    ufw allow 80/tcp
    ufw allow 443/tcp
    ufw reload

    ⚠️ Warning: Ensure SSH (port 22) is allowed before enabling UFW!

    10

    Initial Setup & Access

    ✅ Visit https://music.yourdomain.com in your browser. The first user you create becomes the administrator.

    • • Create a strong admin password
    • • Configure additional users if needed
    • • Your music library will be scanned automatically
    11

    Subsonic Client Apps

    Navidrome is compatible with the Subsonic API. Popular client apps include:

    Mobile

    • Substreamer (iOS/Android)
    • play:Sub (iOS)
    • Ultrasonic (Android)
    • DSub (Android)

    Desktop

    • Sonixd (Windows/Mac/Linux)
    • Sublime Music (Linux)
    • Clementine (Cross-platform)

    💡 Connection Settings: Use your Navidrome URL (e.g., https://music.yourdomain.com), username, and password to connect any Subsonic-compatible client.

    12

    Performance Tuning

    Optimize Navidrome for better performance:

    Tuned Configuration
    # Add to navidrome.toml for large libraries
    CoverJpegQuality = 75
    UIWelcomeMessage = "Welcome to My Music Server"
    EnableStarRating = true
    EnableFavourites = true
    EnableTranscodingConfig = true
    DefaultTranscodingFormat = "opus"
    
    # For very large libraries (50k+ tracks)
    ScanSchedule = "@every 24h"
    TranscodingCacheSize = "500MB"
    ImageCacheSize = "200MB"
    Restart After Changes
    systemctl restart navidrome
    13

    Backup Strategy

    Create a backup script for your Navidrome data:

    /opt/navidrome/backup.sh
    #!/bin/bash
    BACKUP_DIR="/backups/navidrome"
    DATE=$(date +%Y%m%d_%H%M%S)
    mkdir -p $BACKUP_DIR
    
    # Stop service briefly for consistent backup
    systemctl stop navidrome
    
    # Backup database and config
    tar -czf $BACKUP_DIR/navidrome_$DATE.tar.gz \
        /var/lib/navidrome/navidrome.db \
        /var/lib/navidrome/navidrome.toml
    
    # Restart service
    systemctl start navidrome
    
    # Keep only last 7 backups
    ls -t $BACKUP_DIR/*.tar.gz | tail -n +8 | xargs -r rm
    
    echo "Backup completed: navidrome_$DATE.tar.gz"
    Setup Automated Backups
    chmod +x /opt/navidrome/backup.sh
    mkdir -p /backups/navidrome
    
    # Add to crontab (daily at 3 AM)
    (crontab -l 2>/dev/null; echo "0 3 * * * /opt/navidrome/backup.sh") | crontab -
    14

    Troubleshooting

    Service Won't Start

    Check Logs
    journalctl -u navidrome -f
    # Check config syntax
    /opt/navidrome/navidrome --configfile /var/lib/navidrome/navidrome.toml

    Music Not Appearing

    • • Verify MusicFolder path in config is correct
    • • Ensure navidrome user has read access to music files
    • • Trigger a manual scan from the web UI (Settings → Scan)
    Check Permissions
    ls -la /path/to/your/music
    chown -R navidrome:navidrome /path/to/your/music

    502 Bad Gateway

    Verify Service is Running
    systemctl status navidrome
    systemctl restart navidrome
    nginx -t && systemctl reload nginx

    Transcoding Issues

    Verify FFmpeg Installation
    ffmpeg -version
    which ffmpeg

    Navidrome Deployed Successfully!

    Your self-hosted music server is now ready. Stream your music library from anywhere with any Subsonic-compatible client.