DocsSelf HostingEnv Vars
Back to Self-Hosting

Environment Variables

Complete reference for all environment variables across every service in the OpenPay stack.

Root .env

The main environment file at the project root. Shared across all Docker containers.

VariableRequiredDescription
POSTGRES_PASSWORDRequiredPassword for the PostgreSQL database
REDIS_PASSWORDRequiredPassword for the Redis cache
HYPERSWITCH_API_KEYRequiredAPI key for Hyperswitch (generate once)
PAYSTACK_SECRET_KEYRequiredPaystack secret key from dashboard.paystack.co
PAYSTACK_PUBLIC_KEYRequiredPaystack public key from dashboard.paystack.co
PAYSTACK_WEBHOOK_SECRETRequiredWebhook signing secret from Paystack dashboard
KILLBILL_API_KEYOptionalAPI key for Kill Bill admin (auto-generated if empty)
KILLBILL_API_SECRETOptionalAPI secret for Kill Bill admin

Hyperswitch .env

VariableRequiredDescription
DATABASE_HOSTRequiredPostgreSQL host (default: postgres)
DATABASE_PORTRequiredPostgreSQL port (default: 5432)
DATABASE_NAMERequiredDatabase name (default: hyperswitch)
DATABASE_USERNAMERequiredDatabase username
DATABASE_PASSWORDRequiredDatabase password (must match root .env)
REDIS_HOSTRequiredRedis host (default: redis)
REDIS_PORTRequiredRedis port (default: 6379)
REDIS_PASSWORDRequiredRedis password
NATS_URLRequiredNATS connection URL (default: nats://nats:4222)
PAYSTACK_SECRET_KEYRequiredPaystack secret key
API_KEYRequiredHyperswitch API key for client auth
EMAIL_ACTIVE_CLIENTOptionalSMTP or SES (default: SMTP)
EMAIL_SENDER_EMAILOptionalFrom: address for auth emails (must be on the verified domain)
EMAIL_SMTP_HOSTOptionalProvider SMTP host (dev: mailhog / prod: smtp.resend.com, etc.)
EMAIL_SMTP_PORTOptionalSMTP port (1025 MailHog, 587 start_tls)
EMAIL_SMTP_CONNECTIONOptionalplaintext (dev) or start_tls (prod)
EMAIL_SMTP_TIMEOUTOptionalSeconds before SMTP timeout (default 10)
EMAIL_SMTP_USERNAMEOptionalProvider SMTP username/API key
EMAIL_SMTP_PASSWORDOptionalProvider SMTP password/API key
HYPERSWITCH_DASHBOARD_URLOptionalPublic dashboard URL baked into email links
HYPERSWITCH_PUBLIC_API_URLOptionalPublic router URL the Control Center calls
HYPER_EMAIL_ENABLEDOptionaltrue = email-based team invites in Control Center

Monitoring .env

VariableRequiredDescription
GRAFANA_ADMIN_USEROptionalGrafana login (default: admin)
GRAFANA_ADMIN_PASSWORDOptionalGrafana password (default: admin — change for production)

Kill Bill .env

VariableRequiredDescription
DATABASE_HOSTRequiredPostgreSQL host
DATABASE_NAMERequiredDatabase name (default: killbill)
DATABASE_USERNAMERequiredDatabase username
DATABASE_PASSWORDRequiredDatabase password
KILLBILL_API_KEYRequiredKill Bill API key
KILLBILL_API_SECRETRequiredKill Bill API secret
KILLBILL_DEFAULT_USERNAMERequiredDefault admin username (default: admin)
KILLBILL_DEFAULT_PASSWORDRequiredDefault admin password
NATS_URLRequiredNATS connection URL

Merchant Dashboard .env.local

Phase 3: the dashboard is sandbox/production mode-aware. Credentials are resolved per mode from the openpay_mode cookie (see src/lib/mode.ts). Per-mode pairs win; the legacy single-mode vars remain as a fallback.

VariableRequiredDescription
KINDE_CLIENT_IDRequiredKinde application client ID
KINDE_CLIENT_SECRETRequiredKinde application client secret
KINDE_ISSUER_URLRequiredKinde domain URL (e.g., https://your.kinde.com)
KINDE_POST_LOGIN_REDIRECT_URLRequiredRedirect after login (default: http://localhost:3000/dashboard)
KINDE_POST_LOGOUT_REDIRECT_URLRequiredRedirect after logout (default: http://localhost:3000)
HYPERSWITCH_URL_TESTRequiredSandbox router URL (default: http://localhost:8081)
HYPERSWITCH_API_KEY_TESTRequiredSandbox secret API key (e.g. snd_<key_id>-<secret>)
NEXT_PUBLIC_OPENPAY_PUBLISHABLE_KEY_TESTOptionalSandbox publishable key used by the checkout page
HYPERSWITCH_URL_LIVEOptionalLive router URL (required only for production mode)
HYPERSWITCH_API_KEY_LIVEOptionalLive secret API key (e.g. prd_<key_id>-<secret>)
NEXT_PUBLIC_OPENPAY_PUBLISHABLE_KEY_LIVEOptionalLive publishable key used by the checkout page
HYPERSWITCH_MERCHANT_ID_TESTOptionalSandbox merchant account id (default: default)
HYPERSWITCH_MERCHANT_ID_LIVEOptionalLive merchant account id (default: default)
HYPERSWITCH_ADMIN_API_KEYOptionalRouter admin key (used to issue/revoke merchant API keys)
NEXT_PUBLIC_OPENPAY_MODEOptionalFallback mode when no cookie/query: sandbox or production
HYPERSWITCH_URLOptionalLegacy fallback router URL (single-mode installs)
HYPERSWITCH_API_KEYOptionalLegacy fallback secret API key

A production-mode request with no live credential configured fails fast (HyperswitchError, HTTP 503) rather than silently reusing the sandbox key. Deployed Vercel environments should map Production → _LIVE vars and Preview → _TEST vars.