> ## Content Index
> Fetch the complete content index at: https://developerinsider.co/llms.txt
> Use this file to discover other available public pages before exploring further.

# Create a Unified File Browser Across Multiple Linux Machines Using Filebrowser Quantum
- URL: https://developerinsider.co/create-a-unified-file-browser-across-multiple-linux-machines-using-filebrowser-quantum/
- Published: 2026-04-12T15:53:15.000Z
- Updated: 2026-04-13T03:38:35.000Z
- Author: Vineet Choudhary
- Tags: Wiki, Self-Hosted, FileBrowser Quantum, WebDAV, rclone, Docker

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

```bash
mkdir -p /opt/filebrowser-quantum/data

```

### 1.2\. Create the Docker Compose File

```bash
cd /opt/filebrowser-quantum
nano docker-compose.yml

```

Paste the following content (replace `<REMOTE_DATA_PATH>` and `<REMOTE_PORT>` with your values):

```yaml
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:**

```yaml
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

```bash
nano /opt/filebrowser-quantum/data/config.yaml

```

Paste the following content (replace `<SOURCE_NAME>` with your desired source name):

```yaml
server:
  port: 80
  cacheDir: "tmp"
  sources:
    - path: /data
      name: <SOURCE_NAME>
      config:
        defaultEnabled: true

```

**Example with real values:**

```yaml
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

```bash
cd /opt/filebrowser-quantum

```

```bash
docker compose up -d

```

### 1.5\. Verify It's Running

```bash
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):

```bash
curl -v -X PROPFIND \
  -u "ignored:<API_TOKEN>" \
  http://<REMOTE_IP>:<REMOTE_PORT>/dav/<SOURCE_NAME>/

```

**Example:**

```bash
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

```bash
sudo apt update

```

```bash
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:

```bash
sudo sed -i 's/#user_allow_other/user_allow_other/' /etc/fuse.conf

```

Verify it was uncommented:

```bash
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:

```bash
rclone obscure "<API_TOKEN>"

```

**Example:**

```bash
rclone obscure "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJGaW..."

```

Copy the output, this is your `<OBSCURED_TOKEN>`.

### 3.4\. Create the rclone Config Directory

```bash
sudo mkdir -p /root/.config/rclone

```

### 3.5\. Create the rclone Config File

```bash
sudo nano /root/.config/rclone/rclone.conf

```

Paste the following content (replace all placeholders):

```ini
[<RCLONE_REMOTE_NAME>]
type = webdav
url = http://<REMOTE_IP>:<REMOTE_PORT>/dav/<SOURCE_NAME>/
vendor = other
user = ignored
pass = <OBSCURED_TOKEN>

```

**Example:**

```ini
[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:

```bash
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

```bash
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):

```bash
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:

```bash
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

```bash
sudo nano /etc/systemd/system/rclone-mediaserver.service

```

Paste the following content (replace placeholders if you're using different names/paths):

```ini
[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:**

```ini
[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

```bash
sudo fusermount -uz /mnt/WebDavMount/MediaServer/

```

### 4.3\. Reload systemd and Enable the Service

```bash
sudo systemctl daemon-reload

```

```bash
sudo systemctl enable --now rclone-mediaserver.service

```

### 4.4\. Verify the Service Is Running

```bash
sudo systemctl status rclone-mediaserver.service

```

```bash
ls /mnt/WebDavMount/MediaServer/

```

If the service failed, check the logs:

```bash
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:
> 
> ```bash
> 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

```bash
mkdir -p /opt/filebrowser-quantum/data

```

### 5.2\. Create the Docker Compose File

```bash
cd /opt/filebrowser-quantum

```

```bash
nano docker-compose.yml

```

Paste the following content (replace placeholders):

```yaml
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:**

```yaml
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

```bash
nano /opt/filebrowser-quantum/data/config.yaml

```

Paste the following content (replace `<SOURCE_NAME>` placeholder):

```yaml
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:**

```yaml
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

```bash
cd /opt/filebrowser-quantum

```

```bash
docker compose up -d --force-recreate

```

### 5.5\. Verify It's Running

```bash
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

```bash
sudo nano /root/.config/rclone/rclone.conf

```

Add a new section at the bottom of the file:

```ini
[<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:**

```ini
[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

```bash
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

```bash
sudo mkdir -p /mnt/WebDavMount/BackupServer

```

```bash
sudo mkdir -p /mnt/WebDavMount/DevServer

```

### 6.4\. Enable the New Services

```bash
sudo systemctl daemon-reload

```

```bash
sudo systemctl enable --now rclone-backupserver.service

```

```bash
sudo systemctl enable --now rclone-devserver.service

```

### 6.5\. Update the Master's Docker Compose

```bash
cd /opt/filebrowser-quantum

```

```bash
nano docker-compose.yml

```

Add the new volumes:

```yaml
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

```bash
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):

```bash
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:

```bash
sudo cat /root/.config/rclone/rclone.conf

```

### • "Config file not found" in systemd

The service runs as root. Check where your config actually lives:

```bash
find / -name "rclone.conf" 2>/dev/null

```

If it's in a user home directory, copy it to root's config:

```bash
sudo mkdir -p /root/.config/rclone

```

```bash
sudo cp /home/$(whoami)/.config/rclone/rclone.conf /root/.config/rclone/rclone.conf

```

### • "mount not ready" with rclone

Unmount any stale FUSE mounts:

```bash
sudo fusermount -uz /mnt/WebDavMount/MediaServer/

```

Ensure `fuse3` is installed:

```bash
sudo apt install fuse3 -y

```

Ensure `user_allow_other` is uncommented:

```bash
grep user_allow_other /etc/fuse.conf

```

Test without `--daemon` first to see verbose errors:

```bash
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:

```bash
ls /mnt/WebDavMount/MediaServer/

```

Restart the Filebrowser container after mounting:

```bash
cd /opt/filebrowser-quantum

```

```bash
docker compose up -d --force-recreate

```

Check that the Docker volume path matches the rclone mount path:

```bash
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.