diff --git a/.env.example b/.env.example index 9a533ba..7ab6a39 100644 --- a/.env.example +++ b/.env.example @@ -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= diff --git a/README.md b/README.md index 17f702f..6523164 100644 --- a/README.md +++ b/README.md @@ -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. | diff --git a/TESTING.md b/TESTING.md index 0d3d6d8..8f05788 100644 --- a/TESTING.md +++ b/TESTING.md @@ -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/` 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` 🔎 diff --git a/deploy/.env.example b/deploy/.env.example index 83cc67f..4f24a42 100644 --- a/deploy/.env.example +++ b/deploy/.env.example @@ -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 ──────────────────────────────────────────────────────────────────── diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 420fb8d..8bc1dc7 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -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