feat(oidc): OIDC_BUTTON_LABEL, und vier kaputte Zeilen in .env.example

Der Knopf hiess fest "Sign in with SSO / OIDC". Der Anbieter heisst bei
jedem anders; "Anmelden mit PocketID" sagt dem, der davorsteht, mehr.
Vorgabe unveraendert. Der Wert geht nur ueber /public/config, wenn OIDC
ueberhaupt an ist.

Beim Testen dabei selbst einen Fehler gebaut und eingefangen: Ein
Kommentar hinter einem LEEREN Wert wird in einer .env zum Wert.
OIDC_ISSUER= # z. B. https://... startete den OIDC-Aufbau mit dem
Kommentartext als Adresse, und der Start brach ab.

In deploy/.env.example steckten vier weitere solche Zeilen, darunter
OFFICE_PROVIDER= # collabora | onlyoffice - Office waere mit Unsinn als
Anbieter eingeschaltet worden. Alle umgestellt, Warnung an den Dateikopf.

Dazu im README belegt, was beim Ausschalten der Versionierung passiert:
Fassungen bleiben, auch im Papierkorb; erst das Leeren entfernt sie samt
Blobs, und zwar sofort statt erst beim GC.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 5 committed 2026-08-24 13:08:31 +02:00
1 parent 617c665a2e
commit 3019e84681
8 files changed
+126 -8

No files matched your search

+13 -3
View File
@@ -1,4 +1,8 @@
# Aether – das Nötigste für eine neue Umgebung. cp .env.example .env
#
# Zwei Fallen beim Bearbeiten:
# $ im Wert → als $$ schreiben, sonst schneidet Compose ab
# Kommentar hinter einem LEEREN Wert → der Kommentar wird zum Wert
# Erklärungen: README.md, Abschnitt „Einstellungen"
# Alle Schalter: deploy/.env.example
@@ -44,9 +48,13 @@ ADMIN_USERNAME=admin
ADMIN_PASSWORD=
# ── Anmeldung über einen Identitätsanbieter (optional) ───────────────────────
# Leerer OIDC_ISSUER = aus. Sonst die vollständige Adresse des Anbieters –
# nicht seinen Namen. Falsch gesetzt bricht der Start ab.
OIDC_ISSUER= # z. B. https://id.example.com
# 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.
#
# Kommentar NIE hinter einen leeren Wert setzen: `OIDC_ISSUER= # text` macht
# den Text zum Wert. Hinter einem gefüllten Wert ist er dagegen harmlos.
OIDC_ISSUER=
OIDC_CLIENT_ID=aether
OIDC_CLIENT_SECRET=
# Muss exakt <PUBLIC_URL>/api/v1/auth/oidc/callback sein.
@@ -54,6 +62,8 @@ OIDC_REDIRECT_URL=https://cloud.example.com/api/v1/auth/oidc/callback
# Bestehendes Konto verbinden statt ein zweites anzulegen.
# VOR der ersten Anmeldung setzen – danach ist es zu spät.
OIDC_LINK_BY_USERNAME=false
# Beschriftung des Knopfes auf der Anmeldeseite.
OIDC_BUTTON_LABEL=Sign in with SSO / OIDC
# ── Office (optional) ─────────────────────────────────────────────────────────
# Leer = aus, auch wenn ein Office-Container läuft.
+24
View File
@@ -184,6 +184,10 @@ 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_BUTTON_LABEL`** beschriftet den Knopf auf der Anmeldeseite
(Vorgabe „Sign in with SSO / OIDC"). „Anmelden mit PocketID" sagt dem, der
davorsteht, mehr als eine Abkürzung, die man kennen muss.
**`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
@@ -223,6 +227,26 @@ Kleiner als 1 wird verworfen: Die Zahl geht als `OFFSET` in die Aufräumabfrage,
und `OFFSET 0` löschte jede Fassung – aus „keine Grenze" würde „kein Verlauf".
Wer keinen Verlauf will, lässt den Schalter an der Datei aus.
**Ausschalten löscht nichts.** Der Schalter setzt nur ein Flag: Ab dann
entstehen keine neuen Fassungen mehr, die vorhandenen bleiben liegen – mitsamt
ihrem Platz im Kontingent. Das ist Absicht, ein Umschalter soll keine Daten
vernichten. Es heißt aber auch, dass belegter Platz übrig bleibt, den man nur
im Verlaufs-Dialog sieht.
Endgültig weg sind sie erst, wenn die **Datei selbst** verschwindet, und zwar
richtig: Der Papierkorb genügt nicht – dort liegen Datei und Fassungen weiter.
Beim **Leeren des Papierkorbs** wird die Zeile gelöscht, `ON DELETE CASCADE`
nimmt die Fassungen mit, und die Blobs verschwinden sofort von der Platte.
Gemessen an einer Datei mit drei Fassungen:
| Schritt | Fassungen | Blobs |
|---|---|---|
| Versionierung an, dreimal überschrieben | 3 | 4 |
| Versionierung **aus**geschaltet | 3 | 4 |
| in den Papierkorb gelegt | 3 | 4 |
| Papierkorb geleert | – | 0 |
Zu beachten: **Jedes Strg+S in Office legt eine Fassung an.** Beim Testen
sprang eine Datei dadurch von v1 auf v3, nicht auf v2.
+57
View File
@@ -706,6 +706,63 @@ ist die falsche – die Schnipsel haben deshalb **kein** Profil mehr.
---
## Kommentar hinter leerem Wert in der .env (24.08.2026)
Beim Testen selbst gebaut und sofort wieder eingefangen. In einer `.env` gilt:
```
A=production # kommentar → production ✓
C=production#kommentar → production#kommentar
F= # kommentar → "# kommentar" ✗
```
Hinter einem **gefüllten** Wert ist ein Kommentar harmlos. Hinter einem
**leeren** wird er zum Wert. `OIDC_ISSUER= # z. B. https://…` startete damit
den OIDC-Aufbau mit dem Kommentartext als Adresse – und weil ein Fehlschlag
dort den Start abbricht, kam die Cloud nicht hoch.
In `deploy/.env.example` steckten vier weitere solche Zeilen, darunter
`OFFICE_PROVIDER= # collabora | onlyoffice`: Office wäre mit Unsinn als
Anbieter eingeschaltet worden. Alle vier umgestellt, der Kommentar steht jetzt
darüber.
- [ ] `grep -nE '^[A-Z_]+=[[:space:]]*#' .env.example deploy/.env.example`
liefert nichts 🔎
- [ ] Frische Instanz allein aus den Beispieldateien startet 🔎
---
## Beschriftung des SSO-Knopfes (24.08.2026)
`OIDC_BUTTON_LABEL`, Vorgabe „Sign in with SSO / OIDC".
- [ ] Gesetzt → der Knopf auf der Anmeldeseite trägt den Text
- [ ] Nicht gesetzt → die Vorgabe
- [ ] OIDC aus → `/public/config` liefert einen **leeren** Wert 🔎 (die
Einstellung geht niemanden etwas an, solange es keinen Knopf gibt)
---
## Versionen: was beim Ausschalten passiert (24.08.2026)
Der Schalter „Keep versions" setzt nur ein Flag. Vorhandene Fassungen bleiben
liegen – mitsamt ihrem Platz im Kontingent. Gemessen an einer Datei mit drei
Fassungen:
| Schritt | Fassungen | Blobs |
|---|---|---|
| dreimal überschrieben | 3 | 4 |
| Versionierung ausgeschaltet | 3 | 4 |
| in den Papierkorb | 3 | 4 |
| Papierkorb geleert | – | 0 |
- [ ] Ausschalten löscht nichts 🔎
- [ ] Der Papierkorb genügt nicht – dort bleibt alles 🔎
- [ ] Leeren des Papierkorbs entfernt Fassungen **und** Blobs sofort 🔎
(nicht erst beim nächsten GC)
---
## Anzahl aufgehobener Fassungen (24.08.2026)
`MAX_VERSIONS_KEPT`, Vorgabe 5. Vorher eine Konstante – und zwar **zwei**:
+8
View File
@@ -346,6 +346,10 @@ func main() {
// Public config (no auth) – used by login page to discover OIDC availability
r.Get("/api/v1/public/config", func(w http.ResponseWriter, r *http.Request) {
cloudName := "Aether"
oidcLabel := ""
if oidcHandler.IsEnabled() {
oidcLabel = cfg.OIDCButtonLabel
}
// Farben gehören hierher (statt hinter die Auth), damit schon die
// Login-Seite im eingestellten Farbschema erscheint.
var primaryColor, accentColor, logoURL, faviconURL, appleTouchURL string
@@ -381,6 +385,10 @@ func main() {
// anwendet. Vorher stand sie zweimal im Quelltext, mit einem
// Kommentar „muss zusammenpassen" – das ist keine Zusicherung.
"max_versions_kept": cfg.MaxVersionsKept,
// Beschriftung des SSO-Knopfes. Nur mitgeschickt, wenn OIDC an
// ist – sonst gibt der Endpunkt eine Einstellung preis, die
// niemanden etwas angeht.
"oidc_button_label": oidcLabel,
})
})
+5
View File
@@ -22,6 +22,10 @@ type Config struct {
// MaxVersionsKept: Wie viele frühere Fassungen einer Datei aufgehoben
// werden, wenn die Versionierung für sie eingeschaltet ist.
MaxVersionsKept int
// OIDCButtonLabel steht auf dem Knopf der Anmeldeseite. Der Anbieter hat
// bei jedem einen anderen Namen – „Sign in with SSO / OIDC" sagt dem
// Nutzer weniger als „Anmelden mit PocketID".
OIDCButtonLabel string
DBPort string
DBName string
DBUser string
@@ -156,6 +160,7 @@ func Load() (*Config, error) {
DBHost: getEnv("DB_HOST", "localhost"),
MaxVersionsKept: getEnvInt("MAX_VERSIONS_KEPT", 5),
OIDCButtonLabel: getEnv("OIDC_BUTTON_LABEL", "Sign in with SSO / OIDC"),
DBPort: getEnv("DB_PORT", "5432"),
DBName: getEnv("DB_NAME", "aether"),
DBUser: getEnv("DB_USER", "aether"),
+14 -4
View File
@@ -1,4 +1,8 @@
# Aether – alle Schalter. cp deploy/.env.example deploy/.env
#
# 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"
#
# Für den reinen Betrieb genügt die kürzere .env.example im
@@ -57,6 +61,8 @@ ADMIN_PASSWORD=changeme_strong_admin_password
# Bestehendes Konto verbinden statt ein zweites anzulegen.
# VOR der ersten Anmeldung setzen – danach ist es zu spät.
# OIDC_LINK_BY_USERNAME=true
# Beschriftung des Knopfes auf der Anmeldeseite.
# OIDC_BUTTON_LABEL=Anmelden mit PocketID
# ── Volltextsuche (OCR) ───────────────────────────────────────────────────────
# Standardmäßig an; fehlen ocrmypdf/tesseract, schaltet es sich selbst ab.
@@ -72,15 +78,19 @@ EXTERNAL_APPS=
# ── Office (optional) ─────────────────────────────────────────────────────────
# Leer = aus, auch wenn ein Office-Container läuft. Schnipsel: README.md
OFFICE_PROVIDER= # collabora | onlyoffice (auch Euro-Office)
# collabora | onlyoffice (auch Euro-Office)
OFFICE_PROVIDER=
# Backend → Office. Collabora lauscht auf 9980, OnlyOffice/Euro-Office auf 80.
OFFICE_URL=
OFFICE_PUBLIC_URL= # Browser → Office; leer = wie OFFICE_URL
# Browser → Office; leer = wie OFFICE_URL
OFFICE_PUBLIC_URL=
# Office → Aether; leer = PUBLIC_URL.
# Weder localhost noch der veröffentlichte Port – beides scheitert.
OFFICE_WOPI_URL=
OFFICE_ALLOWED_HOSTS= # gegen SSRF; Host aus OFFICE_URL zählt immer
OFFICE_JWT_SECRET= # nur OnlyOffice/Euro-Office, mind. 32 Zeichen
# Gegen SSRF; der Host aus OFFICE_URL zählt immer dazu.
OFFICE_ALLOWED_HOSTS=
# Nur OnlyOffice/Euro-Office, mind. 32 Zeichen.
OFFICE_JWT_SECRET=
OFFICE_INSECURE_TLS=false # nur für Tests mit selbstsigniertem Zertifikat
# Nur für den Collabora-Container aus deploy/docker-compose.yml:
+2
View File
@@ -214,6 +214,8 @@ export interface PublicConfig {
office_enabled?: boolean
/** Wie viele frühere Fassungen der Server aufhebt (MAX_VERSIONS_KEPT). */
max_versions_kept?: number
/** Beschriftung des SSO-Knopfes (OIDC_BUTTON_LABEL). Leer, wenn OIDC aus ist. */
oidc_button_label?: string
primary_color?: string
accent_color?: string
external_apps: ExternalApp[]
+3 -1
View File
@@ -80,7 +80,9 @@ export default function LoginPage({ onLogin }: Props) {
<circle cx="12" cy="12" r="10" />
<path d="M12 8v4l3 3" />
</svg>
Sign in with SSO / OIDC
{/* Der Anbieter heißt bei jedem anders. „Anmelden mit PocketID"
sagt mehr als eine Abkürzung, die man kennen muss. */}
{config.oidc_button_label || 'Sign in with SSO / OIDC'}
</a>
)}