Self-Hosting Guide¶
OpenSuite is designed to be easy to self-host. The entire application is static HTML, CSS, and JavaScript served by nginx. A pre-built Docker image is available on Docker Hub.
Docker Hub¶
The official Docker image is available at:
Quick Start with Docker¶
Run OpenSuite locally with a single command:
Then open http://localhost:8080 in your browser.
| URL | Application |
|---|---|
http://localhost:8080 |
OpenSuite landing page |
http://localhost:8080/sheets.html |
OpenSheets (Spreadsheet) |
http://localhost:8080/docs.html |
OpenDocs (Word Processor) |
http://localhost:8080/presentation.html |
OpenPresentation (Presentations) |
http://localhost:8080/docs/ |
Documentation |
Docker Compose¶
Create a docker-compose.yml file:
Start it:
Building from Source¶
If you want to build the Docker image yourself:
Prerequisites¶
Clone and Build¶
Run Your Custom Build¶
Using Make¶
The repository includes a Makefile with convenient commands:
make build # Build the Docker image
make run # Run the container locally on port 8080
make stop # Stop the running container
make push # Push image to Docker Hub (requires docker login)
What's Inside the Image¶
The Docker image is a multi-stage build:
- Build stage: Uses Python to build the MkDocs documentation site
- Runtime stage: Uses
nginx:1.27-alpine(~20 MB) to serve the static files
The image contains:
- nginx as the web server
- All OpenSuite HTML, CSS, and JavaScript files
- Pre-built documentation site (served at
/docs/)
Image Details¶
| Property | Value |
|---|---|
| Base image | nginx:1.27-alpine |
| Image size | ~20 MB |
| Exposed port | 80 |
| Health check | GET /health |
Architecture¶
Container (port 80)
├── / → Landing page (index.html)
├── /sheets.html → OpenSheets
├── /docs.html → OpenDocs
├── /presentation.html → OpenPresentation
├── /css/ → Stylesheets
├── /js/ → JavaScript application code
└── /docs/ → MkDocs documentation site
nginx Configuration¶
The included nginx.conf provides:
- Gzip compression for text, CSS, JavaScript, and SVG files
- Static asset caching with 1-hour expiry for JS, CSS, images, and fonts
- Health check endpoint at
/healthfor container orchestration - Clean URL routing with fallback to
index.html
Running Without Docker¶
Since OpenSuite is entirely static, you can serve it with any web server:
Python (quick development server)¶
Node.js (using npx)¶
nginx (manual setup)¶
Copy the HTML, CSS, and JS files to your nginx web root:
cp index.html sheets.html docs.html presentation.html /usr/share/nginx/html/
cp -r css/ /usr/share/nginx/html/css/
cp -r js/ /usr/share/nginx/html/js/
Documentation site
The /docs/ documentation site requires building with MkDocs first:
site/ output to your web server.
Sharing Still Works Locally¶
Even when self-hosting, you can still share your spreadsheets, documents, and presentations with anyone. When you click Save & Share, your data is compressed and encoded as a base64 string directly in the URL. The recipient does not need access to your server -- the data is embedded in the link itself. They simply need any running instance of OpenSuite (or the hosted version at opensuite.fly.dev) to open it.
Environment Variables¶
OpenSuite does not require any environment variables. All data is stored client-side in the browser (localStorage and URL hash). No database or backend service is needed.
Reverse Proxy¶
If running behind a reverse proxy (e.g., Traefik, Caddy, or another nginx), make sure to:
- Forward the
Hostheader - Allow WebSocket connections (for live reload during development)
- Set appropriate
X-Forwarded-Protoheaders for HTTPS
Example: Traefik with Docker Compose¶
services:
opensuite:
image: dseegers/opensuite:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.opensuite.rule=Host(`suite.example.com`)"
- "traefik.http.routers.opensuite.tls=true"
- "traefik.http.routers.opensuite.tls.certresolver=letsencrypt"
- "traefik.http.services.opensuite.loadbalancer.server.port=80"
restart: unless-stopped
Example: Caddy¶
Updating¶
To update to the latest version:
Or with plain Docker: