Edit: /opt/canhelp/.env.example (1978B)
NODE_ENV=development
# API
API_PORT=4000
WEB_URL=http://localhost:3000
# Public API URL for browser (client-side) requests
NEXT_PUBLIC_API_URL=http://localhost:4000
# Internal API URL for SSR requests (server → API, bypasses external DNS/Cloudflare)
# On production set to http://localhost:4000 so Next.js SSR hits the API directly
INTERNAL_API_URL=http://localhost:4000
# Database
DATABASE_URL=postgresql://canhelp:canhelp@localhost:5433/canhelp
# Redis
REDIS_URL=redis://localhost:6379
# Better Auth — generate with: openssl rand -hex 32
BETTER_AUTH_SECRET=change-me-to-a-random-32-char-secret
BETTER_AUTH_URL=http://localhost:4000
# Optional debug endpoint protection token for /api/health/debug
HEALTH_DEBUG_TOKEN=
# Localisation
DEFAULT_LOCALE=el
FALLBACK_LOCALE=en
DEFAULT_CURRENCY=EUR
# Uploads
UPLOAD_DIR=./uploads
MAX_FILE_SIZE_MB=5
# Email (Resend) — get key at resend.com
RESEND_API_KEY=
FROM_EMAIL=noreply@canhelp.gr
# Cloudflare Turnstile (CAPTCHA)
# Get keys at: https://dash.cloudflare.com → Turnstile
TURNSTILE_SECRET_KEY=
# Google OAuth (Sign-In + Calendar)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_CALENDAR_REDIRECT_URI=http://localhost:4000/api/google/calendar/callback
# Apple OAuth (Sign in with Apple)
# APPLE_CLIENT_SECRET is generated dynamically at runtime from your AuthKey_*.p8
APPLE_CLIENT_ID=gr.canhelp.app
APPLE_TEAM_ID=
APPLE_KEY_ID=
# One of the two is required for auto-generation:
# APPLE_PRIVATE_KEY: full PEM content (newlines can be escaped as \n)
# APPLE_PRIVATE_KEY_PATH: absolute path to AuthKey_*.p8 on server
APPLE_PRIVATE_KEY=
APPLE_PRIVATE_KEY_PATH=
# AI Translation (auto-translate task listings)
# TRANSLATE_PROVIDER=anthropic # anthropic (default) | openai
ANTHROPIC_API_KEY=
OPENAI_API_KEY=
# Push notifications (Firebase Cloud Messaging HTTP v1)
# Fill values from Firebase service account JSON key.
FCM_PROJECT_ID=
FCM_CLIENT_EMAIL=
# Keep newlines escaped (\\n) when storing in .env
FCM_PRIVATE_KEY=