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ürVERCEL_ENV === 'preview'werdenDEVELOP_DATABASE_URLbzw.DEVELOP_DATABASE_URL_UNPOOLEDgelesen.
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→ Neondevelopbranch - Vercel Production:
DATABASE_URL/DATABASE_URL_UNPOOLED→ Neonmainbranch
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:
- Gehe zu Vercel Dashboard → Settings → Storage
- Erstelle einen neuen Blob Store (falls noch nicht vorhanden)
- Generiere ein Read/Write Token
- 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:
- Deployment neu starten in Vercel
- Webhook-URLs in Stripe auf Vercel-Domains umstellen
- Testen der Verbindungen in allen Umgebungen
- Vercel Cron wird automatisch aktiviert durch vercel.json
- Blob Storage im Dashboard überprüfen