1️. System prep (do this first)

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget unzip ffmpeg

Why:

  • 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 navidrome

Create 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 navidrome

3️. Navidrome configuration

Create config file:

sudo nano /var/lib/navidrome/navidrome.toml

Paste 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.target

Enable & start:

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable navidrome
sudo systemctl start navidrome

Check:

sudo systemctl status navidrome

Navidrome is now running (but not publicly exposed yet)


5️. Nginx config for your hostname

Create a new site:

sudo nano /etc/nginx/sites-available/music
server {
    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 nginx

Now test:

http://music.blvaine.ddns.net

You should see Navidrome’s web UI 🎶


If Certbot isn’t installed:

sudo apt install -y certbot python3-certbot-nginx

Run:

sudo certbot --nginx

Select:

  • music.blvaine.ddns.net
  • remusic.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:/music

Navidrome 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.com

1. Leave your existing site alone

DO NOT TOUCH:

/etc/nginx/sites-available/blvaine

We’re adding a new site, not modifying the old one.


2. Create a new Nginx site for music

sudo nano /etc/nginx/sites-available/remusic

Paste:

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 nginx

At this point:

  • blvaine.ddns.net → still documents

  • http://remusic.servebeer.com → Navidrome UI


4. Add HTTPS (very important)

sudo certbot --nginx

Select:

  • 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 = 4533

Check:

sudo ss -tulnp | grep 4533

Should 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_name twice
  • Binding Navidrome to 0.0.0.0
  • Forgetting to enable the site
  • Not running nginx -t
  • DNS not pointing to the VM

Back References: