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.
58 lines
2.7 KiB
Bash
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=
|