Files
AfiS-Aktensystem/.env.example
T
Harlekin f5bd409dfb Callback-URL aus APP_URL ableiten
Auth.js baut die redirect_uri nicht aus dem Host-Header, sondern aus AUTH_URL.
Ohne die Variable bleibt sie fest auf http://localhost:3000 — hinter dem
Cloudflare Tunnel wäre die Anmeldung damit kaputt gewesen, und zwar mit einer
Fehlermeldung von Discord, die nicht auf die Ursache zeigt. APP_URL ist ohnehin
die kanonische öffentliche Adresse und wird jetzt durchgereicht.

Nachweis mit dem gebauten Standalone-Server: mit gesetztem APP_URL kommt
https://afis.example.de/api/auth/callback/discord heraus, ohne fällt sie auf
localhost zurück. Ein E2E-Test hält Scope identify, state, PKCE mit S256 und
den Pfad der Callback-URL fest.

Nebenbefund, eigenständig behoben: loadEnvFromRepoRoot hat gesetzte
Umgebungsvariablen mit den Werten der Entwicklungs-.env überschrieben.
process.loadEnvFile tut das von sich aus. Eine .env ist ein Rückfall für die
lokale Entwicklung, kein Vorrang vor dem, was der Aufrufer ausdrücklich
mitgibt — sonst überschreibt sie etwa die APP_URL eines Testlaufs und die
Fehlersuche führt weit weg von der Ursache.
2026-09-01 19:37:09 +02:00

58 lines
2.7 KiB
Bash

# AfiS-Aktensystem — Vorlage für den .env-Reiter in Dockge.
# Diese Datei enthält nur Platzhalter. Die echten Werte gehören nach
# /opt/stacks/afis/.env und niemals ins Repository. Siehe docs/11-betrieb.md.
# --- Zeitzone -----------------------------------------------------------------
TZ=Europe/Berlin
# --- Datenbank ----------------------------------------------------------------
# Wird von db, pgbouncer, web, worker und den Backups gelesen.
POSTGRES_PASSWORD=hier-ein-langes-zufaelliges-passwort
# Die Anwendung spricht über pgbouncer im Transaktionsmodus, deshalb pgbouncer=true.
DATABASE_URL=postgresql://afis:hier-ein-langes-zufaelliges-passwort@pgbouncer:6432/afis?pgbouncer=true&connection_limit=1
# Migrationen und LISTEN/NOTIFY brauchen eine Verbindung an pgbouncer vorbei.
DIRECT_DATABASE_URL=postgresql://afis:hier-ein-langes-zufaelliges-passwort@db:5432/afis
# --- Anwendung ----------------------------------------------------------------
# Die öffentliche Adresse der Anwendung. Auth.js baut daraus die redirect_uri
# für Discord; sie muss zeichengenau im Developer Portal hinterlegt sein als
# <APP_URL>/api/auth/callback/discord
APP_URL=https://afis.example.de
# 32+ Zeichen. Erzeugen mit: openssl rand -base64 48
AUTH_SECRET=hier-ein-langes-zufaelliges-geheimnis-mit-mindestens-32-zeichen
# --- Discord ------------------------------------------------------------------
# Aus dem Developer Portal. Das Server Members Intent muss aktiviert sein,
# sonst liefert der Bot keine Rollen. Siehe docs/03-auth-und-rechte.md.
# Als Redirect-URI in der Application eintragen:
# <APP_URL>/api/auth/callback/discord
# Der Bot muss ausserdem auf den Server eingeladen sein, sonst liefert die
# API "Unknown Guild":
# https://discord.com/oauth2/authorize?client_id=<DISCORD_CLIENT_ID>&scope=bot&permissions=3072
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=
DISCORD_BOT_TOKEN=
DISCORD_GUILD_ID=
# Kanal, in den der Worker Start, Verbindungsabbruch und fehlgeschlagenen
# Voll-Abgleich meldet. Das ist die eigentliche Alarmierung.
DISCORD_ADMIN_CHANNEL_ID=
# --- Notfallzugang ------------------------------------------------------------
# Eine oder zwei Discord-IDs, kommagetrennt. Diese Nutzer haben immer Stufe 5
# und alle Rechte, unabhängig vom Rollen-Mapping. Ohne das sperrt man sich beim
# ersten Fehler in der Rollenverwaltung selbst aus.
BOOTSTRAP_ADMIN_IDS=
# --- Dateien und Prüfkette ----------------------------------------------------
FILES_DIR=/data/files
CLAMAV_SOCKET=/var/run/clamav/clamd.sock
PDF_SERVICE_URL=http://pdf:3000
# --- Cloudflare Tunnel --------------------------------------------------------
CLOUDFLARE_TUNNEL_TOKEN=
# --- Auslagerungs-Backup ------------------------------------------------------
RESTIC_REPOSITORY=
RESTIC_PASSWORD=