Managing files across multiple Linux machines usually means SSH-ing into each machine or multiple browser tabs. What if you could see every file from every machine in a single web interface? With Filebrowser Quantum's built-in WebDAV support and rclone, you can set up a master machine that aggregates files from all your remote servers (or local servers) into one unified view.
In this guide, we'll walk through setting up two Linux machines running Filebrowser Quantum via Docker, one as the master (central hub) and one as the remote (file source), connected via WebDAV.
Prerequisites
- Two Linux machines on the same network (or with network access between them)
- Docker and Docker Compose installed on both machines
- Filebrowser Quantum v1.3.0-beta or later (WebDAV is included by default)
rcloneandfuse3installed on the master machine
1. Set Up Filebrowser Quantum on the Remote Machine
The remote machine is the one whose files you want to access from the master. SSH into the remote machine and run the following commands.
1.1. Create the Directory Structure
mkdir -p /opt/filebrowser-quantum/data
1.2. Create the Docker Compose File
cd /opt/filebrowser-quantum
nano docker-compose.yml
Paste the following content (replace <REMOTE_DATA_PATH> and <REMOTE_PORT> with your values):
services:
filebrowser:
image: gtstef/filebrowser:stable
container_name: filebrowser-remote
volumes:
- <REMOTE_DATA_PATH>:/data
- ./data:/home/filebrowser/data
ports:
- "<REMOTE_PORT>:80"
restart: unless-stopped
Example with real values:
services:
filebrowser:
image: gtstef/filebrowser:stable
container_name: filebrowser-remote
volumes:
- /mnt/storage/media:/data
- ./data:/home/filebrowser/data
ports:
- "3670:80"
restart: unless-stopped
Save and exit (Ctrl+O, Enter, Ctrl+X in nano).
1.3. Create the Filebrowser Config
nano /opt/filebrowser-quantum/data/config.yaml
Paste the following content (replace <SOURCE_NAME> with your desired source name):
server:
port: 80
cacheDir: "tmp"
sources:
- path: /data
name: <SOURCE_NAME>
config:
defaultEnabled: true
Example with real values:
server:
port: 80
cacheDir: "tmp"
sources:
- path: /data
name: Media
config:
defaultEnabled: true
Save and exit (Ctrl+O, Enter, Ctrl+X).
1.4. Start the Remote Instance
cd /opt/filebrowser-quantum
docker compose up -d
1.5. Verify It's Running
docker ps | grep filebrowser
You should also be able to visit http://<REMOTE_IP>:<REMOTE_PORT> in your browser (e.g., http://172.16.10.14:3670).
2. Generate a WebDAV API Token on the Remote Machine
2.1. Generate a API Token
- Open your browser and go to
http://<REMOTE_IP>:<REMOTE_PORT> - Log in with your admin credentials (deault username/password:
admin/admin) - Navigate to Settings -> API Tokens
- Create a new token without customization enabled (keep the default)
- Copy the generated token, this is your
<API_TOKEN>
2.2. Verify the WebDAV Endpoint
SSH into the master machine and run the following test (replace placeholders with your values):
curl -v -X PROPFIND \
-u "ignored:<API_TOKEN>" \
http://<REMOTE_IP>:<REMOTE_PORT>/dav/<SOURCE_NAME>/
Example:
curl -v -X PROPFIND \
-u "ignored:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJGaW..." \
http://172.16.10.14:3670/dav/Media/
Expected response: HTTP 207 Multi-Status with an XML body listing your files. If you get 401 Unauthorized, double-check the token. If you get 405 Method Not Allowed, make sure you're using -X PROPFIND (not a regular GET).
Note: The WebDAV username field is ignored by Filebrowser Quantum, only the URL and API token matter.
3. Install and Configure rclone on the Master Machine
All commands from here on are run on the master machine.
3.1. Install rclone and FUSE
sudo apt update
sudo apt install rclone fuse3 -y
3.2. Enable user_allow_other for FUSE
This allows Docker (running as a different user) to access the FUSE mount:
sudo sed -i 's/#user_allow_other/user_allow_other/' /etc/fuse.conf
Verify it was uncommented:
grep user_allow_other /etc/fuse.conf
You should see user_allow_other without a # in front.
3.3. Obscure the API Token
rclone requires passwords to be obscured in its config file. Run this command, replacing <API_TOKEN> with the token you copied in Step 2:
rclone obscure "<API_TOKEN>"
Example:
rclone obscure "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJGaW..."
Copy the output, this is your <OBSCURED_TOKEN>.
3.4. Create the rclone Config Directory
sudo mkdir -p /root/.config/rclone
3.5. Create the rclone Config File
sudo nano /root/.config/rclone/rclone.conf
Paste the following content (replace all placeholders):
[<RCLONE_REMOTE_NAME>]
type = webdav
url = http://<REMOTE_IP>:<REMOTE_PORT>/dav/<SOURCE_NAME>/
vendor = other
user = ignored
pass = <OBSCURED_TOKEN>
Example:
[mediaserver]
type = webdav
url = http://172.16.10.14:3670/dav/Media/
vendor = other
user = ignored
pass = q3F4j8K2mNpR7xL5vW9...
Save and exit (Ctrl+O, Enter, Ctrl+X).
Alternatively, create the config with a single copy-paste command:
sudo tee /root/.config/rclone/rclone.conf << 'EOF'
[mediaserver]
type = webdav
url = http://172.16.10.14:3670/dav/Media/
vendor = other
user = ignored
pass = PASTE_YOUR_OBSCURED_TOKEN_HERE
EOF
3.6. Create the Mount Point
sudo mkdir -p /mnt/WebDavMount/MediaServer
3.7. Test the Mount in Foreground
Run this first to verify everything works (press Ctrl+C to stop when done):
rclone mount mediaserver:/ /mnt/WebDavMount/MediaServer/ \
--vfs-cache-mode full \
--allow-other \
--config /root/.config/rclone/rclone.conf \
-v
Open another terminal and verify the files are visible:
ls /mnt/WebDavMount/MediaServer/
If you see your remote files, press Ctrl+C in the first terminal to stop the foreground mount and proceed to Step 4.
4. Create a systemd Service for Auto-Mount at Boot
Create a systemd service so the rclone mount starts automatically and doesn't block the boot process if the remote machine is unavailable.
4.1. Create the Service File
sudo nano /etc/systemd/system/rclone-mediaserver.service
Paste the following content (replace placeholders if you're using different names/paths):
[Unit]
Description=rclone WebDAV mount for <RCLONE_REMOTE_NAME>
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStartPre=/bin/mkdir -p <WEBDAV_MOUNT_PATH>
ExecStart=/usr/bin/rclone mount <RCLONE_REMOTE_NAME>:/ <WEBDAV_MOUNT_PATH> \
--vfs-cache-mode full \
--allow-other \
--config <RCLONE_CONFIG_PATH>
ExecStop=/bin/fusermount -uz <WEBDAV_MOUNT_PATH>
Restart=on-failure
RestartSec=10
TimeoutStartSec=30
[Install]
WantedBy=multi-user.target
Example with real values:
[Unit]
Description=rclone WebDAV mount for MediaServer
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStartPre=/bin/mkdir -p /mnt/WebDavMount/MediaServer
ExecStart=/usr/bin/rclone mount mediaserver:/ /mnt/WebDavMount/MediaServer/ \
--vfs-cache-mode full \
--allow-other \
--config /root/.config/rclone/rclone.conf
ExecStop=/bin/fusermount -uz /mnt/WebDavMount/MediaServer
Restart=on-failure
RestartSec=10
TimeoutStartSec=30
[Install]
WantedBy=multi-user.target
Save and exit (Ctrl+O, Enter, Ctrl+X).
4.2. Unmount Any Existing Manual Mount
sudo fusermount -uz /mnt/WebDavMount/MediaServer/
4.3. Reload systemd and Enable the Service
sudo systemctl daemon-reload
sudo systemctl enable --now rclone-mediaserver.service
4.4. Verify the Service Is Running
sudo systemctl status rclone-mediaserver.service
ls /mnt/WebDavMount/MediaServer/
If the service failed, check the logs:
journalctl -xeu rclone-mediaserver.service --no-pager -n 30
Key systemd options:
| Option | Purpose |
|---|---|
After=network-online.target |
Waits for network before mounting |
TimeoutStartSec=30 |
Gives up after 30s, won't block boot |
Restart=on-failure |
Auto-retries if mount drops |
RestartSec=10 |
Waits 10s between retries |
Common pitfall: If the service fails with "Config file not found", the
--configpath doesn't match where yourrclone.confactually lives. The systemd service runs as root, so if you created the config as a regular user, it may be at/home/<username>/.config/rclone/rclone.confinstead of/root/.config/rclone/rclone.conf. Check with:find / -name "rclone.conf" 2>/dev/null
5. Set Up Filebrowser Quantum on the Master Machine
Now configure the master machine's Filebrowser to show both its own local files and the remote machine's files.
5.1. Create the Directory Structure
mkdir -p /opt/filebrowser-quantum/data
5.2. Create the Docker Compose File
cd /opt/filebrowser-quantum
nano docker-compose.yml
Paste the following content (replace placeholders):
services:
filebrowser:
image: gtstef/filebrowser:stable
container_name: filebrowser-master
volumes:
- <MASTER_LOCAL_PATH>:/local-files
- <WEBDAV_MOUNT_PATH>:/remote-files:ro
- ./data:/home/filebrowser/data
ports:
- "<MASTER_PORT>:80"
restart: unless-stopped
Example with real values:
services:
filebrowser:
image: gtstef/filebrowser:stable
container_name: filebrowser-master
volumes:
- /home/user/documents:/local-files
- /mnt/WebDavMount/MediaServer:/remote-files:ro
- ./data:/home/filebrowser/data
ports:
- "8080:80"
restart: unless-stopped
Save and exit (Ctrl+O, Enter, Ctrl+X).
Note: The
:roflag makes the remote files read-only from the master. Remove it if you want write access (and ensure the API token has modify/create/delete permissions).
5.3. Create the Filebrowser Config
nano /opt/filebrowser-quantum/data/config.yaml
Paste the following content (replace <SOURCE_NAME> placeholder):
server:
port: 80
cacheDir: "tmp"
sources:
- path: /local-files
name: LocalFiles
config:
defaultEnabled: true
- path: /remote-files
name: <SOURCE_NAME>-Remote
config:
defaultEnabled: true
Example with real values:
server:
port: 80
cacheDir: "tmp"
sources:
- path: /local-files
name: LocalFiles
config:
defaultEnabled: true
- path: /remote-files
name: Media-Remote
config:
defaultEnabled: true
Save and exit (Ctrl+O, Enter, Ctrl+X).
5.4. Start the Master Instance
cd /opt/filebrowser-quantum
docker compose up -d --force-recreate
5.5. Verify It's Running
docker ps | grep filebrowser
Visit http://<MASTER_IP>:<MASTER_PORT> (e.g., http://172.16.10.10:8080), you should see both "LocalFiles" and "Media-Remote" as sources.
6. Scaling to More Machines
To add a third (or fourth, fifth...) machine, repeat Steps 1-4 for each additional remote.
6.1. Add a New Remote to rclone Config
sudo nano /root/.config/rclone/rclone.conf
Add a new section at the bottom of the file:
[<RCLONE_REMOTE_NAME_2>]
type = webdav
url = http://<REMOTE_IP_2>:<REMOTE_PORT_2>/dav/<SOURCE_NAME_2>/
vendor = other
user = ignored
pass = <OBSCURED_TOKEN_2>
Example config with three remotes:
[mediaserver]
type = webdav
url = http://172.16.10.14:3670/dav/Media/
vendor = other
user = ignored
pass = q3F4j8K2mNpR7xL5vW9...
[backupserver]
type = webdav
url = http://172.16.10.20:8080/dav/Backups/
vendor = other
user = ignored
pass = xY9kL3mN7pQ2rT5wV8...
[devserver]
type = webdav
url = http://172.16.10.30:8080/dav/Projects/
vendor = other
user = ignored
pass = aB4cD7eF9gH2jK5mN8...
Save and exit (Ctrl+O, Enter, Ctrl+X).
6.2. Create a systemd Service for Each New Remote
sudo nano /etc/systemd/system/rclone-backupserver.service
Follow the same template from Step 4, adjusting the remote name, mount path, and config path.
6.3. Create Mount Points for Each Remote
sudo mkdir -p /mnt/WebDavMount/BackupServer
sudo mkdir -p /mnt/WebDavMount/DevServer
6.4. Enable the New Services
sudo systemctl daemon-reload
sudo systemctl enable --now rclone-backupserver.service
sudo systemctl enable --now rclone-devserver.service
6.5. Update the Master's Docker Compose
cd /opt/filebrowser-quantum
nano docker-compose.yml
Add the new volumes:
services:
filebrowser:
image: gtstef/filebrowser:stable
container_name: filebrowser-master
volumes:
- /home/user/documents:/local-files
- /mnt/WebDavMount/MediaServer:/remote-media:ro
- /mnt/WebDavMount/BackupServer:/remote-backups:ro
- /mnt/WebDavMount/DevServer:/remote-projects:ro
- ./data:/home/filebrowser/data
ports:
- "8080:80"
restart: unless-stopped
Save and exit (Ctrl+O, Enter, Ctrl+X).
6.6. Restart the Master Filebrowser
docker compose up -d --force-recreate
7. Troubleshooting
• "Could not authenticate to server: rejected Basic challenge"
Check that the API token has download permission (at minimum):
curl -v -X PROPFIND \
-u "ignored:<API_TOKEN>" \
http://<REMOTE_IP>:<REMOTE_PORT>/dav/<SOURCE_NAME>/
Verify the token in your rclone config is the correct, current token:
sudo cat /root/.config/rclone/rclone.conf
• "Config file not found" in systemd
The service runs as root. Check where your config actually lives:
find / -name "rclone.conf" 2>/dev/null
If it's in a user home directory, copy it to root's config:
sudo mkdir -p /root/.config/rclone
sudo cp /home/$(whoami)/.config/rclone/rclone.conf /root/.config/rclone/rclone.conf
• "mount not ready" with rclone
Unmount any stale FUSE mounts:
sudo fusermount -uz /mnt/WebDavMount/MediaServer/
Ensure fuse3 is installed:
sudo apt install fuse3 -y
Ensure user_allow_other is uncommented:
grep user_allow_other /etc/fuse.conf
Test without --daemon first to see verbose errors:
rclone mount mediaserver:/ /mnt/WebDavMount/MediaServer/ \
--vfs-cache-mode full \
--allow-other \
--config /root/.config/rclone/rclone.conf \
-v
• Remote files not visible in Filebrowser
Confirm the rclone mount is active:
ls /mnt/WebDavMount/MediaServer/
Restart the Filebrowser container after mounting:
cd /opt/filebrowser-quantum
docker compose up -d --force-recreate
Check that the Docker volume path matches the rclone mount path:
docker inspect filebrowser-master | grep -A5 "Mounts"
• Performance Considerations
--vfs-cache-mode fullcaches files locally for better performance but uses disk space. Tune with--vfs-cache-max-size 10Gto limit cache size.- On a local gigabit network, rclone's FUSE overhead is negligible for web-based file browsing.
- For large media libraries, consider adding
--dir-cache-time 5mto reduce directory listing latency.