
This article provides a guide demonstrating how to deploy Navidrome on Ubuntu VPS.
What is Navidrome?
Navidrome is a free, open-source, self-hosted music streaming server that lets you create your own personal music streaming service using your existing music collection. Instead of uploading your music to a commercial service like Spotify or Apple Music, you store your audio files on your own server (or NAS), and Navidrome streams them securely to your web browser, smartphone, tablet, or desktop using its built-in web player or compatible third-party apps.
Think of it as “your own private Spotify”—except you own the music, control the server, and aren’t dependent on a subscription or internet service to access your library (other than connecting to your own server).
Key Features
- Self-hosted – Your music stays on your own hardware or VPS.
- Modern web player – Listen directly from any modern web browser.
- Mobile app support – Works with a large ecosystem of Subsonic/OpenSubsonic-compatible apps for iOS and Android.
- Multi-user support – Each user gets their own playlists, favorites, ratings, and listening history.
- Large library support – Designed to efficiently manage libraries containing hundreds of thousands of songs.
- Automatic library scanning – Detects new music and metadata changes automatically.
- On-the-fly transcoding – Converts audio to lower bitrates when needed for slower connections or mobile devices.
- Playlist support – Create playlists or import existing
.m3uplaylists. - Sharing – Share albums, playlists, or tracks with others via public links.
- External authentication – Can integrate with external identity providers if desired.
- Lightweight – Written in Go, requiring minimal system resources.
Supported Audio Formats
Navidrome can index and stream virtually any format supported by FFmpeg, including:
- MP3
- FLAC
- AAC
- OGG Vorbis
- Opus
- ALAC
- WAV
- AIFF
- WMA (with FFmpeg support)
- Many others
Compatible Clients
Besides the built-in web interface, you can use many third-party clients that support the Subsonic/OpenSubsonic API, including:
- Symfonium (Android)
- Tempo
- Amperfy (iOS)
- Substreamer
- DSub
- Sonixd
- Supersonic
- Feishin
- Many desktop and TV clients
Typical Architecture
Internet
│
HTTPS (443)
│
Nginx/Caddy
│
Navidrome (4533)
│
Music Library (/srv/music)
│
MP3 • FLAC • AAC • ALAC • OGG System Requirements
Navidrome is remarkably lightweight:
| Component | Recommended |
|---|---|
| CPU | 1–2 vCPUs |
| RAM | 512 MB minimum (1–2 GB recommended) |
| Storage | SSD plus space for your music |
| OS | Linux, Windows, macOS |
| Docker | Fully supported |
| Raspberry Pi | Supported |
It can even run comfortably on a Raspberry Pi Zero or other low-power hardware.
Advantages
- No monthly subscription
- Full ownership of your music
- No advertisements
- Excellent FLAC and lossless audio support
- Fast and responsive interface
- Very low resource usage
- Open source (GPL-3.0)
- Large ecosystem of compatible client apps
Limitations
- It does not provide licensed commercial music—you must supply your own legally obtained music library.
- Music discovery and recommendation features are much more limited than services like Spotify or Apple Music.
- Good organization depends on accurate metadata (artist, album, track tags) in your music files.
Navidrome vs. Jellyfin vs. Plex
| Feature | Navidrome | Jellyfin | Plex |
|---|---|---|---|
| Purpose | Music only | General media server | General media server |
| Resource usage | Very low | Moderate | Moderate |
| Music experience | Excellent | Good | Very good (Plex Pass adds features) |
| Video support | No | Yes | Yes |
| Photos | No | Yes | Yes |
| Multi-user | Yes | Yes | Yes |
| Mobile clients | Extensive (OpenSubsonic ecosystem) | Jellyfin apps | Plex apps |
| Open source | Yes | Yes | No (server is proprietary) |
Who Should Use Navidrome?
Navidrome is an excellent choice if you:
- Have a personal collection of MP3, FLAC, or other audio files.
- Want to stream your music anywhere without relying on a commercial streaming service.
- Prefer open-source software and control over your own data.
- Need a lightweight music server for a VPS, NAS, Raspberry Pi, or home server.
- Want to share your music library with family or friends while maintaining separate user accounts and playlists.
For users who primarily want a dedicated, self-hosted music server rather than a full media platform, Navidrome is widely regarded as one of the best options available due to its simplicity, performance, and excellent compatibility with the OpenSubsonic ecosystem.
Below is a production-style Ubuntu VPS deployment guide for Navidrome, a self-hosted music streaming server. Navidrome provides Linux binaries and .deb packages, requires ffmpeg, and uses port 4533 by default.
Compare Ubuntu VPS Plans
Deploy Navidrome on Ubuntu VPS
To deploy Navidrome on Ubuntu VPS, follow the steps outlined below:
-
Prepare the server
Use Ubuntu 22.04 or Ubuntu 24.04.
sudo apt update sudo apt upgrade -y sudo apt install -y curl wget unzip ffmpeg nginx certbot python3-certbot-nginx ufw
Enable a basic firewall:
sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable
-
Create a Navidrome user and directories
sudo useradd -r -s /usr/sbin/nologin navidrome sudo mkdir -p /var/lib/navidrome sudo mkdir -p /srv/music sudo chown -R navidrome:navidrome /var/lib/navidrome sudo chown -R navidrome:navidrome /srv/music
Recommended layout:
/var/lib/navidrome Navidrome database, cache, config /srv/music Your music library
Upload your music files into:
/srv/music
Example using
rsyncfrom your local machine:rsync -avz ./Music/ root@YOUR_SERVER_IP:/srv/music/
Then fix permissions:
sudo chown -R navidrome:navidrome /srv/music
-
Install Navidrome
The official Linux install docs recommend using the prebuilt package or binary.
Check the latest release URL from:
https://github.com/navidrome/navidrome/releases
For Ubuntu x86_64, download the latest
.deb. Example:cd /tmp wget https://github.com/navidrome/navidrome/releases/download/v0.63.1/navidrome_0.63.1_linux_amd64.deb sudo apt install ./navidrome_0.63.1_linux_amd64.deb -y
If the version has changed, replace
v0.63.1and the filename with the latest release.Confirm installation:
navidrome --version
-
Create the Navidrome config file
Navidrome loads configuration from a
navidrome.tomlfile, and its docs list many configurable options including address, port, music folder, data folder, scanner behavior, logging, and UI options.Create the config:
sudo nano /var/lib/navidrome/navidrome.toml
Add:
MusicFolder = "/srv/music" DataFolder = "/var/lib/navidrome" Address = "127.0.0.1" Port = 4533 LogLevel = "info" ScanSchedule = "@every 1h" EnableTranscodingConfig = true EnableSharing = false BaseURL = ""
Save and exit.
Fix ownership:
sudo chown navidrome:navidrome /var/lib/navidrome/navidrome.toml sudo chmod 640 /var/lib/navidrome/navidrome.toml
-
Create a systemd service
sudo nano /etc/systemd/system/navidrome.service
Add:
[Unit] Description=Navidrome Music Server After=network.target [Service] User=navidrome Group=navidrome Type=simple ExecStart=/usr/bin/navidrome --configfile /var/lib/navidrome/navidrome.toml WorkingDirectory=/var/lib/navidrome Restart=on-failure RestartSec=5 NoNewPrivileges=true PrivateTmp=true ProtectSystem=full ProtectHome=true ReadWritePaths=/var/lib/navidrome /srv/music [Install] WantedBy=multi-user.target
Reload systemd:
sudo systemctl daemon-reload sudo systemctl enable --now navidrome
Check status:
sudo systemctl status navidrome
View logs:
journalctl -u navidrome -f
-
Test Navidrome locally
From the server:
curl -I http://127.0.0.1:4533
You should receive an HTTP response.
At this point, Navidrome is running locally but not exposed directly to the internet.
-
Configure Nginx reverse proxy
Replace
music.example.comwith your real domain.Create the Nginx site:
sudo nano /etc/nginx/sites-available/navidrome
Add:
server { listen 80; server_name music.example.com; client_max_body_size 100M; 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; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering off; } }Enable it:
sudo ln -s /etc/nginx/sites-available/navidrome /etc/nginx/sites-enabled/navidrome sudo nginx -t sudo systemctl reload nginx
-
Point DNS to the VPS
Create an
Arecord:music.example.com → YOUR_SERVER_IP
Wait for DNS propagation.
Test:
curl -I http://music.example.com
-
Install SSL with Let’s Encrypt
Certbot with the Nginx plugin is commonly installed on Ubuntu using
certbotandpython3-certbot-nginx.Run:
sudo certbot --nginx -d music.example.com
Choose the redirect option when prompted.
Test renewal:
sudo certbot renew --dry-run
-
Access Navidrome
Open:
https://music.example.com
On first login, Navidrome will prompt you to create the first admin account.
Create navidrome admin account Navidrome scans the music folder in the background. Large libraries may take several minutes or longer to appear fully.
Watch logs:
journalctl -u navidrome -f
-
Add music safely
Upload files to:
/srv/music
Then run:
sudo chown -R navidrome:navidrome /srv/music
Navidrome will automatically rescan based on your
ScanSchedule.Navidrome music player You can also restart it:
sudo systemctl restart navidrome
-
Optional: lock down direct port access
Because Nginx proxies traffic, port
4533should not be publicly open.Confirm:
sudo ss -tulpn | grep 4533
It should bind to:
127.0.0.1:4533
Not:
0.0.0.0:4533
-
Backup Navidrome
Back up:
/var/lib/navidrome /srv/music /etc/systemd/system/navidrome.service /etc/nginx/sites-available/navidrome
Example backup:
sudo tar -czf /root/navidrome-backup-$(date +%F).tar.gz \ /var/lib/navidrome \ /srv/music \ /etc/systemd/system/navidrome.service \ /etc/nginx/sites-available/navidrome
-
Update Navidrome
Check the latest release:
https://github.com/navidrome/navidrome/releases
Then:
cd /tmp wget https://github.com/navidrome/navidrome/releases/download/vNEW_VERSION/navidrome_NEW_VERSION_linux_amd64.deb sudo systemctl stop navidrome sudo apt install ./navidrome_NEW_VERSION_linux_amd64.deb -y sudo systemctl start navidrome
Verify:
navidrome --version sudo systemctl status navidrome
-
Useful commands
Restart Navidrome:
sudo systemctl restart navidrome
Check logs:
journalctl -u navidrome -n 100 --no-pager
Follow logs live:
journalctl -u navidrome -f
Check Nginx config:
sudo nginx -t
Reload Nginx:
sudo systemctl reload nginx
Finished
Your Navidrome instance should now be available at:
https://music.example.com
Conclusion
You now know how to deploy Navidrome on Ubuntu VPS.











