
We rely on Google Docs/Sheets for many reasons: its centralized storage, powerful search capabilities, simple interface, and seamless multi-user collaboration make it an invaluable tool. However, the desire for a truly private, locally hosted solution—one that eliminates dependency on the cloud—has driven the search for a powerful, self-hosted alternative.
While standard self-hosting contenders like Nextcloud or Owncloud are often too resource-intensive for a modest setup like a Raspberry Pi-based Network Attached Storage (RPi-NAS), they are often dismissed. Another excellent commercial option is using Synology Office on a Synology NAS. However, my current home setup already features a Raspberry Pi 4 serving as my NAS, utilizing an external SSD via USB 3 for high-speed storage.
The perfect, lightweight, and powerful solution? Combining OnlyOffice Document Server with the Filebrowser Quantum front-end.
OnlyOffice is the engine—it handles all the heavy-lifting of document, spreadsheet, and presentation editing, offering near-perfect compatibility with Microsoft Office formats. However, it’s just a document server and needs a user interface to manage files and trigger the editing sessions.
This is where Filebrowser Quantum steps in.
| Software | Documentation | GitHub Repository |
|---|---|---|
| Filebrowser Quantum | filebrowserquantum.com/en/docs/ | github.com/gtsteffaniak/filebrowser |
| OnlyOffice Document Server | api.onlyoffice.com/ | github.com/ONLYOFFICE/DocumentServer |
Crucially, both applications are efficient and have minimal resource demands, making them ideal for the 64-bit architecture of the RPi NAS.

To ensure performance and reliability, this setup is installed directly onto the RPi-NAS, utilizing a USB-connected SSD drive. To maximize the lifespan of the SD card, the Docker environment itself is configured to use the SSD for storage.
Here is the step-by-step process for setting up your self-hosted office suite using Docker Compose.
First, we log into the RPi and navigate to the SSD, setting up the necessary folders for persistent data storage:
# Navigate to the SSD mount point
cd ssd
# Create and enter the project directory
mkdir onlyoffice-filebrowser
cd onlyoffice-filebrowser
# Create local data directories for the containers
mkdir -p onlyoffice/data onlyoffice/logs onlyoffice/lib
mkdir -p filebrowser/data
The config.yaml file tells Filebrowser how to interact with the network and, most importantly, how to communicate with the OnlyOffice server.
$ nano filebrowser/data/config.yaml
server:
database: "/home/filebrowser/data/database.db"
internalUrl: "http://filebrowser"
externalUrl: "http://[YOUR.RPi.IP.ADDRESS]" # e.g., http://192.168.5.245 - OnlyOffice callback to FileBrowser. **MUST REPLACE!**
sources:
- path: /files # Must match the volume mount in docker-compose.yml
config:
defaultEnabled: true
auth:
adminUsername: admin
integrations:
office:
url: "http://[YOUR.Pi.IP.ADDRESS]:8080" # e.g., http://192.168.5.245:8080 - The external address of OnlyOffice. **MUST REPLACE!**
secret: "Create-your-own-128bit-secret-string" # **Crucial JWT Secret**
The docker-compose.yml file defines the two services, ensuring they can communicate over an internal network and persist their data. Security Note: The JWT_SECRET must match the secret configured in the filebrowser/data/config.yaml.
$ nano docker-compose.yml
services:
onlyoffice:
image: onlyoffice/documentserver:latest
container_name: onlyoffice
restart: always
ports:
- "8080:80" # Default ONLYOFFICE port
environment:
# Use the same secret as in the Filebrowser config
JWT_SECRET: Create-your-own-128bit-secret-string
JWT_ENABLED: 'true'
volumes:
# Persistent storage for ONLYOFFICE data, logs, and certificates
- ./onlyoffice/data:/var/www/onlyoffice/data
- ./onlyoffice/logs:/var/log/onlyoffice
- ./onlyoffice/lib:/var/lib/onlyoffice
healthcheck:
test: ["CMD-SHELL", "wget -q --no-check-certificate http://localhost/healthcheck -O /dev/null || exit 1"]
interval: 30s
timeout: 3s
retries: 3
networks:
- default
filebrowser:
image: gtstef/filebrowser:stable
container_name: filebrowser
restart: always
ports:
- "80:80" # FileBrowser Quantum standard port
environment:
FILEBROWSER_CONFIG: "data/config.yaml"
FILEBROWSER_ADMIN_PASSWORD: "Your-admin-password" # **REPLACE WITH A SECURE PASSWORD!**
FILEBROWSER_ONLYOFFICE_URL: "http://onlyoffice" # Internal Docker network address for OnlyOffice
volumes:
# 1. Mountpoint for configuration and database
- ./filebrowser/data:/home/filebrowser/data
# 2. **The folder containing your documents (REPLACE THIS PATH!)**
- /home/pi/ssd/nas/Documents:/files
depends_on:
- onlyoffice
networks:
- default
networks:
default:
# Creates an internal Docker network for container communication
Start the entire stack with a single command:
docker compose up -d
Your self-hosted document suite is now accessible! (Replace [YOUR.RPi.IP.ADDRESS] with the actual local IP address of your Raspberry Pi):
http://[YOUR.RPi.IP.ADDRESS]http://[YOUR.RPi.IP.ADDRESS]:8080
For monitoring or troubleshooting, you can view the live logs of both containers:
docker compose logs -f filebrowser onlyoffice
Need to make a change? A simple restart gets you back up and running:
docker compose down && docker compose up -d
This setup delivers the core functionality of Google Docs—centralized, searchable, multi-user document editing—all on your own hardware, giving you complete data sovereignty without sacrificing performance on your Raspberry Pi NAS.