No description
Find a file
2026-04-02 16:37:48 +02:00
Dockerfile init commit 2026-04-02 16:00:18 +02:00
fly.toml needs more RAM 2026-04-02 16:37:48 +02:00
README.md remove easily scraped live link 2026-04-02 16:04:05 +02:00

navidrome on fly.io

Personal music streaming server running Navidrome on Fly.io.

Setup

App and volume were created manually before first deploy:

fly apps create juliannymark-navidrome --org personal
fly volumes create navidrome_data --app juliannymark-navidrome --region ams --size 1
fly deploy

Volume

A single 1GB volume is mounted at /data. Both the Navidrome database and the music library live here:

Path Contents
/data Navidrome database & cache
/data/music Music files

The volume auto-extends by 1GB whenever usage hits 80%, up to a maximum of 100GB (configured via auto_extend_* in fly.toml). You can also extend manually:

fly volumes list --app juliannymark-navidrome
fly volumes extend <volume-id> -s <new-size-gb> --app juliannymark-navidrome

Fly takes daily snapshots retained for 5 days. Check them with:

fly volumes snapshots list <volume-id> --app juliannymark-navidrome

Uploading music

Navidrome has no built-in upload UI by design. All approaches below go through an SSH tunnel via fly proxy.

Step 1 — issue SSH credentials (once per 24h)

fly proxy tunnels TCP but doesn't handle auth. Fly can issue a short-lived SSH key pair signed by their CA:

mkdir -p ~/.fly/ssh
fly ssh issue personal ~/.fly/ssh/navidrome --overwrite

This writes a private key and certificate to ~/.fly/ssh/navidrome (valid 24 hours). Re-run it when it expires.

Step 2 — open the tunnel

# keep this running in a dedicated terminal
fly proxy 2222:22 --app juliannymark-navidrome

SSH config alias

Add this to ~/.ssh/config once — it keeps the key and port wiring in one place so all tools below just use fly-navidrome:

Host fly-navidrome
    User                  root
    Hostname              127.0.0.1
    Port                  2222
    IdentityFile          ~/.fly/ssh/navidrome
    IdentitiesOnly        yes
    StrictHostKeyChecking no
    UserKnownHostsFile    /dev/null

rsync

Only transfers new or changed files, so re-running after adding more music is fast:

rsync -az fly-navidrome:/data/music/ ~/Music/navidrome/   # download
rsync -az ~/Music/navidrome/ fly-navidrome:/data/music/   # upload

GUI: not currently possible via fly proxy

Fly's SSH service (Hallpass) supports shell and command execution but not the SFTP subsystem, so GUI clients like Cyberduck will connect and authenticate successfully but immediately get an EOF when they request SFTP. fly sftp put works because flyctl implements SFTP over SSH exec internally, bypassing this limitation.

Quick single file or folder (no proxy needed)

fly sftp put --app juliannymark-navidrome -R ~/Music/Radiohead /data/music/Radiohead

Navidrome picks up new files automatically on its next scan. You can also trigger an immediate rescan from Settings → Library in the web UI.

Deploy

fly deploy

Logs

fly logs --app juliannymark-navidrome

Auto-stop

The machine stops when idle and starts automatically on the next request. To disable this (always-on), set auto_stop_machines = "off" in fly.toml and redeploy.