Files
Aether/.env.example
T
HoneyandClaude Opus 5 35ebf609b7 fix(config): Datenbank-Passwort mit Sonderzeichen bricht den Start
Die Verbindungszeichenkette wurde mit fmt.Sprintf zusammengeklebt. Ein
Passwort mit % und @ ergab eine kaputte URL:

  parse "postgres://aether:8UoNj%CoWJ7ze@qy@localhost:5432/aether":
  invalid URL escape "%Co"

Der Server kam nicht über die Migrationen hinaus. Die key=value-Form hätte
dasselbe Problem mit einem Leerzeichen gehabt, nur stiller.

config.DSN() liefert jetzt eine postgres://-URL, gebaut mit net/url und
net.JoinHostPort (klammert IPv6). pgxpool und golang-migrate nehmen sie
beide unverändert – dsnToURL, splitDSN, indexByte und orDefault in pkg/db
sind ersatzlos entfallen. Test deckt %, @, :, /, Leerzeichen und IPv6 ab.

Dazu: DB_HOST und DB_PORT fehlten in der schlanken .env.example, weshalb
localhost statt postgres gegriffen hat. APP_ENV ergänzt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 11:20:01 +02:00

92 lines
4.1 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 – das Nötigste für eine neue Umgebung.
#
# cp .env.example .env
#
# Vollständige Liste aller Schalter (OIDC, OCR, Thumbnails, Kontingente …):
# 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.
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=postgres
DB_PORT=5432
DB_NAME=aether
DB_USER=aether
# Jedes Zeichen ist 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.
DATA_PATH=/pfad/zu/aether-data
# `id -u` und `id -g`. Ohne das 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.
TRUSTED_PROXIES=172.18.0.1
# Port auf dem Wirt, gebunden auf loopback. 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.
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.
OIDC_ISSUER=
OIDC_CLIENT_ID=aether
OIDC_CLIENT_SECRET=
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.
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)
OFFICE_PROVIDER=
OFFICE_URL=http://office:9980
OFFICE_PUBLIC_URL=https://office.example.com
OFFICE_WOPI_URL=http://app:8080
# Ziele, die das Backend anfragen darf – gegen SSRF. Nur der Office-Server.
OFFICE_ALLOWED_HOSTS=office