docs: Doku nach fuenf Runden aufraeumen

Nach dem Hin und Her um Profile, Ports und Escaping war Sediment
liegengeblieben:

- README: "Drei Adressen fuer drei Richtungen" stand zweimal; die
  Profil-Erklaerung war eine Chronik ("das war nicht immer so") statt
  einer Anleitung. Jetzt ein Absatz.
- .env.example (beide): der Office-Block begann mit einem Hinweis auf
  COMPOSE_PROFILES, den man nur braucht, wenn man selbst ein Profil
  anlegt - als erste Zeile eines Abschnitts unbrauchbar. Raus.
- TESTING: der grosse Office-Abschnitt behauptete noch "Getestet mit
  Collabora im Compose-Profil office" und pruefte "ohne --profile startet
  der Container nicht". Beides ueberholt.
- Umlaute vereinheitlicht (laeuft neben gehoert), $-Hinweis von vier auf
  zwei Zeilen.

Dazu zwei neue Zeilen in der Fehlertabelle des README: Container entsteht
gar nicht (Profil) und Container laeuft, aber kein Menuepunkt (leerer
OFFICE_PROVIDER oder falscher Port).

Geprueft: beide Compose-Dateien gueltig, jeder Schluessel aus dem Code
steht in deploy/.env.example, keine doppelten Absaetze mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 5 committed 2026-08-24 12:27:19 +02:00
1 parent 9f5b003177
commit 7fc8bb51d5
5 files changed
+49 -67

No files matched your search

+12 -17
View File
@@ -14,11 +14,8 @@ DB_HOST=postgres
DB_PORT=5432 DB_PORT=5432
DB_NAME=aether DB_NAME=aether
DB_USER=aether DB_USER=aether
# Jedes Zeichen erlaubt, auch % @ : / und Leerzeichen. # Jedes Zeichen erlaubt – nur ein $ muss $$ heißen oder der Wert in
# Ein $ im Wert wird von Docker Compose als Variable gelesen und schneidet # 'einfache Anführungszeichen'. Sonst schneidet Compose lautlos ab. (README)
# lautlos ab: geheim$wort kommt als geheim an. Als $$ schreiben oder den
# ganzen Wert in 'einfache Anfuehrungszeichen' setzen. Ein \ hilft NICHT.
# Im Container steht danach EIN $ – so gehoert es, angemeldet wird mit einem.
DB_PASSWORD= DB_PASSWORD=
# Verzeichnis auf dem Wirt. Nur lesend anfassen – zum Hineinlegen: WebDAV. # Verzeichnis auf dem Wirt. Nur lesend anfassen – zum Hineinlegen: WebDAV.
@@ -38,7 +35,7 @@ APP_BIND=127.0.0.1
# ── Erster Start ────────────────────────────────────────────────────────────── # ── Erster Start ──────────────────────────────────────────────────────────────
# Legt den Admin an. Danach ADMIN_PASSWORD leeren. # Legt den Admin an. Danach ADMIN_PASSWORD leeren.
# Auch hier: ein $ muss $$ heissen (siehe DB_PASSWORD). # Auch hier: ein $ muss $$ heißen (siehe DB_PASSWORD).
ADMIN_USERNAME=admin ADMIN_USERNAME=admin
ADMIN_PASSWORD= ADMIN_PASSWORD=
@@ -54,21 +51,19 @@ OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback
OIDC_LINK_BY_USERNAME=false OIDC_LINK_BY_USERNAME=false
# ── Office (optional) ───────────────────────────────────────────────────────── # ── Office (optional) ─────────────────────────────────────────────────────────
# Nur noetig, wenn du dem Office-Dienst selbst ein `profiles:` gegeben hast. # Leer = aus, auch wenn ein Office-Container läuft.
# Die Schnipsel im README haben keins und starten von allein. # Schnipsel für Collabora, OnlyOffice und Euro-Office: README.md
# COMPOSE_PROFILES=office
# Leer = aus – auch wenn der Container laeuft. Schnipsel: README.md
OFFICE_PROVIDER= OFFICE_PROVIDER=
# Backend → Office. Der Port haengt vom Anbieter ab:
# Collabora http://office:9980 # Backend → Office. Port je nach Anbieter:
# OnlyOffice/Euro-Office http://office (lauschen auf 80) # Collabora http://office:9980
# OnlyOffice/Euro-Office http://office
OFFICE_URL=http://office:9980 OFFICE_URL=http://office:9980
# Browser → Office # Browser → Office. Deine Domain oder LAN-IP, nicht der Compose-Name.
OFFICE_PUBLIC_URL=https://office.example.com OFFICE_PUBLIC_URL=https://office.example.com
# Office → Aether. NICHT localhost, NICHT der veröffentlichte Port. # Office → Aether. Weder localhost noch der veröffentlichte Port.
OFFICE_WOPI_URL=http://app:8080 OFFICE_WOPI_URL=http://app:8080
# Gegen SSRF: was das Backend anfragen darf. # Gegen SSRF: was das Backend anfragen darf.
OFFICE_ALLOWED_HOSTS=office OFFICE_ALLOWED_HOSTS=office
# Nur fuer OnlyOffice/Euro-Office: gemeinsames Geheimnis, mind. 32 Zeichen. # Nur OnlyOffice/Euro-Office, mind. 32 Zeichen: openssl rand -hex 32
# openssl rand -hex 32 – Collabora braucht es nicht.
OFFICE_JWT_SECRET= OFFICE_JWT_SECRET=
+15 -24
View File
@@ -430,32 +430,21 @@ Schnipsel und häng ihn an dein `docker-compose.yml`.
| `OFFICE_WOPI_URL` | wo der **Office-Server** Aether erreicht (leer = `PUBLIC_URL`) | | `OFFICE_WOPI_URL` | wo der **Office-Server** Aether erreicht (leer = `PUBLIC_URL`) |
| `OFFICE_ALLOWED_HOSTS` | Ziele, die das Backend anfragen darf – gegen SSRF | | `OFFICE_ALLOWED_HOSTS` | Ziele, die das Backend anfragen darf – gegen SSRF |
**Drei Adressen für drei Richtungen.** Das wirkt übertrieben, bis man es einmal **Drei Adressen für drei Richtungen** – die häufigste Fehlerquelle beim
aufgebaut hat: Im Compose-Netz heißt der Office-Server `collabora`, im Browser Aufbau. Im Compose-Netz heißt der Server `office`, der Browser braucht dort
muss dort ein auflösbarer Name stehen, und der Office-Server wiederum erreicht einen Namen, den *er* auflösen kann (deine Domain oder LAN-IP), und der
Aether unter `app:8080` – „localhost" ist aus seinem Container heraus er selbst. Office-Server erreicht Aether unter `app:8080`: „localhost" ist aus seinem
Container heraus er selbst.
**Drei Adressen für drei Richtungen.** Das wirkt übertrieben, bis man es einmal Der Port unterscheidet sich je nach Anbieter: **Collabora lauscht auf 9980,
aufgebaut hat – die häufigste Fehlerquelle beim Aufbau. OnlyOffice und Euro-Office auf 80.**
Die Schnipsel unten starten **sofort** mit `docker compose up -d`. Das war Die Schnipsel unten starten sofort mit `docker compose up -d`. Zum Abschalten
nicht immer so: Anfangs stand in jedem `profiles: ["office"]`, damit der `docker compose stop office`. Wer den Container lieber ganz aus der normalen
Container nur auf Wunsch läuft. Ein Dienst in einem Profil startet aber nur Startfolge nimmt, hängt `profiles: ["office"]` an den Dienst – dann braucht es
mit `--profile office` – und in einer Oberfläche wie Portainer, Dockge oder `--profile office` oder `COMPOSE_PROFILES=office` in der `.env`. **Vorsicht:**
Komodo gibt es diesen Schalter nicht. Der Container entstand dort nie, ohne Oberflächen wie Portainer, Dockge oder Komodo kennen `--profile` nicht; dort
eine einzige Fehlermeldung. Eine Voreinstellung, bei der das Einfügen des entsteht der Container dann nie, ohne jede Fehlermeldung.
Schnipsels nichts bewirkt, ist die falsche.
Wer ihn dennoch wahlweise an- und ausschalten will, hängt die Zeile selbst an
den Dienst:
```yaml
profiles: ["office"]
```
Dann startet er nur mit `docker compose --profile office up -d` – oder mit
`COMPOSE_PROFILES=office` in der `.env`, was auch ohne Kommandozeile wirkt
(gemessen). Zum Ausschalten reicht sonst `docker compose stop office`.
### Schnipsel 1: Collabora ### Schnipsel 1: Collabora
@@ -611,6 +600,8 @@ Alles hier ist beim Testen tatsächlich passiert, in dieser Reihenfolge:
| Symptom | Ursache | | Symptom | Ursache |
|---|---| |---|---|
| Der Container entsteht gar nicht, ohne Fehlermeldung | Ein `profiles:` am Dienst. Startet nur mit `--profile office`, und Oberflächen wie Portainer kennen den Schalter nicht. Die Schnipsel oben haben deshalb keins. |
| Container läuft, aber kein „Edit in Office…" im Menü | `OFFICE_PROVIDER` ist leer – oder `OFFICE_URL` nennt den falschen Port (Collabora 9980, OnlyOffice/Euro-Office 80). Ohne Antwort auf `/hosting/discovery` bleibt der Punkt weg. |
| Rahmen bleibt leer, Konsole: *„Framing … violates default-src 'self'"* | Unsere eigene Sicherheitsrichtlinie. `frame-src` fällt auf `default-src` zurück; der Office-Ursprung muss ausdrücklich erlaubt sein. Passiert automatisch, sobald `OFFICE_PROVIDER` gesetzt ist. | | Rahmen bleibt leer, Konsole: *„Framing … violates default-src 'self'"* | Unsere eigene Sicherheitsrichtlinie. `frame-src` fällt auf `default-src` zurück; der Office-Ursprung muss ausdrücklich erlaubt sein. Passiert automatisch, sobald `OFFICE_PROVIDER` gesetzt ist. |
| Editor lädt, Dokument bleibt weiß | `ssl.termination=true` ohne HTTPS davor. Collabora sagt dem Browser dann `wss://`, das es nicht gibt. Im HTTP-Test `OFFICE_SSL_TERMINATION=false`. | | Editor lädt, Dokument bleibt weiß | `ssl.termination=true` ohne HTTPS davor. Collabora sagt dem Browser dann `wss://`, das es nicht gibt. Im HTTP-Test `OFFICE_SSL_TERMINATION=false`. |
| Log: *„CheckFileInfo returned 0 … ECONNREFUSED"* | `OFFICE_WOPI_URL` zeigt auf `127.0.0.1:8090`. Der Port ist auf loopback gebunden – aus einem Container nicht erreichbar. Im Compose den Dienstnamen nehmen. | | Log: *„CheckFileInfo returned 0 … ECONNREFUSED"* | `OFFICE_WOPI_URL` zeigt auf `127.0.0.1:8090`. Der Port ist auf loopback gebunden – aus einem Container nicht erreichbar. Im Compose den Dienstnamen nehmen. |
+8 -3
View File
@@ -950,10 +950,11 @@ Die Daten liegen seit dem 23.08.2026 in einem gewöhnlichen Verzeichnis
- [ ] Beim Umzug: Prüfsummen von Volume und Zielverzeichnis stimmen überein, - [ ] Beim Umzug: Prüfsummen von Volume und Zielverzeichnis stimmen überein,
**bevor** umgeschaltet wird 🔎 **bevor** umgeschaltet wird 🔎
## Office – Collabora / OnlyOffice (24.08.2026) ## Office – Collabora / OnlyOffice / Euro-Office (24.08.2026)
Aether ist WOPI-Host; der Office-Server holt die Datei selbst ab und schreibt Aether ist WOPI-Host; der Office-Server holt die Datei selbst ab und schreibt
sie zurück. Getestet mit Collabora im Compose-Profil `office`. sie zurück. **Gemessen wurde mit Collabora**; OnlyOffice und Euro-Office
sprechen dieselbe Schnittstelle, sind hier aber nie gelaufen (Arbeitsspeicher).
### Öffnen ### Öffnen
- [ ] Rechtsklick auf .odt/.docx/.ods → „Edit in Office…" erscheint 🔎 - [ ] Rechtsklick auf .odt/.docx/.ods → „Edit in Office…" erscheint 🔎
@@ -979,7 +980,11 @@ sie zurück. Getestet mit Collabora im Compose-Profil `office`.
- [ ] `/wopi/files/<id>` ohne Token → `401` 🔎 - [ ] `/wopi/files/<id>` ohne Token → `401` 🔎
### Aufbau ### Aufbau
- [ ] Ohne `--profile office` startet der Container nicht 🔎 - [ ] Schnipsel aus dem README anhängen, `docker compose up -d` → der
Container entsteht (die Schnipsel haben **kein** Profil, siehe unten) 🔎
- [ ] `OFFICE_PROVIDER` leer → kein Menüpunkt, auch wenn der Container läuft
- [ ] Falscher Port in `OFFICE_URL` (9980 statt 80 bei Euro-Office) → die
Ermittlung findet nichts, der Menüpunkt bleibt weg
- [ ] `OFFICE_ALLOWED_HOSTS` greift: eine fremde Adresse in `OFFICE_URL` wird - [ ] `OFFICE_ALLOWED_HOSTS` greift: eine fremde Adresse in `OFFICE_URL` wird
abgelehnt statt angefragt abgelehnt statt angefragt
- [ ] Sicherheitsrichtlinie nennt den Office-Ursprung unter `frame-src` 🔎 - [ ] Sicherheitsrichtlinie nennt den Office-Ursprung unter `frame-src` 🔎
+9 -17
View File
@@ -17,11 +17,8 @@ DB_HOST=postgres
DB_PORT=5432 DB_PORT=5432
DB_NAME=aether DB_NAME=aether
DB_USER=aether DB_USER=aether
# Jedes Zeichen erlaubt, auch % @ : / und Leerzeichen. # Jedes Zeichen erlaubt – nur ein $ muss $$ heißen oder der Wert in
# Ein $ im Wert wird von Docker Compose als Variable gelesen und schneidet # 'einfache Anführungszeichen'. Sonst schneidet Compose lautlos ab. (README)
# lautlos ab: geheim$wort kommt als geheim an. Als $$ schreiben oder den
# ganzen Wert in 'einfache Anfuehrungszeichen' setzen. Ein \ hilft NICHT.
# Im Container steht danach EIN $ – so gehoert es, angemeldet wird mit einem.
DB_PASSWORD=changeme_strong_password DB_PASSWORD=changeme_strong_password
# ── Sitzung ─────────────────────────────────────────────────────────────────── # ── Sitzung ───────────────────────────────────────────────────────────────────
@@ -44,7 +41,7 @@ APP_BIND=127.0.0.1
# ── Erster Start ────────────────────────────────────────────────────────────── # ── Erster Start ──────────────────────────────────────────────────────────────
# Legt den Admin an. Danach ADMIN_PASSWORD leeren. # Legt den Admin an. Danach ADMIN_PASSWORD leeren.
# Auch hier: ein $ muss $$ heissen (siehe DB_PASSWORD). # Auch hier: ein $ muss $$ heißen (siehe DB_PASSWORD).
ADMIN_USERNAME=admin ADMIN_USERNAME=admin
ADMIN_PASSWORD=changeme_strong_admin_password ADMIN_PASSWORD=changeme_strong_admin_password
@@ -72,27 +69,22 @@ ADMIN_PASSWORD=changeme_strong_admin_password
EXTERNAL_APPS= EXTERNAL_APPS=
# ── Office (optional) ───────────────────────────────────────────────────────── # ── Office (optional) ─────────────────────────────────────────────────────────
# Nur noetig, wenn du dem Office-Dienst selbst ein `profiles:` gegeben hast. # Leer = aus, auch wenn ein Office-Container läuft. Schnipsel: README.md
# Die Schnipsel im README haben keins und starten von allein.
# COMPOSE_PROFILES=office
# Leer = aus. Container-Schnipsel: README.md
OFFICE_PROVIDER= # collabora | onlyoffice (auch Euro-Office) OFFICE_PROVIDER= # collabora | onlyoffice (auch Euro-Office)
# Der Port haengt vom Anbieter ab: Collabora 9980, OnlyOffice/Euro-Office 80. # Backend → Office. Collabora lauscht auf 9980, OnlyOffice/Euro-Office auf 80.
OFFICE_URL= # Backend → Office OFFICE_URL=
OFFICE_PUBLIC_URL= # Browser → Office; leer = wie OFFICE_URL OFFICE_PUBLIC_URL= # Browser → Office; leer = wie OFFICE_URL
# Office → Aether; leer = PUBLIC_URL. # Office → Aether; leer = PUBLIC_URL.
# NICHT localhost, NICHT der veröffentlichte Port – beides scheitert. # Weder localhost noch der veröffentlichte Port – beides scheitert.
OFFICE_WOPI_URL= OFFICE_WOPI_URL=
OFFICE_ALLOWED_HOSTS= # gegen SSRF; Host aus OFFICE_URL zählt immer OFFICE_ALLOWED_HOSTS= # gegen SSRF; Host aus OFFICE_URL zählt immer
# Nur fuer OnlyOffice/Euro-Office: gemeinsames Geheimnis, mind. 32 Zeichen. OFFICE_JWT_SECRET= # nur OnlyOffice/Euro-Office, mind. 32 Zeichen
# openssl rand -hex 32 – Collabora braucht es nicht.
OFFICE_JWT_SECRET=
OFFICE_INSECURE_TLS=false # nur für Tests mit selbstsigniertem Zertifikat OFFICE_INSECURE_TLS=false # nur für Tests mit selbstsigniertem Zertifikat
# Nur für den Collabora-Container aus deploy/docker-compose.yml: # Nur für den Collabora-Container aus deploy/docker-compose.yml:
OFFICE_ALIASGROUP=http://app:8080 OFFICE_ALIASGROUP=http://app:8080
OFFICE_SSL=false OFFICE_SSL=false
OFFICE_SSL_TERMINATION=false # produktiv true; false ohne HTTPS davor OFFICE_SSL_TERMINATION=false # true nur, wenn davor wirklich HTTPS endet
OFFICE_PORT=9980 OFFICE_PORT=9980
# ── Später ──────────────────────────────────────────────────────────────────── # ── Später ────────────────────────────────────────────────────────────────────
+5 -6
View File
@@ -56,12 +56,11 @@ services:
timeout: 5s timeout: 5s
retries: 10 retries: 10
# Office – kostet rund 1 GB Arbeitsspeicher, deshalb hier im Profil: # Office – kostet rund 1 GB, deshalb hier im Profil (Entwicklerdatei, immer
# docker compose -f deploy/docker-compose.yml --profile office up -d # von der Kommandozeile): ... --profile office up -d
# Achtung: Oberflächen wie Portainer oder Dockge kennen `--profile` nicht. # Die Schnipsel im README haben bewusst kein Profil: Oberflächen wie
# Dort entsteht der Container nie, ohne Fehlermeldung – für solche Fälle # Portainer oder Dockge kennen `--profile` nicht, dort entstünde der
# entweder COMPOSE_PROFILES=office in die .env oder die Zeile `profiles:` # Container nie – ohne Fehlermeldung.
# streichen. Die Schnipsel im README haben deshalb keine.
collabora: collabora:
container_name: aether-collabora container_name: aether-collabora
image: collabora/code:latest image: collabora/code:latest