Zum Hauptinhalt springen

Vercel Environment Variables Setup

Datenbankverbindungen für verschiedene Umgebungen​

1. Environment Variables in Vercel setzen:​

Gehe zu deinem Vercel-Projekt → Settings → Environment Variables

Preview (develop branch):​

Name: DEVELOP_DATABASE_URL
Value: postgresql://neondb_owner:npg_...@ep-purple-poetry-a2ijofgc-pooler.eu-central-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require&branch=develop
Environment: Preview ✅
Name: DEVELOP_DATABASE_URL_UNPOOLED
Value: postgresql://neondb_owner:npg_...@ep-purple-poetry-a2ijofgc.eu-central-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require&branch=develop
Environment: Preview ✅

Die Variablennamen stammen direkt aus lib/environment-handling.ts: für VERCEL_ENV === 'preview' werden DEVELOP_DATABASE_URL bzw. DEVELOP_DATABASE_URL_UNPOOLED gelesen.

Production (main branch):​

Name: DATABASE_URL
Value: postgresql://neondb_owner:npg_...@ep-purple-poetry-a2ijofgc-pooler.eu-central-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require&branch=main
Environment: Production ✅
Name: DATABASE_URL_UNPOOLED
Value: postgresql://neondb_owner:npg_...@ep-purple-poetry-a2ijofgc.eu-central-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require&branch=main
Environment: Production ✅

2. Lokale Entwicklung (.env):​

Lokal lädt die App .env im Verzeichnis webapp/. Es gibt keine _LOCAL-Varianten — bei NODE_ENV === 'development' werden dieselben Namen DATABASE_URL und DATABASE_URL_UNPOOLED verwendet:

# Lokale Entwicklung
DATABASE_URL=postgresql://neondb_owner:npg_...@ep-purple-poetry-a2ijofgc-pooler.eu-central-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require

DATABASE_URL_UNPOOLED=postgresql://neondb_owner:npg_...@ep-purple-poetry-a2ijofgc.eu-central-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require

3. Automatische Umgebungserkennung:​

lib/environment-handling.ts wählt anhand von NODE_ENV / VERCEL_ENV die richtige Datenbankverbindung:

  • Lokal (development): DATABASE_URL / DATABASE_URL_UNPOOLED
  • Vercel Preview (preview): DEVELOP_DATABASE_URL / DEVELOP_DATABASE_URL_UNPOOLED → Neon develop branch
  • Vercel Production: DATABASE_URL / DATABASE_URL_UNPOOLED → Neon main branch

4. Stripe Environment Variables:​

lib/environment-handling.ts löst die Stripe-Variablen nicht umgebungsspezifisch auf — in allen Umgebungen werden dieselben Namen verwendet. Es gibt keine getrennten STRIPE_TEST_* / STRIPE_LIVE_*-Variablen. Ob Test- oder Live-Modus aktiv ist, entscheidet allein der hinterlegte Wert (z. B. sk_test_... vs. sk_live_...).

# Gilt für Production, Preview und Development (gleiche Variablennamen)
STRIPE_SECRET_KEY=sk_test_... # bzw. sk_live_... in Production
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_... # bzw. pk_live_... in Production
STRIPE_WEBHOOK_SECRET=whsec_...
NEXT_PUBLIC_STRIPE_TRIAL_PROCUCT_PRICE_ID=price_... # Trial-Preis-ID (Schreibweise "PROCUCT" beachten)

Hinweis: Setze für die jeweilige Umgebung den passenden Wert (Test-Keys für Preview/Development, Live-Keys für Production). Da die Variablennamen identisch sind, müssen die Werte pro Vercel-Umgebung separat gepflegt werden.

5. File Storage Environment Variables:​

Required for all environments:​

Name: BLOB_READ_WRITE_TOKEN
Value: vercel_blob_rw_...
Environment: Production, Preview, Development ✅
Name: BLOB_PRIVATE_READ_WRITE_TOKEN
Value: vercel_blob_rw_...
Environment: Production, Preview ✅
Name: FILE_ENCRYPTION_KEY (Preview: DEVELOP_FILE_ENCRYPTION_KEY)
Value: openssl rand -base64 32, je Umgebung ein eigener Wert, Typ Secret
Environment: nur die jeweilige Umgebung ✅
Name: CRON_SECRET
Value: <generiere ein sicheres Secret>
Environment: Production, Preview ✅

Optional (haben Defaults):​

Name: STORAGE_PROVIDER
Value: vercel-blob
Default: vercel-blob
Name: FILE_MAX_SIZE_IMAGE
Value: 4000000
Default: 4000000 (4MB - angepasst für Hobby-Plan)
Name: FILE_MAX_SIZE_PDF
Value: 4000000
Default: 4000000 (4MB - angepasst für Hobby-Plan)

Retention Periods (Optional - alle in Tagen):​

Name: RETENTION_STUDENT_DOCS
Default: 3650 (10 Jahre)

Name: RETENTION_TEACHER_DOCS
Default: 1825 (5 Jahre)

Name: RETENTION_CLASS_DOCS
Default: 1095 (3 Jahre)

Name: RETENTION_GUARDIAN_DOCS
Default: 3650 (10 Jahre)

Name: RETENTION_PROFILE_IMAGE
Default: 730 (2 Jahre)

Name: RETENTION_TEMP_UPLOAD
Default: 1 (1 Tag)

Name: RETENTION_GENERAL
Default: 730 (2 Jahre)

⚠️ WICHTIG für Hobby-Plan: Aufgrund des Vercel Hobby-Plan Payload-Limits (4.5MB) sind Dateigrößen auf 4MB begrenzt. Für größere Dateien ist ein Upgrade auf Vercel Pro oder die Implementation von Direct-Upload zu Vercel Blob notwendig.

Blob Token generieren:​

  1. Gehe zu Vercel Dashboard → Settings → Storage
  2. Erstelle einen neuen Blob Store (falls noch nicht vorhanden)
  3. Generiere ein Read/Write Token
  4. Kopiere den Token zu BLOB_READ_WRITE_TOKEN

Cron Secret generieren:​

# Linux/Mac:
openssl rand -base64 32

# Windows PowerShell:
[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 }))

6. Nach dem Setup:​

  1. Deployment neu starten in Vercel
  2. Webhook-URLs in Stripe auf Vercel-Domains umstellen
  3. Testen der Verbindungen in allen Umgebungen
  4. Vercel Cron wird automatisch aktiviert durch vercel.json
  5. Blob Storage im Dashboard überprüfen