Prerequisites & VPS Selection
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
Initial Server Setup
Update your system and install essential packages:
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.
Create Dedicated User
Running Navidrome under its own user improves security:
useradd -r -s /bin/false navidromeInstall Navidrome
Configure Navidrome
Create the configuration file:
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.
chown navidrome:navidrome /var/lib/navidrome/navidrome.toml
chmod 600 /var/lib/navidrome/navidrome.tomlPrepare Music Directory
Create and configure your music folder:
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.
Create Systemd Service
Create a service file for automatic startup:
[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.targetsystemctl daemon-reload
systemctl enable navidrome
systemctl start navidrome
systemctl status navidromeConfigure Nginx Reverse Proxy
Install Nginx and set up reverse proxy:
apt install -y nginx certbot python3-certbot-nginxserver {
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!
ln -s /etc/nginx/sites-available/navidrome /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
certbot --nginx -d music.yourdomain.comFirewall Configuration
Configure UFW firewall:
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload⚠️ Warning: Ensure SSH (port 22) is allowed before enabling UFW!
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
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.
Performance Tuning
Optimize Navidrome for better performance:
# 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"systemctl restart navidromeBackup Strategy
Create a backup script for your Navidrome data:
#!/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"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 -Troubleshooting
Service Won't Start
journalctl -u navidrome -f
# Check config syntax
/opt/navidrome/navidrome --configfile /var/lib/navidrome/navidrome.tomlMusic 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)
ls -la /path/to/your/music
chown -R navidrome:navidrome /path/to/your/music502 Bad Gateway
systemctl status navidrome
systemctl restart navidrome
nginx -t && systemctl reload nginxTranscoding Issues
ffmpeg -version
which ffmpegNavidrome Deployed Successfully!
Your self-hosted music server is now ready. Stream your music library from anywhere with any Subsonic-compatible client.
