# 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 /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.