NODE_ENV=development PORT=4000 HOST=127.0.0.1 LOG_LEVEL=info # CORS — origini consentite (separate da virgola) CORS_ORIGINS=http://localhost:3000 DATABASE_URL=postgresql://luciano:luciano%40@localhost:5432/ketopath?schema=public # Cifratura at-rest dei campi sanitari (vedi ADR 0002). # Genera con: node -e "console.log('k1.aesgcm256.'+require('crypto').generateKeySync('aes',{length:256}).export().toString('base64url'))" # DEVE coincidere con apps/web/.env e con tutti i deploy che leggono il DB. PRISMA_FIELD_ENCRYPTION_KEY= # Better Auth — DEVE coincidere con apps/web/.env (sessione condivisa) BETTER_AUTH_SECRET= BETTER_AUTH_URL=http://localhost:3000 # Google OAuth (configurato a fine progetto) # GOOGLE_CLIENT_ID= # GOOGLE_CLIENT_SECRET= # Sentry — error tracking (lascia vuoto per disabilitare) # SENTRY_DSN= # Web Push — VAPID (vedi ADR 0003). # Genera con: cd apps/api && node -e "console.log(require('web-push').generateVAPIDKeys())" # La PUBLIC_KEY va anche in apps/web/.env come NEXT_PUBLIC_VAPID_PUBLIC_KEY. # Lascia vuoto per disabilitare le push (il cron e gli endpoint rispondono 503). VAPID_PUBLIC_KEY= VAPID_PRIVATE_KEY= VAPID_SUBJECT=mailto:hello@ketopath.app # Stripe — abbonamenti (vedi ADR 0004). Tutti opzionali: senza queste env il # webhook e gli endpoint /me/billing/* rispondono 503; le route gated (genera # piano, pesata, fast, export PDF) continuano a funzionare per gli utenti in # trial o non gated, ma chi è EXPIRED riceve 402 a prescindere. # Usa le keys "test mode" per sviluppo (sk_test_..., whsec_...). # I price ID si creano da dashboard Stripe → Products. STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= STRIPE_PRICE_ID_MONTHLY= STRIPE_PRICE_ID_YEARLY= # URL di base usato nelle redirect post-checkout (success/cancel). BILLING_RETURN_URL=http://localhost:3000