| # βββ DATABASE βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| DATABASE_URL="postgresql://user:pass@host:port/db?schema=public" | |
| REDIS_URL="redis://localhost:6379" | |
| # βββ SECURITY βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| JWT_SECRET="your-super-secret-jwt-key" | |
| ADMIN_API_KEY="your-internal-admin-key" | |
| ENCRYPTION_SECRET="your-32-char-encryption-key-for-secrets" | |
| WHATSAPP_VERIFY_TOKEN="your-meta-webhook-verify-token" | |
| WHATSAPP_APP_SECRET="your-meta-app-secret-for-hmac" | |
| # βββ PROVIDERS (GLOBAL FALLBACKS) βββββββββββββββββββββββββββββββββββββββββββββ | |
| OPENAI_API_KEY="sk-..." | |
| GOOGLE_AI_API_KEY="AIza..." | |
| # ORANGE_MONEY_API_KEY="" | |
| # WAVE_API_KEY="" | |
| # βββ INFRASTRUCTURE βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| PORT=8080 | |
| NODE_ENV="production" | |
| SENTRY_DSN="" # optionnel β laisser vide pour dΓ©sactiver | |
| CORS_ORIGINS="https://admin.xamle.studio,https://xamle.studio,https://edtechadmin.netlify.app" | |
| ADMIN_URL="https://edtechadmin.netlify.app" | |
| WHATSAPP_GRAPH_URL="https://graph.facebook.com/v18.0" | |
| VITE_CLIENT_URL="https://admin.xamle.studio" | |
| RAILWAY_INTERNAL_URL="http://whatsapp-worker.railway.internal:8082" | |
| RAILWAY_PUBLIC_URL="https://api.xamle.studio" | |
| # βββ STORAGE (R2/S3) ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| R2_ACCESS_KEY_ID="..." | |
| R2_SECRET_ACCESS_KEY="..." | |
| R2_ENDPOINT="https://<accountid>.r2.cloudflarestorage.com" | |
| R2_BUCKET_NAME="edtech-media" | |
| R2_PUBLIC_URL="https://pub-....r2.dev" | |
| # βββ OBSERVABILITY ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| LOG_LEVEL="info" | |
| LOGTAIL_TOKEN="your-betterstack-token" # Optional: for centralized logging | |