Set up Fugue (merge multiple servers)
Fugue is for people who already have more than one Navidrome server — say, one at home and one at the cabin, or one of your own and one shared with a friend. Fugue stitches them together so they look like a single library.
Do I need Fugue? What's this?
Probably not, if you only have one server. Fugue is the answer to: "I have music on two different machines — can I see them as one library, with no duplicates?" If that's not your problem, skip this tutorial.
Get Fugue
Fugue is distributed as a Docker image — no prebuilt standalone binaries. Pull the latest from GitHub Container Registry:
docker pull ghcr.io/andvision/fugue:latest
Image page: ghcr.io/andvision/fugue. Source: github.com/andvision/fugue.
No Docker? Build from source
Fugue is Rust. With
rustupinstalled, clone and build a release binary:git clone https://github.com/andvision/fugue cd fugue cargo build --release ./target/release/fugue serve
First build takes a few minutes — pulls every dependency. The resulting binary is self-contained.
Make a settings file
In a folder you'll remember (e.g.
~/fugue), createfugue.tomlwith your servers:# fugue.toml — basic two-server setup [server] listen = "0.0.0.0:4040" [[backends]] name = "home" url = "http://192.168.1.42:4533" username = "anna" password = "your-navidrome-password" [[backends]] name = "cabin" url = "https://music.cabin.example.com" username = "anna" password = "another-password"
What's a "backend"?
In Fugue's settings, each Navidrome server you want to merge is called a "backend." You can have two, three, ten — Fugue talks to all of them in parallel and combines the results.
Is it safe to put my password in this file?
The file lives only on your machine, in a folder only you can read. If you want extra safety, set the file's permissions so only your user can open it:
chmod 600 fugue.toml
You can also use environment variables instead — see the
FUGUE_overrides in the docs.Start Fugue
From the folder containing
fugue.toml:docker run -d --name fugue \ --restart unless-stopped \ -p 4040:4040 \ -v "$(pwd)/fugue.toml:/etc/fugue/fugue.toml:ro" \ ghcr.io/andvision/fugue:latest serve
Watch logs with
docker logs -f fugue. Fugue probes every backend on startup and reports any that are unreachable.Prefer docker compose?
Drop a
compose.yamlnext tofugue.toml:services: fugue: image: ghcr.io/andvision/fugue:latest container_name: fugue restart: unless-stopped ports: - "4040:4040" volumes: - ./fugue.toml:/etc/fugue/fugue.toml:ro command: serveThen
docker compose up -d.Built from source instead?
Just run the binary:
./target/release/fugue serve
It reads
fugue.tomlfrom the working directory.Check it works
Open in a browser:
http://localhost:4040/rest/ping?u=anna&p=YOUR_FUGUE_PASSWORD&v=1.16.1&c=test&f=json
You should see
{"subsonic-response":{"status":"ok",...}}. That confirms Fugue is up and speaking the Subsonic API. Now any Subsonic-compatible app — including Moosic — can connect to Fugue and see all your servers as one library.(Optional) Auto-start on boot
Docker: the
--restart unless-stoppedflag above already handles this — Fugue comes back after every reboot.From-source binary: wrap it in a systemd unit at
/etc/systemd/system/fugue.service:[Unit] Description=Fugue Subsonic proxy After=network-online.target Wants=network-online.target [Service] Type=simple User=fugue WorkingDirectory=/opt/fugue ExecStart=/opt/fugue/fugue serve Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Adjust
Userand paths to where the binary andfugue.tomlactually live. Then:sudo systemctl daemon-reload sudo systemctl enable --now fugue sudo systemctl status fugue