Files
Aether/.env.example
T
marcandClaude Opus 5 7d45941c03 refactor(office): toten JWT-Schlüssel entfernen, Doku richtigstellen
Beim Löschen von convert.go ist Aethers einzige Verwendung des JWT-Schlüssels
mitgegangen: signJWT stand dort. Zurück blieb ein Feld auf dem Client, das
niemand liest, plus Config-Eintrag und Aufrufparameter – Go meldet ungenutzte
Strukturfelder nicht, deshalb lief der Build durch. Eine Einstellung, die
nichts mehr tut, ist schlimmer als keine: Wer sie setzt, glaubt, sie wirke.

OFFICE_JWT_SECRET bleibt in der .env, wird aber vom **Office-Container**
gelesen, nicht von Aether. Geprüft mit Euro-Office: JWT_ENABLED=true und
Aether ohne jedes Signieren – der WOPI-Weg läuft.

Doku richtiggestellt, nachdem Marc den Compose-Schnipsel angezweifelt hat:

- „Euro-Office ist hier nie gelaufen" stimmte nicht mehr. Jetzt steht da, was
  tatsächlich geprüft ist (Abbild, Start, Discovery, CheckFileInfo, Ausliefern,
  mobileEdit) und was nicht: PutFile, also das Zurückschreiben.
- Der Absatz zu /ConvertService.ashx beschrieb gelöschten Code.
- OFFICE_PUBLIC_URL: die Falle benannt, die einen Tag gekostet hat. Stand dort
  localhost, lief alles am Docker-Rechner und blieb am Telefon schwarz – dort
  ist localhost das Telefon. Ohne Fehlermeldung.
- Zur Portbindung: Die Office-Schnipsel binden auf 0.0.0.0, anders als Aether
  selbst. Das ist nötig, weil der Browser direkt hin muss – steht jetzt dabei,
  samt dem sauberen Weg über einen Reverse Proxy.

Geprüft: go build/vet sauber, alle 234 Prüfungen der sieben Selbsttest-Suiten
grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:10:17 +02:00

162 lines
9.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Aether – alle Einstellungen des Betriebs. cp .env.example .env
#
# Hier steht, was die ANWENDUNG liest. Nichts davon hängt daran, ob du das
# fertige Abbild ziehst (docker-compose.example.yml) oder selbst baust
# (build/docker-compose.yml) – zum Entwickeln: cp .env.example build/.env
#
# Was NICHT hier steht: die Schalter des mitgelieferten Collabora-Containers
# (aliasgroup1, ssl, Port). Die gehören zum Compose, das ihn startet, und
# stehen kommentiert in build/docker-compose.yml. Wer Office selbst betreibt,
# richtet sie in dessen eigener Compose-Datei ein.
#
# Zwei Fallen beim Bearbeiten:
# $ im Wert → als $$ schreiben, sonst schneidet Compose ab
# Kommentar hinter einem LEEREN Wert → der Kommentar wird zum Wert
# Erklärungen und Fallstricke: README.md, Abschnitt „Einstellungen"
# ══ Pflicht ═══════════════════════════════════════════════════════════════════
APP_ENV=production # development | production
# Adresse, unter der der BROWSER die Cloud sieht. Ohne Schrägstrich am Ende.
# Ein falscher Wert startet klaglos und fällt erst auf, wenn ein Freigabe-Link
# oder ein OIDC-Rücksprung ins Leere zeigt.
PUBLIC_URL=https://cloud.example.com
# openssl rand -hex 32
SESSION_SECRET=
# DB_HOST ist der Dienstname aus dem Compose, nicht localhost.
DB_HOST=postgres
DB_PORT=5432
DB_NAME=aether
DB_USER=aether
# 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.
DATA_PATH=/pfad/zu/aether-data
# `id -u` / `id -g` – sonst gehören die Dateien einem Container-Nutzer.
APP_UID=1000
APP_GID=1000
# ══ Erster Start ══════════════════════════════════════════════════════════════
# Legt den Admin an. Danach ADMIN_PASSWORD leeren – das Konto bleibt.
# Auch hier: ein $ muss $$ heißen (siehe DB_PASSWORD).
ADMIN_USERNAME=admin
ADMIN_PASSWORD=
# ══ Reverse Proxy ═════════════════════════════════════════════════════════════
# IPs/CIDRs der Proxys, denen X-Forwarded-For/-Proto geglaubt wird. Steht hier
# das Falsche, sieht die Anwendung überall die IP des Proxys – Rate-Limit und
# Audit-Log werden damit wertlos, ohne dass etwas nach Fehler aussieht.
TRUSTED_PROXIES=172.18.0.1
# Port auf dem Wirt. Im Container bleibt es 8080.
APP_PORT=8080
# Wer den Port erreichen darf.
# 0.0.0.0 alles, was den Server im Netz erreicht (Vorgabe)
# 127.0.0.1 nur dieser Rechner – richtig, wenn der Reverse Proxy hier läuft
# 10.0.0.5 eine bestimmte Adresse, etwa das Ende eines WireGuard-Tunnels
#
# Die Vorgabe ist 0.0.0.0, weil der Proxy typischerweise woanders steht und
# 127.0.0.1 ihn gar nicht erst herankommen ließe. Der Preis: Der Port ist auch
# aus dem eigenen Netz offen, und TLS endet erst am Proxy – bis dahin liegt die
# Anmeldung unverschlüsselt im Netz. Wer den Proxy auf demselben Rechner hat,
# setzt hier 127.0.0.1 und ist besser dran.
APP_BIND=0.0.0.0
APP_LISTEN_ADDR=:8080 # im Container; der Proxy leitet hierher
# ══ Sitzung ═══════════════════════════════════════════════════════════════════
# Wie lange eine Anmeldung gilt – **ab der letzten Benutzung**, nicht ab dem
# Anmelden. Wer die Cloud regelmäßig öffnet, bleibt angemeldet; wer sie so
# lange nicht anfasst, meldet sich neu an. 2592000 = 30 Tage.
#
# Kürzer ist sinnvoll, wenn mehrere Leute denselben Rechner benutzen. Alle
# Sitzungen sofort beenden: SESSION_SECRET wechseln und neu starten.
SESSION_MAX_AGE=2592000 # Sekunden
# ══ Speicher ══════════════════════════════════════════════════════════════════
STORAGE_PATH=/data # im Container
TMP_PATH=/data/tmp
# Frühere Fassungen je Datei. Greift nur bei eingeschaltetem „Keep versions".
MAX_VERSIONS_KEPT=5
# ══ Volltextsuche (OCR) ═══════════════════════════════════════════════════════
# Standardmäßig an. Fehlen die Programme im Abbild, schaltet sich der Arbeiter
# beim Start selbst ab, statt den Start zu verhindern.
OCR_ENABLED=true
# Sprachen für Tesseract. Jede zusätzliche kostet Zeit – nimm nur, was vorkommt.
OCR_LANGUAGES=deu+eng
# Seiten je Datei; 0 = unbegrenzt. Die Grenze ist Absicht: OCR ist das einzige
# Stück dieser Anwendung, das ohne Zutun eines Menschen Platz und Rechenzeit
# verbraucht. Wer regelmäßig lange Scans ablegt, setzt sie herauf.
OCR_MAX_PAGES=50
# Abbruch je Datei. Ein Scan, der so lange braucht, wird auch beim vierten
# Versuch nicht fertig.
OCR_TIMEOUT=10m
# ══ Anmeldung über einen Identitätsanbieter (optional) ════════════════════════
# Leerer OIDC_ISSUER = aus. Sonst die vollständige ADRESSE des Anbieters,
# z. B. https://id.example.com – nicht seinen Namen. Falsch gesetzt bricht der
# Start ab.
OIDC_ISSUER=
OIDC_CLIENT_ID=aether
OIDC_CLIENT_SECRET=
# Muss EXAKT <PUBLIC_URL>/api/v1/auth/oidc/callback sein.
OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback
# Bestehendes Konto gleichen Namens mit der Identität verbinden, statt ein
# zweites anzulegen. VOR der ersten Anmeldung setzen – danach ist es zu spät.
# Nur bei einem Anbieter, dem die Namen gehören: Bei freier Registrierung wäre
# es die Übernahme fremder Konten.
OIDC_LINK_BY_USERNAME=false
# Beschriftung des Knopfes auf der Anmeldeseite.
OIDC_BUTTON_LABEL=Sign in with SSO / OIDC
# ══ Office (optional) ═════════════════════════════════════════════════════════
# Leer = aus. Compose-Schnipsel, Adressen und Fallstricke: README.md.
# Bei Collabora muss OFFICE_WOPI_URL die öffentliche Adresse der Cloud sein,
# sonst verweigert der Browser den Rahmen.
OFFICE_PROVIDER=onlyoffice # collabora | onlyoffice (auch Euro-Office)
OFFICE_URL=http://office # Backend → Office (Collabora: :9980)
# Browser → Office. **Muss eine Adresse sein, die der Browser auflösen kann**
# – deine Domain oder die LAN-IP, niemals "localhost" und nie der interne
# Dienstname. Sonst lädt der Editor am Rechner mit Docker und bleibt auf jedem
# anderen Gerät schwarz, ohne Fehlermeldung. Leer = wie OFFICE_URL, und das
# ist fast immer falsch.
OFFICE_PUBLIC_URL=
OFFICE_WOPI_URL=http://app:8080 # Office → Aether
OFFICE_ALLOWED_HOSTS=office # gegen SSRF
# Nur für ein Office mit selbstsigniertem Zertifikat im eigenen Netz. Schaltet
# die Zertifikatsprüfung **ab** – im Internet nichts zu suchen.
OFFICE_INSECURE_TLS=false
# Liest **der Office-Container**, nicht Aether: Es schützt seine eigene API.
# Der WOPI-Weg braucht es nicht, der hat eigene Token. Bei OnlyOffice und
# Euro-Office mit JWT_ENABLED=true gehört es gesetzt, sonst steht deren API
# offen. Collabora kennt es nicht. openssl rand -hex 32
OFFICE_JWT_SECRET=
# ══ Volltextsuche (OCR) ═══════════════════════════════════════════════════════
# Standardmäßig an; fehlen ocrmypdf/tesseract, schaltet es sich selbst ab.
# OCR_ENABLED=false
# OCR_LANGUAGES=deu+eng # weitere brauchen ein apk-Paket im Dockerfile
# OCR_MAX_PAGES=50 # 0 = unbegrenzt; rund 1 Minute je Seite
# OCR_TIMEOUT=10m # Notbremse je Datei
# ══ HoneyOS-Leiste (optional) ═════════════════════════════════════════════════
# Ursprung, von dem die Leiste geladen wird. Wird an zwei Stellen gebraucht und
# kommt deshalb aus einer Quelle: die CSP erlaubt ihn (script-src +
# connect-src), und die Oberfläche lädt das Skript von dort nach.
# Wirkt beim **Neustart** – kein Neubau nötig.
# Leer = keine Leiste, und die CSP bleibt so eng wie ohne sie.
HONEYBAR_ORIGIN=
# ══ Später ════════════════════════════════════════════════════════════════════
# NOCH NICHT GEBAUT – Notiz, kein Schalter. Gesucht wird derzeit mit der
# Volltextsuche von Postgres; diese beiden Werte liest niemand.
# MEILISEARCH_URL=http://meilisearch:7700
# MEILISEARCH_KEY=
# ══ WebDAV ════════════════════════════════════════════════════════════════════
# Läuft unter /dav/, kein Schalter nötig. Der Proxy muss
# PROPFIND/MKCOL/MOVE/COPY durchreichen. Anmeldung ausschließlich mit
# App-Passwörtern, nie mit dem Kontopasswort.