Anmeldefluss mit PKCE (S256), State und Nonce. Das ID-Token wird gegen den JWKS des Anbieters geprueft — Signatur, Aussteller, Empfaenger, Ablauf und Nonce; alles Noetige kommt aus dem Discovery-Dokument, damit die Anbindung nicht auf Authentik festgelegt ist. Wiedererkannt wird jemand an der Kennung des Anbieters (sub), nicht an der E-Mail-Adresse — Adressen aendern sich. Ein bestehendes Konto mit derselben Adresse wird verknuepft statt verdoppelt, aber nur bei bestaetigter Adresse: sonst koennte sich beim Anbieter jemand eine fremde Adresse eintragen und damit ein hiesiges Konto uebernehmen. Uebernommen wird bewusst nur, wer jemand ist — plus die Instanz-Administration, wenn OIDC_ADMIN_GROUP gesetzt ist. Gruppen und Rollen bleiben Sache dieser Anwendung: die Gruppen im Verzeichnis bedeuten etwas anderes als die hier. Konten aus dem Verzeichnis haben kein Passwort mehr (passwordHash ist jetzt optional); Konto-Bereich und Passwort-Anmeldung sagen das statt an einer leeren Pruefung zu scheitern. Anleitung mit allen Feldern in Authentik: docs/authentik.md
58 lines
2.1 KiB
YAML
58 lines
2.1 KiB
YAML
services:
|
|
db:
|
|
image: postgres:18-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER:-qrcode}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD fehlt — bitte .env aus .env.example anlegen}
|
|
POSTGRES_DB: ${POSTGRES_DB:-qrcode}
|
|
volumes:
|
|
# Ab PostgreSQL 18 liegt das Datenverzeichnis in einem Unterordner mit
|
|
# Versionsnummer — der Mountpunkt ist deshalb /var/lib/postgresql und
|
|
# nicht mehr /var/lib/postgresql/data.
|
|
- db-data:/var/lib/postgresql
|
|
healthcheck:
|
|
# Die App startet erst, wenn die Datenbank wirklich Anfragen annimmt.
|
|
test:
|
|
["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-qrcode} -d ${POSTGRES_DB:-qrcode}"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 12
|
|
start_period: 10s
|
|
|
|
app:
|
|
build:
|
|
context: .
|
|
restart: unless-stopped
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
environment:
|
|
# Achtung beim Ergänzen: Compose liest die .env nur, um Platzhalter wie
|
|
# ${BASE_URL} zu ersetzen. In den Container gelangt ausschließlich, was
|
|
# hier aufgeführt ist — eine neue Variable in der .env allein bleibt
|
|
# wirkungslos.
|
|
#
|
|
# Öffentliche Adresse der App — landet in jedem dynamischen QR-Code.
|
|
BASE_URL: ${BASE_URL:-http://localhost:3000}
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
# Anmeldung mit Benutzern, Gruppen und Rollen.
|
|
AUTH_ENABLED: ${AUTH_ENABLED:-false}
|
|
MAX_UPLOAD_MB: ${MAX_UPLOAD_MB:-10}
|
|
OIDC_ENABLED: ${OIDC_ENABLED:-false}
|
|
OIDC_ISSUER: ${OIDC_ISSUER:-}
|
|
OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-}
|
|
OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-}
|
|
OIDC_BUTTON_LABEL: ${OIDC_BUTTON_LABEL:-Mit Authentik anmelden}
|
|
OIDC_SCOPES: ${OIDC_SCOPES:-openid email profile}
|
|
OIDC_ONLY: ${OIDC_ONLY:-false}
|
|
OIDC_DEFAULT_ROLE: ${OIDC_DEFAULT_ROLE:-VIEWER}
|
|
OIDC_ADMIN_GROUP: ${OIDC_ADMIN_GROUP:-}
|
|
OIDC_GROUPS_CLAIM: ${OIDC_GROUPS_CLAIM:-groups}
|
|
ports:
|
|
# Direktes Port-Mapping, bewusst ohne Reverse Proxy.
|
|
- "${APP_PORT:-3000}:3000"
|
|
|
|
volumes:
|
|
db-data:
|