| Dockerfile | ||
| fly.toml | ||
| README.md | ||
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.