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_NAME=aether
DB_USER=aether
# Jedes Zeichen erlaubt, auch % @ : / und Leerzeichen.
# Ein $ im Wert wird von Docker Compose als Variable gelesen und schneidet
# 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.
# Jedes Zeichen erlaubt – nur ein $ muss $$ heißen oder der Wert in
# 'einfache Anführungszeichen'. Sonst schneidet Compose lautlos ab. (README)
DB_PASSWORD=
# Verzeichnis auf dem Wirt. Nur lesend anfassen – zum Hineinlegen: WebDAV.
@@ -38,7 +35,7 @@ APP_BIND=127.0.0.1
# ── Erster Start ──────────────────────────────────────────────────────────────
# 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_PASSWORD=
@@ -54,21 +51,19 @@ OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback
OIDC_LINK_BY_USERNAME=false
# ── Office (optional) ─────────────────────────────────────────────────────────
# Nur noetig, wenn du dem Office-Dienst selbst ein `profiles:` gegeben hast.
# Die Schnipsel im README haben keins und starten von allein.
# COMPOSE_PROFILES=office
# Leer = aus – auch wenn der Container laeuft. Schnipsel: README.md
# Leer = aus, auch wenn ein Office-Container läuft.
# Schnipsel für Collabora, OnlyOffice und Euro-Office: README.md
OFFICE_PROVIDER=
# Backend → Office. Der Port haengt vom Anbieter ab:
# Collabora http://office:9980
# OnlyOffice/Euro-Office http://office (lauschen auf 80)
# Backend → Office. Port je nach Anbieter:
# Collabora http://office:9980
# OnlyOffice/Euro-Office http://office
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 → Aether. NICHT localhost, NICHT der veröffentlichte Port.
# Office → Aether. Weder localhost noch der veröffentlichte Port.
OFFICE_WOPI_URL=http://app:8080
# Gegen SSRF: was das Backend anfragen darf.
OFFICE_ALLOWED_HOSTS=office
# Nur fuer OnlyOffice/Euro-Office: gemeinsames Geheimnis, mind. 32 Zeichen.
# openssl rand -hex 32 – Collabora braucht es nicht.
# Nur OnlyOffice/Euro-Office, mind. 32 Zeichen: openssl rand -hex 32
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_ALLOWED_HOSTS` | Ziele, die das Backend anfragen darf – gegen SSRF |
**Drei Adressen für drei Richtungen.** Das wirkt übertrieben, bis man es einmal
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.
**Drei Adressen für drei Richtungen** – die häufigste Fehlerquelle beim
Aufbau. Im Compose-Netz heißt der Server `office`, der Browser braucht dort
einen Namen, den *er* auflösen kann (deine Domain oder LAN-IP), und der
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
aufgebaut hat – die häufigste Fehlerquelle beim Aufbau.
Der Port unterscheidet sich je nach Anbieter: **Collabora lauscht auf 9980,
OnlyOffice und Euro-Office auf 80.**
Die Schnipsel unten starten **sofort** mit `docker compose up -d`. Das war
nicht immer so: Anfangs stand in jedem `profiles: ["office"]`, damit der
Container nur auf Wunsch läuft. Ein Dienst in einem Profil startet aber nur
mit `--profile office` – und in einer Oberfläche wie Portainer, Dockge oder
Komodo gibt es diesen Schalter nicht. Der Container entstand dort nie, ohne
eine einzige Fehlermeldung. Eine Voreinstellung, bei der das Einfügen des
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`.
Die Schnipsel unten starten sofort mit `docker compose up -d`. Zum Abschalten
`docker compose stop office`. Wer den Container lieber ganz aus der normalen
Startfolge nimmt, hängt `profiles: ["office"]` an den Dienst – dann braucht es
`--profile office` oder `COMPOSE_PROFILES=office` in der `.env`. **Vorsicht:**
Oberflächen wie Portainer, Dockge oder Komodo kennen `--profile` nicht; dort
entsteht der Container dann nie, ohne jede Fehlermeldung.
### Schnipsel 1: Collabora
@@ -611,6 +600,8 @@ Alles hier ist beim Testen tatsächlich passiert, in dieser Reihenfolge:
| 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. |
| 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. |
+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,
**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
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
- [ ] 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` 🔎
### 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
abgelehnt statt angefragt
- [ ] Sicherheitsrichtlinie nennt den Office-Ursprung unter `frame-src` 🔎
+9 -17
View File
@@ -17,11 +17,8 @@ DB_HOST=postgres
DB_PORT=5432
DB_NAME=aether
DB_USER=aether
# Jedes Zeichen erlaubt, auch % @ : / und Leerzeichen.
# Ein $ im Wert wird von Docker Compose als Variable gelesen und schneidet
# 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.
# Jedes Zeichen erlaubt – nur ein $ muss $$ heißen oder der Wert in
# 'einfache Anführungszeichen'. Sonst schneidet Compose lautlos ab. (README)
DB_PASSWORD=changeme_strong_password
# ── Sitzung ───────────────────────────────────────────────────────────────────
@@ -44,7 +41,7 @@ APP_BIND=127.0.0.1
# ── Erster Start ──────────────────────────────────────────────────────────────
# 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_PASSWORD=changeme_strong_admin_password
@@ -72,27 +69,22 @@ ADMIN_PASSWORD=changeme_strong_admin_password
EXTERNAL_APPS=
# ── Office (optional) ─────────────────────────────────────────────────────────
# Nur noetig, wenn du dem Office-Dienst selbst ein `profiles:` gegeben hast.
# Die Schnipsel im README haben keins und starten von allein.
# COMPOSE_PROFILES=office
# Leer = aus. Container-Schnipsel: README.md
# Leer = aus, auch wenn ein Office-Container läuft. Schnipsel: README.md
OFFICE_PROVIDER= # collabora | onlyoffice (auch Euro-Office)
# Der Port haengt vom Anbieter ab: Collabora 9980, OnlyOffice/Euro-Office 80.
OFFICE_URL= # Backend → Office
# Backend → Office. Collabora lauscht auf 9980, OnlyOffice/Euro-Office auf 80.
OFFICE_URL=
OFFICE_PUBLIC_URL= # Browser → Office; leer = wie OFFICE_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_ALLOWED_HOSTS= # gegen SSRF; Host aus OFFICE_URL zählt immer
# Nur fuer OnlyOffice/Euro-Office: gemeinsames Geheimnis, mind. 32 Zeichen.
# openssl rand -hex 32 – Collabora braucht es nicht.
OFFICE_JWT_SECRET=
OFFICE_JWT_SECRET= # nur OnlyOffice/Euro-Office, mind. 32 Zeichen
OFFICE_INSECURE_TLS=false # nur für Tests mit selbstsigniertem Zertifikat
# Nur für den Collabora-Container aus deploy/docker-compose.yml:
OFFICE_ALIASGROUP=http://app:8080
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
# ── Später ────────────────────────────────────────────────────────────────────
+5 -6
View File
@@ -56,12 +56,11 @@ services:
timeout: 5s
retries: 10
# Office – kostet rund 1 GB Arbeitsspeicher, deshalb hier im Profil:
# docker compose -f deploy/docker-compose.yml --profile office up -d
# Achtung: Oberflächen wie Portainer oder Dockge kennen `--profile` nicht.
# Dort entsteht der Container nie, ohne Fehlermeldung – für solche Fälle
# entweder COMPOSE_PROFILES=office in die .env oder die Zeile `profiles:`
# streichen. Die Schnipsel im README haben deshalb keine.
# Office – kostet rund 1 GB, deshalb hier im Profil (Entwicklerdatei, immer
# von der Kommandozeile): ... --profile office up -d
# Die Schnipsel im README haben bewusst kein Profil: Oberflächen wie
# Portainer oder Dockge kennen `--profile` nicht, dort entstünde der
# Container nie – ohne Fehlermeldung.
collabora:
container_name: aether-collabora
image: collabora/code:latest