docs(office): OIDC ins schlanke Beispiel, Office-Server als Schnipsel

Das Wurzel-Beispiel enthielt keinen einzigen OIDC-Schlüssel – wer sich
über PocketID anmelden will, fand nirgends, wohin damit. Jetzt drin,
samt der Warnung zu OIDC_LINK_BY_USERNAME: vor der ersten Anmeldung
setzen, danach existiert das zweite Konto schon.

Der Office-Container ist aus dem Beispiel raus. Es gibt drei zur Auswahl,
jeder bringt eigene Variablen mit, und man will genau einen – sie stehen
jetzt als anhängbare Schnipsel im README (Collabora, OnlyOffice,
Euro-Office). Alle drei gegen das Beispiel geprüft: docker compose config
läuft durch.

Euro-Office (seit 09.06.2026, in Nextcloud Hub 26) ist ein
OnlyOffice-Fork und läuft über denselben Adapter – OFFICE_PROVIDER
bleibt onlyoffice, nur ein anderes Abbild.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 5 committed 2026-08-24 10:08:16 +02:00
1 parent 13681958dd
commit 16ab6f385b
3 files changed
+145 -44

No files matched your search

+23 -9
View File
@@ -44,8 +44,27 @@ APP_PORT=8080
ADMIN_USERNAME=admin
ADMIN_PASSWORD=
# ── Anmeldung über einen Identitätsanbieter (optional) ───────────────────────
# Leerer OIDC_ISSUER = aus, dann nur Benutzername + Passwort.
# Die Rücksprung-Adresse muss exakt <PUBLIC_URL>/api/v1/auth/oidc/callback sein
# und beim Anbieter als erlaubte Redirect-URI eingetragen werden.
OIDC_ISSUER=
OIDC_CLIENT_ID=aether
OIDC_CLIENT_SECRET=
OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback
# Bestehendes Konto mit derselben Kennung verbinden, statt ein zweites
# anzulegen. **Vor der ersten Anmeldung setzen** – danach existiert das zweite
# Konto ("marc2", leer, ohne Adminrecht) schon, und das Verbinden kommt zu spät.
#
# Nur bei einem eigenen Anbieter (PocketID, Authentik), dessen Konten du selbst
# anlegst. Bei freier Registrierung wäre es die Übernahme fremder Konten.
OIDC_LINK_BY_USERNAME=false
# ── Office (optional) ─────────────────────────────────────────────────────────
# Leer lassen = aus. Sonst `docker compose --profile office up -d`.
# Leer lassen = aus. Den passenden Container-Schnipsel (Collabora, OnlyOffice
# oder Euro-Office) findest du im README – er bringt seine eigenen Variablen
# mit. Hier steht nur, was Aether selbst wissen muss.
#
# Drei Adressen für drei Richtungen, und sie sind selten gleich:
# OFFICE_URL Backend → Office-Server
@@ -53,14 +72,9 @@ ADMIN_PASSWORD=
# OFFICE_WOPI_URL Office-Server → Aether (NICHT localhost – aus seinem
# Container heraus ist das er selbst)
OFFICE_PROVIDER=
OFFICE_URL=http://collabora:9980
OFFICE_URL=http://office:9980
OFFICE_PUBLIC_URL=https://office.example.com
OFFICE_WOPI_URL=http://app:8080
# Ziele, die das Backend anfragen darf – gegen SSRF.
OFFICE_ALLOWED_HOSTS=collabora
OFFICE_ALIASGROUP=http://app:8080
# Hinter deinem Reverse Proxy mit HTTPS: beide auf true.
OFFICE_SSL=false
OFFICE_SSL_TERMINATION=true
OFFICE_PORT=9980
# Ziele, die das Backend anfragen darf – gegen SSRF. Nur der Office-Server.
OFFICE_ALLOWED_HOSTS=office
+118 -10
View File
@@ -298,18 +298,22 @@ hunderte pro Minute.
---
## Office (Collabora / OnlyOffice)
## Office (Collabora / OnlyOffice / Euro-Office)
Aether ist **WOPI-Host**. Das ist die Schnittstelle, über die Office-Server
sich eine Datei holen und wieder zurückschreiben – **Collabora und OnlyOffice
sprechen beide dieselbe.** Deshalb wird hier *ein* Adapter gebaut und der
Anbieter per `.env` umgeschaltet, statt zweimal dasselbe zu integrieren.
sich eine Datei holen und wieder zurückschreiben – **alle drei sprechen
dieselbe.** Deshalb gibt es *einen* Adapter und einen Schalter in der `.env`,
statt derselben Sache dreimal.
Im Compose-Beispiel ist deshalb **kein** Office-Server enthalten: Jeder bringt
eigene Variablen mit, und man will genau einen. Such dir unten den passenden
Schnipsel und häng ihn an dein `docker-compose.yml`.
### Was dazukommt
| | |
|---|---|
| `OFFICE_PROVIDER` | `collabora`, `onlyoffice` oder leer (aus) |
| `OFFICE_PROVIDER` | `collabora`, `onlyoffice` oder leer (aus) – Euro-Office zählt als `onlyoffice` |
| `OFFICE_URL` | wo das **Backend** den Office-Server erreicht |
| `OFFICE_PUBLIC_URL` | wo der **Browser** ihn erreicht (leer = wie oben) |
| `OFFICE_WOPI_URL` | wo der **Office-Server** Aether erreicht (leer = `PUBLIC_URL`) |
@@ -320,13 +324,110 @@ aufgebaut hat: Im Compose-Netz heißt der Office-Server `collabora`, im Browser
muss dort ein auflösbarer Name stehen, und der Office-Server wiederum erreicht
Aether unter `app:8080` – „localhost" ist aus seinem Container heraus er selbst.
Der Container startet nur mit dem Profil, sonst kostet er Arbeitsspeicher, ohne
gebraucht zu werden:
**Drei Adressen für drei Richtungen.** Das wirkt übertrieben, bis man es einmal
aufgebaut hat – die häufigste Fehlerquelle beim Aufbau.
Alle Schnipsel unten legen den Dienst ins Profil `office`. Ohne das Profil
startet er nicht, und wer kein Office will, gibt kein Gigabyte dafür ab:
```bash
docker compose --profile office up -d
```
### Schnipsel 1: Collabora
```yaml
office:
container_name: aether-office
image: collabora/code:latest
profiles: ["office"]
restart: unless-stopped
environment:
# Wer seine Dateien hier öffnen darf. Punkte maskieren – Collabora liest
# den Wert als regulären Ausdruck.
aliasgroup1: http://app:8080
# ssl.enable – spricht Collabora selbst HTTPS?
# ssl.termination – endet HTTPS davor, an deinem Reverse Proxy?
# Steht termination auf true ohne HTTPS davor, verlangt Collabora eine
# wss://-Verbindung, die es nicht gibt: Der Editor lädt, das Dokument
# bleibt weiß. mount_jail_tree=false spart CAP_SYS_ADMIN.
extra_params: >-
--o:ssl.enable=false
--o:ssl.termination=true
--o:mount_jail_tree=false
dictionaries: de_DE en_US
cap_add: [MKNOD]
networks: [internal]
ports:
- "127.0.0.1:9980:9980"
```
```env
OFFICE_PROVIDER=collabora
OFFICE_URL=http://office:9980
OFFICE_PUBLIC_URL=https://office.example.com
OFFICE_WOPI_URL=http://app:8080
OFFICE_ALLOWED_HOSTS=office
```
### Schnipsel 2: OnlyOffice Docs
```yaml
office:
container_name: aether-office
image: onlyoffice/documentserver:latest
profiles: ["office"]
restart: unless-stopped
environment:
WOPI_ENABLED: "true" # ohne das gibt es kein /hosting/discovery
JWT_ENABLED: "true"
JWT_SECRET: ${OFFICE_JWT_SECRET}
networks: [internal]
ports:
- "127.0.0.1:9980:80" # OnlyOffice lauscht auf 80, nicht auf 9980
```
```env
OFFICE_PROVIDER=onlyoffice
OFFICE_URL=http://office
OFFICE_PUBLIC_URL=https://office.example.com
OFFICE_WOPI_URL=http://app:8080
OFFICE_ALLOWED_HOSTS=office
OFFICE_JWT_SECRET= # mindestens 32 Zeichen
```
### Schnipsel 3: Euro-Office
Seit dem 9. Juni 2026 zu haben und in Nextcloud Hub 26 die Alternative zu
Collabora. Es ist ein OnlyOffice-Fork, und man sieht es an den Variablen: Sie
heißen gleich. Für uns ist es deshalb **derselbe Anbieter** –
`OFFICE_PROVIDER=onlyoffice`, nur ein anderes Abbild.
```yaml
office:
container_name: aether-office
image: ghcr.io/euro-office/documentserver:latest
profiles: ["office"]
restart: unless-stopped
environment:
WOPI_ENABLED: "true"
JWT_ENABLED: "true"
JWT_SECRET: ${OFFICE_JWT_SECRET}
EXAMPLE_ENABLED: "false" # die Beispiel-App gehört nicht ins Netz
ALLOW_PRIVATE_IP_ADDRESS: "true" # es muss app:8080 erreichen
networks: [internal]
ports:
- "127.0.0.1:9980:80"
```
Die `.env` ist dieselbe wie bei OnlyOffice. Rechne mit **5 GB** allein für das
Abbild.
> **Ungeprüft.** Collabora ist hier gemessen worden, den Kreis von Tippen bis
> Speichern eingeschlossen. Die beiden anderen Schnipsel stehen nach ihrer
> Dokumentation und dem gemeinsamen WOPI-Weg, sind auf dieser Anlage aber nie
> gelaufen – für OnlyOffice fehlt schlicht der Arbeitsspeicher.
### Welche Dateien, und wie gut
Bearbeitet wird nur, was auf der **Positivliste** steht:
@@ -401,6 +502,7 @@ Der Office-Server ist der mit Abstand hungrigste Teil dieser Anlage:
|---|---|---|
| **Collabora (CODE)** | ~1 GB im Leerlauf, +100–200 MB je offenem Dokument | LibreOffice-Kern, startet pro Dokument einen Prozess |
| **OnlyOffice Docs** | 2 GB Minimum, **4 GB empfohlen**, dazu Swap | bringt eigenes Postgres, RabbitMQ und Node mit |
| **Euro-Office** | wie OnlyOffice, Abbild rund 5 GB | derselbe Unterbau |
Dazu kommt, was schon läuft: Postgres, Aether und – nicht unterschätzen – die
**Texterkennung**. ocrmypdf und ghostscript nehmen sich bei einem großen Scan
@@ -412,9 +514,15 @@ kurzzeitig mehrere hundert Megabyte.
LibreOffice-Kern, europäisch, deutlich genügsamer.
- **OnlyOffice**, wenn `.docx`/`.xlsx` zwischen Desktop-Office und Web hin und
her wandern. Beste Treue bei OOXML, weil es nativ damit arbeitet.
- **EuroOffice** ist ein junger OnlyOffice-Fork und nutzt **denselben
WOPI-Weg**. Eine Entscheidung für OnlyOffice heute verbaut ihn nicht: Es wäre
ein Wechsel des Containers und eine Zeile in der `.env`.
- **Euro-Office**, wenn du OnlyOffices Treue willst, aber nicht seine Herkunft.
Seit Juni 2026 zu haben, von Nextcloud als Standard eingesetzt, derselbe
WOPI-Weg. Der Haken ist derselbe wie bei OnlyOffice: Hunger nach
Arbeitsspeicher, und das Abbild wiegt rund 5 GB.
**Auf deinen 6 GB ist die Rechnung schnell gemacht.** Postgres, Aether und die
Texterkennung liegen schon darauf; für OnlyOffice oder Euro-Office bliebe zu
wenig. Collabora ist dort die einzige, die trägt – und ein Wechsel später
kostet einen Container und eine Zeile `.env`, nicht mehr.
---
+4 -25
View File
@@ -8,6 +8,10 @@
# docker login gitea.honeyy.duckdns.org
# docker compose up -d
#
# Office ist bewusst nicht dabei: Es gibt drei Server zur Auswahl (Collabora,
# OnlyOffice, Euro-Office), und jeder bringt eigene Variablen mit. Den
# passenden Schnipsel zum Anhängen findest du im README.
#
# Hintergrund und Fallstricke: README.md
# Aus dem Quelltext bauen statt ziehen: deploy/docker-compose.yml
@@ -54,31 +58,6 @@ services:
timeout: 5s
retries: 10
# Office – startet nur mit `docker compose --profile office up -d`.
# Kostet rund 1 GB Arbeitsspeicher; ohne Profil bleibt er aus.
# Die drei Adressen (OFFICE_URL / _PUBLIC_URL / _WOPI_URL) erklärt das README.
collabora:
container_name: aether-collabora
image: collabora/code:latest
profiles: ["office"]
restart: unless-stopped
environment:
aliasgroup1: ${OFFICE_ALIASGROUP:-http://app:8080}
# ssl.termination=true nur, wenn davor wirklich HTTPS endet – sonst
# verlangt Collabora eine wss://-Verbindung, die es nicht gibt, und der
# Editor bleibt leer. mount_jail_tree=false spart CAP_SYS_ADMIN.
extra_params: >-
--o:ssl.enable=${OFFICE_SSL:-false}
--o:ssl.termination=${OFFICE_SSL_TERMINATION:-false}
--o:mount_jail_tree=false
dictionaries: de_DE en_US
cap_add: [MKNOD]
extra_hosts:
- "host.docker.internal:host-gateway"
networks: [internal]
ports:
- "127.0.0.1:${OFFICE_PORT:-9980}:9980"
volumes:
postgres_data: