Featured image
Info

Homelab Series Index

Digital freedom: creating a personal service ecosystem without depending on big tech.

  1. Homelab: Necessity or Whim?
  2. Homelab: Proxmox and LXC Containers
  3. Homelab: Immich Setup
  4. Homelab: Navidrome Setup
  5. Homelab: Secure Remote Access
  6. Homelab: Migrating from iCloud to Immich
  7. Homelab: Paperless-NGX and Document Management

From Photo Control to Music Control Link to heading

In the previous article we configured Immich for photo management with dedicated external storage. With Immich operational and backups still to be configured, I decide to expand the homelab. The next service: Navidrome, a self-hosted music streaming server that transforms our MP3/FLAC collection into a Spotify-like service, but completely under our control.

Info
Navidrome vs commercial services: No monthly subscription, no algorithm deciding what to listen to, no geographic limitations. Your music, accessible wherever you are, with Subsonic-compatible apps on all devices.

Dedicated Container for Navidrome Link to heading

Following the service isolation approach per container, we create an LXC container dedicated exclusively to Navidrome.

Via Proxmox Web Interface:

  1. Create CT โ†’ General

    • CT ID: 103
    • Hostname: navidrome
    • Password: Set secure password
  2. Template: ubuntu-22.04-standard

  3. Root Disk:

    • Storage: local-lvm
    • Disk size: 8 GB (minimum, data on external disk)
  4. CPU:

    • Cores: 1 (sufficient for music streaming)
  5. Memory:

    • Memory: 512 MB
    • Swap: 512 MB
  6. Network:

    • Bridge: vmbr0
    • IPv4: Static
    • IPv4/CIDR: 192.168.1.206/24
    • Gateway: 192.168.1.1
    • Firewall: โœ“ Enabled

Hermes Storage Mount Point Link to heading

Via Proxmox Web Interface:

  1. Select navidrome container (ID 103)
  2. Resources โ†’ Add โ†’ Mount Point
  3. Mount Point ID: mp0 (default)
  4. Storage: hermes
  5. Disk size: 50 GB
  6. Path in Container: /navidrome-data
  7. Backup: โœ“

Storage Directory Preparation Link to heading

# FROM PROXMOX HOST
mkdir -p /mnt/hermes/navidrome/{data,music}

# Structure:
# /mnt/hermes/
# โ”œโ”€โ”€ immich/
# โ””โ”€โ”€ navidrome/
#     โ”œโ”€โ”€ data/         (database and cache)
#     โ””โ”€โ”€ music/        (music library)

Docker Setup in Container Link to heading

# Start and enter container
pct start 103
pct enter 103

# System update and Docker installation
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sudo sh
usermod -aG docker $USER

# Verify mount point
df -h /navidrome-data
ls -la /navidrome-data/

# Create working directory
mkdir -p /root/navidrome-app

Following the official Navidrome guide adapted to our homelab environment.

Docker Compose Configuration Link to heading

# Enter working directory
cd /root/navidrome-app

# Create docker-compose.yml
nano docker-compose.yml

Docker Compose Configuration:

version: "3"
services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: 1000:1000
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      - ND_MUSICFOLDER=/music
      - ND_DATAFOLDER=/data
      - ND_SCANSCHEDULE=@every 1h
      - ND_LOGLEVEL=info
      - ND_ENABLEDOWNLOADS=true
      - ND_SESSIONTIMEOUT=24h
      - ND_UIWELCOMEMESSAGE="Homelab Music"
      - ND_DEFAULTTHEME=Dark
    volumes:
      - "/navidrome-data/data:/data"
      - "/navidrome-data/music:/music:ro"

Directory and Permissions Preparation Link to heading

Before first startup, configure correct permissions for Navidrome directories:

# From navidrome container (pct enter 103)
# Create necessary directories
mkdir -p /navidrome-data/{data,music}

# Set correct permissions for Docker user 1000:1000
chown -R 1000:1000 /navidrome-data/
chmod -R 755 /navidrome-data/

# Verify permissions
ls -la /navidrome-data/

First Launch Link to heading

# Start container
cd /root/navidrome-app
docker-compose up -d

# Check status
docker-compose ps
docker-compose logs navidrome

# Expected output:
# navidrome | INFO Navidrome is ready!

Music Transfer from PC Link to heading

First: Enable SSH in container

Warning
SSH required: For direct transfers via rsync/scp, the container must have SSH server active. Without SSH, connections are refused.
# From navidrome container (pct enter 103)
# Install and enable SSH
apt update && apt install -y openssh-server
systemctl enable ssh
systemctl start ssh

# Allow root login via SSH
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
systemctl restart ssh

# Verify SSH active
systemctl status ssh

Music Transfer

Tip
rsync vs SCP: Prefer rsync because it resumes interrupted transfers, shows detailed progress and better preserves metadata. With SSH enabled, rsync automatically handles correct permissions.
# RSYNC (recommended) - from your PC
# Copy folder CONTENTS (note the trailing slash)
rsync -av --progress /path/to/MusicLibrary/ [email protected]:/navidrome-data/music/

# SCP alternative - from your PC
# Copy folder and contents (without trailing slash)
scp -r /path/to/MusicLibrary [email protected]:/navidrome-data/music/

# IMPORTANT: After transfer, fix permissions in container
ssh [email protected] "chown -R 1000:1000 /navidrome-data/music/ && chmod -R 755 /navidrome-data/music/"

# Final desired structure:
# /navidrome-data/music/
# โ”œโ”€โ”€ Artist1/Album1/01-Track.mp3
# โ”œโ”€โ”€ Artist2/Album2/02-Track.flac
# โ””โ”€โ”€ ...

Option 2: Network Sharing (SMB/CIFS) Link to heading

# From navidrome container - install samba for sharing
apt update && apt install -y samba

# Create samba user
smbpasswd -a root

# Configure share in /etc/samba/smb.conf
echo '[music-share]
path = /navidrome-data/music
browseable = yes
writable = yes
guest ok = no
valid users = root' >> /etc/samba/smb.conf

# Restart samba
systemctl restart smbd

# From Windows PC: access \\192.168.1.206\music-share

Option 3: USB Drive Direct to Mini PC Link to heading

# From navidrome container - USB drive passthrough
# (Configure USB passthrough in Proxmox first)

# Check USB devices
lsblk

# Mount USB drive
mkdir -p /mnt/usb-music
mount /dev/sdb1 /mnt/usb-music

# Copy music maintaining structure
rsync -av --progress /mnt/usb-music/ /navidrome-data/music/

# Unmount drive
umount /mnt/usb-music

Post-Transfer Permission Settings Link to heading

# After any transfer method
# Set correct permissions for Docker
chown -R 1000:1000 /navidrome-data/music/
chmod -R 755 /navidrome-data/music/

# Verify structure
ls -la /navidrome-data/music/

First Web Configuration Link to heading

  1. URL: http://192.168.1.206:4533
  2. First visit: Create administrator account
  3. Library Scan: Starts automatically

Functionality Testing Link to heading

  1. Browse Library: Verify navigation by artist/album
  2. Play Music: Test playback in browser
  3. Mobile Apps: Configure Subsonic apps - I used Amperfy on both Mac and iOS, the best seems to be Symfonium

Next Steps Link to heading

With Navidrome operational and personal music streaming, the homelab already offers a concrete alternative to Spotify and Apple Music. Immich and Navidrome work perfectly, but only from home.

The next step is crucial: making these services accessible everywhere while maintaining security.

โ†’ Continue with: Homelab: Secure Remote Access