Create a Unified File Browser Across Multiple Linux Machines Using Filebrowser Quantum

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)
  • rclone and fuse3 installed 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

  1. Open your browser and go to http://<REMOTE_IP>:<REMOTE_PORT>
  2. Log in with your admin credentials (deault username/password: admin/admin)
  3. Navigate to Settings -> API Tokens
  4. Create a new token without customization enabled (keep the default)
  5. 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 --config path doesn't match where your rclone.conf actually 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.conf instead 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 :ro flag 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 full caches files locally for better performance but uses disk space. Tune with --vfs-cache-max-size 10G to 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 5m to reduce directory listing latency.

You've successfully subscribed to Developer Insider
Great! Next, complete checkout for full access to Developer Insider
Welcome back! You've successfully signed in
Success! Your account is fully activated, you now have access to all content.