Zum Hauptinhalt springen

Umgebungsvariablen

Kopiere .env.local.example nach .env.local und fülle die Werte aus. Einige Variablen (Auth, DB) sind nicht im Example enthalten und müssen manuell hinzugefügt werden.

Datenbank

VariableBeschreibungPflicht
DATABASE_URLPostgreSQL Connection-String für Drizzle ORM (z.B. postgres://user:pass@host:port/db)Ja

Wird von Drizzle ORM in src/server/db/index.ts und drizzle.config.ts verwendet.

Auth.js (NextAuth v5)

VariableBeschreibungPflicht
AUTH_SECRETSession-Verschlüsselungs-Secret für Auth.js JWT-TokensJa
NEXTAUTH_URLBase-URL der App (z.B. http://localhost:3000)Ja (Dev)
AUTH_GOOGLE_IDGoogle OAuth Client IDNein
AUTH_GOOGLE_SECRETGoogle OAuth Client SecretNein
info

Google OAuth ist optional — wird nur aktiviert, wenn beide Google-Variablen gesetzt sind. Ohne Google OAuth funktioniert nur Email/Password-Login.

Verschlüsselung

VariableBeschreibungPflicht
ENCRYPTION_KEYAES-256-GCM Key (32-Byte Hex, 64 Zeichen) für Tenant-E-MailsJa

Generieren mit: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

info

Der pgcrypto-Key für DHL/Shopify-Credentials wird separat auf Datenbank-Ebene konfiguriert:

ALTER DATABASE postgres SET app.settings.encryption_key = 'your-key';

Dieser Wert gehört nicht in .env.local — die App liest ihn nie direkt.

E-Mail (Resend)

VariableBeschreibung
RESEND_API_KEYResend API-Key (resend.com/api-keys)
RESEND_FROM_EMAILAbsender-E-Mail (verifizierte Domain erforderlich)

Cron

VariableBeschreibung
CRON_SECRETBearer-Token für Cron-Endpunkte (32-Byte Hex)

Generieren mit: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

DHL Parcel DE

VariableBeschreibung
DHL_CLIENT_IDApp-Level OAuth Client ID (developer.dhl.com)
DHL_CLIENT_SECRETApp-Level OAuth Client Secret

Diese Credentials sind App-Level (für alle Tenants gleich). Tenant-spezifische GKP-Zugangsdaten werden mit pgcrypto verschlüsselt in der DB gespeichert.

Shopify

VariableBeschreibung
SHOPIFY_CLIENT_IDApp Client ID (partners.shopify.com)
SHOPIFY_CLIENT_SECRETApp Client Secret

Redirect-URL: https://app.roestify.de/api/v1/shopify/oauth/callback

Stripe (Billing)

VariableBeschreibung
STRIPE_SECRET_KEYStripe Secret Key (sk_test_xxx)
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYPublishable Key (pk_test_xxx)
STRIPE_WEBHOOK_SECRETWebhook-Signing-Secret (whsec_xxx)
STRIPE_STARTER_PRICE_IDPreis-ID Starter-Plan (price_xxx)
STRIPE_PRO_PRICE_IDPreis-ID Pro-Plan (price_xxx)

Bestellformular (Dealer-Portal)

VariableBeschreibung
ORDER_FORM_JWT_SECRETJWT-Secret für B2B-Dealer-Portal-Sessions (32-Byte Hex, 64 Zeichen)

Generieren mit: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Das Bestellformular nutzt ein eigenes JWT (kein Auth.js), weil externe Kunden sich per OTP-Code authentifizieren.

Platform Admin

VariableBeschreibung
PLATFORM_ADMIN_EMAILSKomma-getrennte Liste der Platform-Admin-E-Mails (PROJ-31)

S3-Storage

VariableBeschreibung
S3_ENDPOINTS3-kompatibler Endpoint (AWS, Cloudflare R2, MinIO)
S3_REGIONRegion (z.B. auto für R2)
S3_ACCESS_KEY_IDAccess Key
S3_SECRET_ACCESS_KEYSecret Key
S3_BUCKET_NAMEBucket-Name

Wird für Tenant-Logos, Rechnungs-PDFs und Report-Dateien verwendet.

Analytics & Monitoring

VariableBeschreibung
NEXT_PUBLIC_SENTRY_DSNSentry DSN (Error Tracking)
NEXT_PUBLIC_POSTHOG_KEYPostHog API Key (EU Cloud)
NEXT_PUBLIC_POSTHOG_HOSTPostHog Host

Entwicklung & Tests

VariableBeschreibung
ANTHROPIC_API_KEYFür Übersetzungs-Sync-Scripts (scripts/translate/, nur Dev)
E2E_USER_EMAILPlaywright E2E-Test-User E-Mail
E2E_USER_PASSWORDPlaywright E2E-Test-User Passwort
Sicherheit
  • Variablen ohne NEXT_PUBLIC_ werden nie an den Browser gesendet
  • .env.local ist in .gitignore — wird nie committed
  • Tenant-spezifische Secrets (DHL-Passwort, Shopify-Token) werden mit pgcrypto verschlüsselt in der DB gespeichert, nicht in .env
  • AUTH_SECRET und ORDER_FORM_JWT_SECRET müssen in Production kryptographisch stark sein (min. 32 Bytes)

Übersicht: Pflicht vs. Optional

VariableDevProduction
DATABASE_URLPflichtPflicht
AUTH_SECRETPflichtPflicht
NEXTAUTH_URLPflichtAutomatisch
ENCRYPTION_KEYPflichtPflicht
ORDER_FORM_JWT_SECRETPflichtPflicht
RESEND_API_KEY / RESEND_FROM_EMAILOptionalPflicht
CRON_SECRETOptionalPflicht
STRIPE_*OptionalPflicht
S3_*OptionalPflicht
DHL_*OptionalOptional
SHOPIFY_*OptionalOptional
AUTH_GOOGLE_*OptionalOptional
PLATFORM_ADMIN_EMAILSOptionalPflicht
NEXT_PUBLIC_SENTRY_DSNOptionalEmpfohlen
E2E_*OptionalNein
ANTHROPIC_API_KEYOptionalNein