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

+74
View File
@@ -119,6 +119,80 @@ Direkt (ohne Proxy): http://localhost:8080/health
---
## Einstellungen
Zwei Beispieldateien, je nach Zweck:
| | |
|---|---|
| `.env.example` (Wurzel) | das Nötigste zum Betreiben |
| `deploy/.env.example` | alle Schalter, auch die optionalen |
Beide sind knapp gehalten – was dahintersteckt, steht hier.
### Was schiefgeht, wenn man es falsch setzt
Diese sieben fallen **nicht** beim Start auf, sondern später und an
unerwarteter Stelle. Der Rest hat brauchbare Vorgaben.
**`DB_HOST=postgres`** – nicht `localhost`. Aus dem Container heraus ist
`localhost` er selbst; die Voreinstellung führt zu `migrations failed` beim
Start.
**`DB_PASSWORD`** darf jedes Zeichen enthalten, auch `% @ : /` und
Leerzeichen. Es gibt keine Liste erlaubter Zeichen – wer die erst nachschlagen
muss, wählt am Ende ein schwächeres Passwort.
**`PUBLIC_URL`** ist die 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.
**`TRUSTED_PROXIES`** entscheidet, wem `X-Forwarded-For` geglaubt wird. Steht
hier das Falsche, sieht die Anwendung überall die IP des Proxys – Rate-Limit
und Audit-Log werden damit wertlos, ohne dass irgendetwas nach Fehler aussieht.
**`ADMIN_PASSWORD`** legt beim allerersten Start den Admin an. Danach leeren:
Das Konto bleibt, das Passwort stünde sonst dauerhaft in einer Datei.
**`OIDC_LINK_BY_USERNAME`** verbindet ein bestehendes Konto mit derselben
Kennung, 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 Anbieter sinnvoll, dessen Konten du
selbst anlegst (PocketID, Authentik); bei freier Registrierung wäre es die
Übernahme fremder Konten. Verbunden wird ohnehin nur, was noch keine Bindung
hat.
**`DATA_PATH`** ist ein gewöhnliches Verzeichnis auf dem Wirt, kein
Docker-Volume – deshalb kommst du per SFTP, rsync oder im Dateimanager daran.
Nur lesend anfassen: Wer von Hand hineinschreibt, hat eine Datei, die die
Datenbank nicht kennt; die Cloud sieht sie nicht, und der GC räumt sie
irgendwann weg. Zum Hineinlegen ist WebDAV der Weg. Dazu `APP_UID`/`APP_GID`
aus `id -u` und `id -g`, sonst gehören die Dateien einem Container-Nutzer.
### Volltextsuche (OCR)
Standardmäßig an. Fehlen `ocrmypdf`/`tesseract` im Abbild, schaltet sich der
Arbeiter beim Start selbst ab und die Cloud läuft ohne Volltext weiter.
`OCR_MAX_PAGES=50` ist eine Bremse, keine Schikane: Erkennung kostet rund eine
Minute je gescannter Seite, und ohne Grenze blockiert ein dickes Handbuch die
Warteschlange für alles andere. `OCR_LANGUAGES` kennt `deu` und `eng`; weitere
brauchen ein zusätzliches `apk`-Paket im Dockerfile.
### Office
Die drei Adressen und ihre Fallstricke stehen weiter unten bei
[Office](#office-collabora--onlyoffice--euro-office) – dort, wo auch die
Container-Schnipsel liegen.
### WebDAV
Läuft unter `/dav/`, kein Schalter nötig. Dein Reverse Proxy muss
`PROPFIND`, `MKCOL`, `MOVE` und `COPY` durchreichen – viele Vorlagen erlauben
nur `GET`/`POST`, und dann scheitert das Einbinden mit einem `405`.
---
## Abbild bauen und veröffentlichen
```bash