docs(env): Beispieldateien kürzen, Erklärungen ins README

Die beiden .env.example zusammen waren 251 Zeilen für 40 Schlüssel – gut
gemeint, aber niemand liest einen Absatz pro Variable. Jetzt eine Zeile je
Schlüssel (58 + 89), die Begründungen stehen im README unter
'Einstellungen', gebündelt als die sieben Dinge, die nicht beim Start
auffallen, sondern später.

Dabei durch einen echten Start aus den Beispieldateien gefunden:
STORAGE_PATH fehlte, Vorgabe ./data wird im Container zu /app/data, und
der Start endete in 'mkdir /app/data: permission denied'. Das Abbild setzt
STORAGE_PATH und TMP_PATH jetzt selbst – es kennt seine Verzeichnisse
besser als eine Beispieldatei. Eine .env darf weiter überschreiben.

Geprüft: jeder Schlüssel, den die Anwendung liest, steht weiterhin in
deploy/.env.example; eine frische Instanz startet allein aus den beiden
Beispieldateien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 5 committed 2026-08-24 11:27:31 +02:00
1 parent 35ebf609b7
commit 428fd2672c
5 files changed
+195 -186

No files matched your search

+20 -53
View File
@@ -1,91 +1,58 @@
# Aether – das Nötigste für eine neue Umgebung.
#
# cp .env.example .env
#
# Vollständige Liste aller Schalter (OIDC, OCR, Thumbnails, Kontingente …):
# deploy/.env.example
# Aether – das Nötigste für eine neue Umgebung. cp .env.example .env
# Erklärungen: README.md, Abschnitt „Einstellungen"
# Alle Schalter: deploy/.env.example
# ── Pflicht ───────────────────────────────────────────────────────────────────
# Steuert nur die Form der Logausgabe: `development` schreibt sie farbig und
# mehrzeilig, `production` als JSON für deinen Logsammler.
APP_ENV=production
# Wie die Cloud von außen erreichbar ist. Wird für OIDC-Rücksprünge,
# WOPI-Rückrufe und Freigabe-Links benutzt – ein falscher Wert fällt erst
# dort auf, nicht beim Start.
# Adresse, unter der der Browser die Cloud sieht. Ohne Schrägstrich am Ende.
PUBLIC_URL=https://cloud.example.com
# openssl rand -hex 32
SESSION_SECRET=
# `postgres` ist der Dienstname aus dem Compose, nicht localhost – aus dem
# Container heraus ist localhost er selbst. Ohne diese Zeile greift die
# Voreinstellung `localhost`, und der Start endet in „migrations failed".
# DB_HOST ist der Dienstname aus dem Compose, nicht localhost.
DB_HOST=postgres
DB_PORT=5432
DB_NAME=aether
DB_USER=aether
# Jedes Zeichen ist erlaubt, auch % @ : / und Leerzeichen.
# Jedes Zeichen erlaubt, auch % @ : / und Leerzeichen.
DB_PASSWORD=
# Wohin die Dateien auf dem Wirt kommen. Ein gewöhnliches Verzeichnis, kein
# Docker-Volume – so kommst du per SFTP oder Dateimanager daran.
# Verzeichnis auf dem Wirt. Nur lesend anfassen – zum Hineinlegen: WebDAV.
DATA_PATH=/pfad/zu/aether-data
# `id -u` und `id -g`. Ohne das gehören die Dateien einem Container-Nutzer.
# `id -u` / `id -g` – sonst gehören die Dateien einem Container-Nutzer.
APP_UID=1000
APP_GID=1000
# ── Reverse Proxy ─────────────────────────────────────────────────────────────
# X-Forwarded-For/-Proto werden NUR von diesen Adressen geglaubt. Steht hier
# das Falsche, sieht die Anwendung überall die IP des Proxys – Rate-Limit und
# Audit-Log werden damit wertlos.
# Nur diesen Adressen wird X-Forwarded-For/-Proto geglaubt.
TRUSTED_PROXIES=172.18.0.1
# Port auf dem Wirt, gebunden auf loopback. Im Container bleibt es 8080.
# Port auf dem Wirt, auf loopback gebunden. Im Container bleibt es 8080.
APP_PORT=8080
# ── Erster Start ──────────────────────────────────────────────────────────────
# Legt beim allerersten Start den Admin an. Danach hier leeren – das Konto
# bleibt, das Passwort steht sonst dauerhaft in der Datei.
# Legt den Admin an. Danach ADMIN_PASSWORD leeren.
ADMIN_USERNAME=admin
ADMIN_PASSWORD=
# ── Anmeldung über einen Identitätsanbieter (optional) ───────────────────────
# Leerer OIDC_ISSUER = aus, dann nur Benutzername + Passwort.
# Die Rücksprung-Adresse muss exakt <PUBLIC_URL>/api/v1/auth/oidc/callback sein
# und beim Anbieter als erlaubte Redirect-URI eingetragen werden.
# Leerer OIDC_ISSUER = aus.
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 mit derselben Kennung verbinden, statt ein zweites
# anzulegen. **Vor der ersten Anmeldung setzen** – danach existiert das zweite
# Konto ("marc2", leer, ohne Adminrecht) schon, und das Verbinden kommt zu spät.
#
# Nur bei einem eigenen Anbieter (PocketID, Authentik), dessen Konten du selbst
# anlegst. Bei freier Registrierung wäre es die Übernahme fremder Konten.
# Bestehendes Konto verbinden statt ein zweites anzulegen.
# VOR der ersten Anmeldung setzen – danach ist es zu spät.
OIDC_LINK_BY_USERNAME=false
# ── Office (optional) ─────────────────────────────────────────────────────────
# Leer lassen = aus. Den passenden Container-Schnipsel (Collabora, OnlyOffice
# oder Euro-Office) findest du im README – er bringt seine eigenen Variablen
# mit. Hier steht nur, was Aether selbst wissen muss.
#
# Drei Adressen für drei Richtungen, und sie sind selten gleich:
# OFFICE_URL Backend → Office-Server
# OFFICE_PUBLIC_URL Browser → Office-Server
# OFFICE_WOPI_URL Office-Server → Aether (NICHT localhost – aus seinem
# Container heraus ist das er selbst)
# Leer = aus. Container-Schnipsel: README.md
OFFICE_PROVIDER=
# Backend → Office
OFFICE_URL=http://office:9980
# Browser → Office
OFFICE_PUBLIC_URL=https://office.example.com
# Office → Aether. NICHT localhost, NICHT der veröffentlichte Port.
OFFICE_WOPI_URL=http://app:8080
# Ziele, die das Backend anfragen darf – gegen SSRF. Nur der Office-Server.
# Gegen SSRF: was das Backend anfragen darf.
OFFICE_ALLOWED_HOSTS=office