chore: neue Umgebungsvariablen in .env.example und Compose

APP_NAME, APP_TAGLINE und APP_URL sowie SESSION_TTL_DAYS und die drei
Schalter des SSRF-Schutzes werden an den App-Container durchgereicht.

Bei APP_URL steht ausdruecklich dabei, dass daraus die WebAuthn-rpID
abgeleitet wird, dass Passkeys einen sicheren Kontext brauchen und dass ein
spaeterer Hostnamenwechsel bestehende Passkeys ungueltig macht.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-25 21:30:59 +02:00
co-authored by Claude Opus 5
parent ed77ffaed2
commit 9a9b413d3e
2 changed files with 56 additions and 9 deletions
+47 -9
View File
@@ -4,6 +4,28 @@
# (Die .env wird sowohl von Next.js als auch von docker compose gelesen.) # (Die .env wird sowohl von Next.js als auch von docker compose gelesen.)
# ───────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────
# ── Anwendung ────────────────────────────────────────────────
# Anzeigename: Seitentitel, Kopfzeile und Name im Passkey-Dialog.
APP_NAME="Nebula"
# Kleine Zeile unter dem Namen in der Kopfzeile.
APP_TAGLINE="Vibe Coding"
# Oeffentliche Adresse der Instanz – genau so, wie du sie im Browser aufrufst.
#
# WICHTIG fuer Passkeys: Daraus werden die WebAuthn-Relying-Party-ID (der
# Hostname) und der erwartete Origin abgeleitet. Passt der Wert nicht zur
# aufgerufenen Adresse, lehnt der Browser die Anmeldung ab. Passkeys brauchen
# ausserdem einen sicheren Kontext: https:// – oder http://localhost.
#
# Wird die rpID spaeter geaendert (anderer Hostname), sind bestehende Passkeys
# ungueltig und muessen neu angelegt werden. Passwoerter bleiben davon unberuehrt.
APP_URL="http://localhost:3000"
# Port innerhalb des Containers bzw. im Standalone-Betrieb
PORT="3000"
# Host-Port-Mapping fuer den App-Container (--profile full)
APP_PORT="3000"
# ── Datenbank ──────────────────────────────────────────────── # ── Datenbank ────────────────────────────────────────────────
# Standalone-Betrieb: App laeuft lokal, Postgres via "docker compose up -d db" # Standalone-Betrieb: App laeuft lokal, Postgres via "docker compose up -d db"
# oder als nativ installierter Dienst. # oder als nativ installierter Dienst.
@@ -18,23 +40,39 @@ POSTGRES_PASSWORD="nebula"
POSTGRES_DB="nebula" POSTGRES_DB="nebula"
# Host-Port, unter dem die Datenbank erreichbar ist # Host-Port, unter dem die Datenbank erreichbar ist
POSTGRES_PORT="5432" POSTGRES_PORT="5432"
# Host-Port fuer Adminer (--profile tools)
ADMINER_PORT="8080"
# ── Sicherheit ─────────────────────────────────────────────── # ── Sicherheit ───────────────────────────────────────────────
# Schluessel zur Verschluesselung der Git-Access-Tokens (AES-256-GCM). # Schluessel zur Verschluesselung der Git-Access-Tokens (AES-256-GCM).
# Erzeugen mit: openssl rand -base64 32 # Erzeugen mit: openssl rand -base64 32
# oder: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))" # oder: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# oder: npm run setup (legt die .env inkl. Schluessel an) # oder: npm run setup (legt die .env inkl. Schluessel an)
# WICHTIG: Wird der Wert nachtraeglich geaendert, sind gespeicherte Tokens # WICHTIG: Wird der Wert nachtraeglich geaendert, sind gespeicherte Git-Tokens
# nicht mehr entschluesselbar und muessen neu hinterlegt werden. # nicht mehr entschluesselbar und muessen neu hinterlegt werden. Anmeldungen
# und Passkeys sind davon nicht betroffen.
APP_SECRET="bitte-aendern-mindestens-32-zeichen-langer-zufallswert" APP_SECRET="bitte-aendern-mindestens-32-zeichen-langer-zufallswert"
# ── App ────────────────────────────────────────────────────── # Lebensdauer einer Anmeldung in Tagen.
# Port innerhalb des Containers bzw. im Standalone-Betrieb SESSION_TTL_DAYS="30"
PORT="3000"
# Host-Port-Mapping fuer den App-Container (--profile full)
APP_PORT="3000"
# Host-Port fuer Adminer (--profile tools)
ADMINER_PORT="8080"
# ── Ausgehende Git-Zugriffe ──────────────────────────────────
# Timeout fuer Git-API-Aufrufe in Millisekunden # Timeout fuer Git-API-Aufrufe in Millisekunden
GIT_API_TIMEOUT_MS="15000" GIT_API_TIMEOUT_MS="15000"
# Schutz vor Server Side Request Forgery: die Basis-URL einer Git-Verbindung
# ist eine Benutzereingabe und wird vom Server abgerufen.
#
# Voreinstellung: Loopback, Link-Local (169.254.x, Cloud-Metadaten), Multicast
# und CGNAT sind gesperrt; das private LAN ist erlaubt, weil dort ueblicherweise
# die eigene Gitea-Instanz steht.
# Gitea laeuft auf demselben Rechner wie Nebula? Dann auf true setzen.
# GIT_ALLOW_LOOPBACK="false"
# Kein Zugriff ins private Netz (10/8, 172.16/12, 192.168/16, fc00::/7)?
# GIT_BLOCK_PRIVATE="false"
# Strengster Modus: nur diese Hosts sind erlaubt, alles andere wird geblockt.
# Eine Angabe hier hebt die beiden Schalter darueber auf.
# GIT_ALLOWED_HOSTS="github.com,gitlab.com,git.meine-firma.de"
+9
View File
@@ -52,7 +52,16 @@ services:
DATABASE_URL: postgresql://${POSTGRES_USER:-nebula}:${POSTGRES_PASSWORD:-nebula}@db:5432/${POSTGRES_DB:-nebula}?schema=public DATABASE_URL: postgresql://${POSTGRES_USER:-nebula}:${POSTGRES_PASSWORD:-nebula}@db:5432/${POSTGRES_DB:-nebula}?schema=public
# Unbedingt in der .env ueberschreiben – verschluesselt die Git-Tokens. # Unbedingt in der .env ueberschreiben – verschluesselt die Git-Tokens.
APP_SECRET: ${APP_SECRET:-nebula-dev-secret-bitte-in-der-env-aendern} APP_SECRET: ${APP_SECRET:-nebula-dev-secret-bitte-in-der-env-aendern}
# Name und oeffentliche Adresse. APP_URL bestimmt die WebAuthn-rpID –
# passt sie nicht zur aufgerufenen Adresse, scheitern Passkeys.
APP_NAME: ${APP_NAME:-Nebula}
APP_TAGLINE: ${APP_TAGLINE:-Vibe Coding}
APP_URL: ${APP_URL:-http://localhost:3000}
SESSION_TTL_DAYS: ${SESSION_TTL_DAYS:-30}
GIT_API_TIMEOUT_MS: ${GIT_API_TIMEOUT_MS:-15000} GIT_API_TIMEOUT_MS: ${GIT_API_TIMEOUT_MS:-15000}
GIT_ALLOW_LOOPBACK: ${GIT_ALLOW_LOOPBACK:-false}
GIT_BLOCK_PRIVATE: ${GIT_BLOCK_PRIVATE:-false}
GIT_ALLOWED_HOSTS: ${GIT_ALLOWED_HOSTS:-}
NODE_ENV: production NODE_ENV: production
PORT: 3000 PORT: 3000
HOSTNAME: 0.0.0.0 HOSTNAME: 0.0.0.0