Collabora Online für Nextcloud: LibreOffice im Browser
Dokumente direkt in Nextcloud öffnen und bearbeiten – ohne LibreOffice auf dem Rechner, ohne Daten an einen Cloud-Dienst zu schicken. Das ermöglicht Collabora Online: eine komplette Office-Suite, die im Browser läuft und über das WOPI-Protokoll mit deiner Nextcloud spricht. In diesem Tutorial richtest du den Collabora-Container mit Docker Compose ein und bindest ihn an Nextcloud an.
Warum Collabora Online?
Wer Nextcloud selbst hostet, will meistens auch Dokumente bearbeiten, ohne sie an Google oder Microsoft zu schicken. Collabora Online Development Edition (CODE) stellt dafür eine komplette LibreOffice-Suite bereit – Texte, Tabellen, Präsentationen und PDFs laufen im Browser, während die Dateien in deiner Nextcloud bleiben.
Konzept: WOPI & die Rollen
- Nextcloud ist der Datei-Host und startet die Bearbeitungssitzung.
- Collabora Online (CODE) ist der WOPI-Server: Er öffnet das Dokument, rendert es im Browser und schreibt Änderungen zurück an Nextcloud.
- WOPI (Web Application Open Platform Interface) ist das Protokoll zwischen beiden – daher muss Collabora die URL deiner Nextcloud-Instanz(en) kennen.
- Rollenverteilung: Collabora speichert selbst keine Dokumente – nach der Sitzung bleibt alles in Nextcloud.
Vorbereitung: Domain & .env
mkdir -p ~/collabora
cd ~/collabora
Neben der Compose-Datei liegt eine .env im selben Ordner – daraus liest Docker Compose die
Werte für die aliasgroup-Variablen:
# Variable = Wert # Kommentar
NEXTCLOUD1=https://cbo.meine.domain:443
NEXTCLOUD2=https://cbo2.meine.domain:443
- Die Werte müssen exakt der öffentlichen Nextcloud-Adresse entsprechen – inklusive Port, falls nicht 443.
- Ein Port 443 in der URL ist harmlos, aber unnötig – er schadet auch nicht.
./.envmitchmod 600schützen, sobald Passwörter darin liegen.
Docker Compose – die Datei
Deine Vorlage, bereinigt und kommentiert:
services:
collabora:
image: collabora/code
container_name: collabora
restart: unless-stopped
cap_add:
- MKNOD # offiziell empfohlen (Geräteknoten)
ports:
# Host-Port : Container-Port
- "127.0.0.1:9980:9980" # nur lokal – der Proxy reicht nach außen
environment:
# Erlaubte WOPI-Hosts (Nextcloud): domain ist eine REGEX – Punkte escapen!
- domain=cbo\.meine\.domain
# Weitere Nextcloud-Instanzen (Werte kommen aus der .env)
- aliasgroup1=${NEXTCLOUD1}
- aliasgroup2=${NEXTCLOUD2}
# Zugangsdaten für die Admin-Konsole
- username=admin
- password=De1nP4ssw0rt26#
# TLS terminiert der Proxy → intern spricht Collabora HTTP:
- extra_params=--o:ssl.enable=false --o:ssl.termination=true
# Nur nötig mit jwilder/nginx-proxy (docker-gen):
# - VIRTUAL_HOST=cbo.meine.domain
# - VIRTUAL_NETWORK=proxy-ssl
# - VIRTUAL_PORT=9980
volumes:
- /etc/localtime:/etc/localtime:ro
cap_add: MKNOD: offiziell gefordert, damit der Container Geräteknoten anlegen kann.- Das Image ist mehrere GB groß und braucht Speicher – plane RAM-Budget ein (je nach Nutzung 2–4 GB).
aliasgroup1/2werden aus der.envbefüllt – Docker Compose ersetzt die Platzhalter automatisch.- Aus deiner Vorlage entfernt: der leere
networks: {}-Block sowie die doppeltenusername/password-Zeilen.
Konfiguration: Env-Variablen im Detail
| Variable | Erklärung |
|---|---|
domain | Erlaubter WOPI-Host als Regex – cbo\.meine\.domain lässt genau diese Nextcloud zu. Wer alle Subdomains erlauben will, nutzt domain=\.meine\.domain. Das Escaping der Punkte ist Pflicht! |
aliasgroup1…N | Weitere Nextcloud-Instanzen, die Collabora bedienen darf – hier aus der .env per ${…} befüllt. |
username/password | Zugangsdaten für die Admin-Konsole von Collabora – nicht mit Nextcloud-Benutzern verwechseln. |
extra_params | Zusätzliche Server-Optionen (COOLWSD) – hier: internes SSL aus, Terminierung durch den Proxy. |
VIRTUAL_* | Steuerung nur für den jwilder/nginx-proxy (docker-gen) – der Container muss dafür im Netz proxy-ssl hängen. |
ssl.enable=false, ssl.termination=true) – so wirkungslos.
Sie gehören in extra_params (siehe Compose-Datei oben). Außerdem: VIRTUAL_PROTO=https
setzen nur, wenn Collabora intern wirklich HTTPS spricht – bei Terminierung durch den Proxy bleibt das
Backend HTTP.
Reverse Proxy & SSL-Terminierung
Der Collabora-Container selbst spricht nur HTTP auf Port 9980 – die Verschlüsselung übernimmt der Proxy. Damit Dokumente flüssig geladen und gespeichert werden, braucht der Proxy lange Timeouts und die WebSocket-Weiterleitung für die Bearbeitungssitzung:
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name cbo.meine.domain;
access_log off;
error_log /var/log/nginx/cbo.meine.domain.error.log;
# ---------------------------------------------------------------- Zertifikat (ECDSA)
ssl_certificate /etc/ssl/private/cbo.meine.domain_ecc/fullchain.cer;
ssl_certificate_key /etc/ssl/private/cbo.meine.domain_ecc/cbo.meine.domain.key;
# ---------------------------------------------------------------- TLS-Feinschliff
ssl_buffer_size 1400; # passt gut zu 1500-Byte-Ethernet-MTU
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off; # Session-Tickets aus: bessere Forward Secrecy
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off; # TLS 1.3 entscheidet der Client; aktueller Rat
ssl_stapling on;
ssl_stapling_verify on;
ssl_ecdh_curve X25519:P-384:P-256:P-521;
# OPTIMIERUNG 2: Lokalen Resolver (oder Quad9/Cloudflare) eintragen für besseren Datenschutz als Google
resolver 9.9.9.9 1.1.1.1 valid=300s;
resolver_timeout 5s;
client_max_body_size 0;
client_body_buffer_size 400M;
proxy_cookie_path / "/; HTTPOnly; Secure; SameSite=Lax";
# HIER STEHT DAS GEHEIMNIS: Durch das "always" am Ende erzwingen wir,
# dass Nginx diese Header global an ALLE untergeordneten Location-Blöcke vererbt.
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
# 1. Statische Dateien
location ^~ /browser {
proxy_pass https://127.0.0.1:9980;
proxy_set_header Host $http_host;
expires 30d;
add_header Cache-Control "public, no-transform";
proxy_hide_header Strict-Transport-Security;
proxy_hide_header X-Content-Type-Options;
}
# 2. WOPI discovery URL
location ^~ /hosting/discovery {
proxy_pass https://127.0.0.1:9980;
proxy_set_header Host $http_host;
proxy_hide_header Strict-Transport-Security;
proxy_hide_header X-Content-Type-Options;
}
# 3. Capabilities
location ^~ /hosting/capabilities {
proxy_pass https://127.0.0.1:9980;
proxy_set_header Host $http_host;
proxy_hide_header Strict-Transport-Security;
proxy_hide_header X-Content-Type-Options;
}
# 4. Admin Console websocket
location ^~ /cool/adminws {
proxy_pass https://127.0.0.1:9980;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 36000s;
proxy_hide_header Strict-Transport-Security;
proxy_hide_header X-Content-Type-Options;
}
# 5. Haupt-Websocket (Regex ohne Fehler-anfälliges Dollarzeichen am Ende)
location ~ ^/cool/(.*)/ws {
proxy_pass https://127.0.0.1:9980;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
proxy_buffering off;
proxy_hide_header Strict-Transport-Security;
proxy_hide_header X-Content-Type-Options;
}
# 6. Allgemeine Downloads, Präsentationen und Bilder
location ~ ^/(c|l)ool {
proxy_pass https://127.0.0.1:9980;
proxy_set_header Host $http_host;
proxy_hide_header Strict-Transport-Security;
proxy_hide_header X-Content-Type-Options;
}
}
Wer den jwilder/nginx-proxy (docker-gen) nutzt, aktiviert stattdessen die auskommentierten
VIRTUAL_*-Zeilen in der Compose-Datei. Wichtig: Der Container muss dann zusätzlich im Docker-Netz
proxy-ssl liegen (externes Netz), sonst findet der Proxy ihn nicht:
services:
collabora:
networks:
- proxy-ssl
networks:
proxy-ssl:
external: true
curl -k https://cbo.meine.domain/hosting/discovery liefert eine
XML-Antwort, wenn Collabora korrekt hinter dem Proxy erreichbar ist – genau diese Adresse prüft auch die
Nextcloud-App bei der Anbindung.
Anbindung an Nextcloud
- In Nextcloud die App „Nextcloud Office“ (früher „Collabora Online“) aus dem App-Store installieren und aktivieren.
- Unter Administration → Office die Server-URL eintragen:
https://cbo.meine.domain– ohne Pfad, ohne/hosting/discovery(die App ergänzt das selbst). - Der Discovery-Test im Admin-Bereich muss grün werden – dazu müssen DNS und Firewall die Verbindung Nextcloud ↔ Collabora erlauben.
- Wird eine zweite Nextcloud angebunden (
aliasgroup2), trägst du dort dieselbe Collabora-URL ein – die Freigabe regelt die Aliasgruppe im Container. - Test: Neue Text-/Tabellendatei in Nextcloud anlegen und öffnen – sie sollte direkt im Browser im Editor starten.
Betrieb: Updates & Grenzen
Collabora speichert keine Dokumente – ein Backup des Containers ist daher nicht nötig. Relevanter ist die
Pflege: Updates ziehst du per docker compose pull && docker compose up -d. Pinnst du die
Version (statt :latest), prüfe vorher die Release-Notizen – Collabora hat die Env-Namen im Laufe
der Versionen mehrfach umgebaut.
docker compose up -d --force-recreate). RAM im Blick behalten (Docker-Stats, Uptime Kuma).
Neue Nextcloud-Instanz → aliasgroupN in der .env ergänzen und Container neu starten.
Häufige Probleme (FAQ)
| Problem | Lösung |
|---|---|
| Dokumente lassen sich nicht öffnen | domain/aliasgroup prüfen: Sie müssen exakt die öffentliche Nextcloud-URL enthalten (inkl. Port, falls abweichend) – Escaping der Punkte nicht vergessen. |
| „Nextcloud kann Collabora nicht erreichen“ | /hosting/discovery per curl testen; DNS, Firewall und Proxy-Timeouts prüfen. |
| Sitzungen brechen nach kurzer Zeit ab | SSL-Terminierung korrekt setzen: ssl.termination=true in extra_params, Backend bleibt HTTP (kein VIRTUAL_PROTO=https). |
| Admin-Konsole zeigt „falsche Zugangsdaten“ | username/password prüfen und Container neu erstellen – Env-Änderungen greifen erst nach Recreate. |
| Zweite Nextcloud wird abgelehnt | aliasgroup2 mit exakter URL setzen und Compose neu starten; die URL darf sich nicht mit domain beißen. |
| Hoher Speicher-/RAM-Verbrauch | Normal für CODE (LibreOffice im Container) – Ressourcen beobachten und ggf. nur bei Bedarf laufen lassen. |
Fazit
Collabora Online macht aus Nextcloud eine echte Office-Umgebung, ohne dass deine Dokumente den eigenen
Server verlassen. Der Preis: ein großes, speicherhungriges Image und eine Konfiguration, die exakt sein
will – vor allem bei domain/aliasgroup und der SSL-Terminierung. Ist das einmal
gesetzt, läuft die Bearbeitung so selbstverständlich, dass man schnell vergisst, wie viel darunter steckt.
domain ist eine Regex – Punkte escapen.
② ssl.enable/ssl.termination nur über extra_params.
③ Jede angebundene Nextcloud braucht einen Eintrag in domain/aliasgroup.
④ Der Discovery-Test (/hosting/discovery) ist dein bester Freund bei der Fehlersuche.