1️. System prep (do this first)
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget unzip ffmpegWhy:
-
ffmpeg→ metadata, album art, transcoding -
curl/wget→ downloads
2️. Download & install Navidrome (core software)
Create Navidrome user (security best practice)
sudo useradd -r -s /bin/false navidromeCreate folders
sudo mkdir -p /opt/navidrome
sudo mkdir -p /var/lib/navidrome
sudo mkdir -p /music
sudo chown -R navidrome:navidrome /opt/navidrome /var/lib/navidrome /music
/music= where your songs will live
Download Navidrome (official binary)
cd /opt/navidrome
sudo wget https://github.com/navidrome/navidrome/releases/latest/download/navidrome_linux_amd64.tar.gz
sudo tar -xzf navidrome_linux_amd64.tar.gz
sudo chown navidrome:navidrome navidrome
sudo chmod +x navidrome3️. Navidrome configuration
Create config file:
sudo nano /var/lib/navidrome/navidrome.tomlPaste this (safe + public-ready):
MusicFolder = "/music"
DataFolder = "/var/lib/navidrome"
Address = "127.0.0.1"
Port = 4533
ScanSchedule = "@every 1h"
EnableTranscoding = true
LogLevel = "info"Save & exit.
4️. Create Navidrome system service (auto-start)
sudo nano /etc/systemd/system/navidrome.service[Unit]
Description=Navidrome Music Server
After=network.target
[Service]
User=navidrome
Group=navidrome
ExecStart=/opt/navidrome/navidrome
WorkingDirectory=/var/lib/navidrome
Restart=on-failure
[Install]
WantedBy=multi-user.targetEnable & start:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable navidrome
sudo systemctl start navidromeCheck:
sudo systemctl status navidromeNavidrome is now running (but not publicly exposed yet)
5️. Nginx config for your hostname
Create a new site:
sudo nano /etc/nginx/sites-available/musicserver {
listen 80;
server_name music.blvaine.ddns.net;
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;
}
}Enable it:
sudo ln -s /etc/nginx/sites-available/music /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxNow test:
http://music.blvaine.ddns.net
You should see Navidrome’s web UI 🎶
6️. HTTPS (strongly recommended)
If Certbot isn’t installed:
sudo apt install -y certbot python3-certbot-nginxRun:
sudo certbot --nginxSelect:
music.blvaine.ddns.netremusic.servebeer.com→ Currently server works on this domain
Done — HTTPS enabled 🔒
7️. Upload your music
rsync (better)
rsync -av --progress Music/ ubuntu@music.blvaine.ddns.net:/musicNavidrome will auto-scan.
8. First login & friends access
-
Visit:
https://remusic.servebeer.com -
Create admin account
-
Add users for friends
-
Share URL + login
They need nothing else.
Got it 👍 — this is totally fine and very normal with Nginx.
You already have:
-
Nginx running
-
Site A:
blvaine.ddns.net→ documents -
You want Site B:
remusic.servebeer.com→ music (Navidrome)
Same VM, same Nginx, two completely separate websites.
I’ll explain what changes and what does NOT.
Configuring Another Website for Nginx
ping remusic.servebeer.com1. Leave your existing site alone
DO NOT TOUCH:
/etc/nginx/sites-available/blvaineWe’re adding a new site, not modifying the old one.
2. Create a new Nginx site for music
sudo nano /etc/nginx/sites-available/remusicPaste:
server {
listen 80;
server_name remusic.servebeer.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;
}
}3. Enable the music site
sudo ln -s /etc/nginx/sites-available/remusic /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxAt this point:
-
blvaine.ddns.net→ still documents -
http://remusic.servebeer.com→ Navidrome UI
4. Add HTTPS (very important)
sudo certbot --nginxSelect:
-
remusic.servebeer.com -
(keep your existing certs)
Certbot will add a second certificate, no conflicts.
5. Verify Navidrome is correct
Navidrome should be local only:
Address = "127.0.0.1"
Port = 4533Check:
sudo ss -tulnp | grep 4533Should show 127.0.0.1:4533, not 0.0.0.0.
Final mental model (important)
Internet
↓
Nginx (port 80/443)
├── blvaine.ddns.net → /var/www/docs
└── remusic.servebeer.com → Navidrome (127.0.0.1:4533)Your friends just open:
👉 https://remusic.servebeer.com
Common mistakes to avoid
- Using the same
server_nametwice - Binding Navidrome to
0.0.0.0 - Forgetting to enable the site
- Not running
nginx -t - DNS not pointing to the VM
Back References: