From 16ab6f385b12de698203934a5e96d9691352bffc Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 24 Aug 2026 10:08:16 +0200 Subject: [PATCH] docs(office): OIDC ins schlanke Beispiel, Office-Server als Schnipsel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .env.example | 32 +++++++--- README.md | 128 ++++++++++++++++++++++++++++++++++--- docker-compose.example.yml | 29 ++------- 3 files changed, 145 insertions(+), 44 deletions(-) diff --git a/.env.example b/.env.example index 1c7b13d..00a39d7 100644 --- a/.env.example +++ b/.env.example @@ -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 /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 diff --git a/README.md b/README.md index 6ebc940..ba9ceaa 100644 --- a/README.md +++ b/README.md @@ -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. --- diff --git a/docker-compose.example.yml b/docker-compose.example.yml index decb66c..07f9320 100644 --- a/docker-compose.example.yml +++ b/docker-compose.example.yml @@ -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: