# Values containing #, ", \ or surrounding spaces must be single-quoted # (dotenv 16 treats an unquoted # as a comment): DB_PASSWORD='abc#def' # REQUIRED. The admin module treats anything other than "development" or "test" # as production: strict secrets, cross-subdomain cookies, no relaxed CORS. # Leaving it unset is therefore safe-by-default but will refuse to boot without # the admin secrets below. Set it to development for local work. NODE_ENV=development PORT=3000 DB_HOST= DB_USER= DB_PASSWORD= EMAIL_HOST= EMAIL_USERNAME= EMAIL_PASSWORD= CALENDAR_DB= FEEDBACK_DB= FEEDBACK_IP_SALT= FEEDBACK_RATE_LIMIT_MAX=5 FEEDBACK_RATE_LIMIT_WINDOW_MIN=10 SALESFORCE_ENABLED=false SALESFORCE_API_URL= SALESFORCE_CLIENT_ID= SALESFORCE_CLIENT_SECRET= TICKETS_DB= TICKETS_RATE_LIMIT_MAX=10 TICKETS_RATE_LIMIT_WINDOW_MIN=10 ADMIN_DB= # 32+ random bytes, e.g. `openssl rand -base64 48`. Mandatory outside # development/test - there is deliberately no fallback, since a hardcoded one # would be a published signing key. Rotating it signs everyone out and # invalidates outstanding password-reset links. BETTER_AUTH_SECRET= API_BASE_URL=http://localhost:3000 ADMIN_APP_URL=http://localhost:3002 # Comma-separated origins of the apps that may call /admin/* with credentials. APP_ORIGINS=http://localhost:3001 # nachklang.art in production; passkeys are bound to this value. PASSKEY_RP_ID=localhost # On start-up, makes sure this address can get in (invite, or grant admin if the # user already exists). Idempotent, safe to leave set. ADMIN_BOOTSTRAP_EMAIL= # The header the reverse proxy puts the real client IP in, and the proxy hops to # trust. Get these right or better-auth cannot resolve a client IP and every # request shares ONE rate-limit bucket (/sign-in/* allows 3 per 10 seconds, so # one noisy client locks everyone out). Check with: # SELECT `key` FROM rateLimit; -- a "no-trusted-ip" row means it is happening. CLIENT_IP_HEADERS=x-real-ip TRUSTED_PROXY_IPS= # Writes invitation links to the log. That link is a live account-creation # credential, so this is refused outside development. Needed locally, where the # mail relay is off and only the token's hash is stored. ADMIN_LOG_INVITE_LINKS=true MEMBER_CREDENTIAL=123 CHOIR_CREDENTIAL=123 MANAGEMENT_CREDENTIAL=123