# Copy to .env and fill in. NEVER commit .env. # HTTP port the container listens on (nginx proxies scan.beartariacampgrounds.com -> 127.0.0.1:8080) PORT=8080 # Existing NocoDB instance NOCODB_BASE_URL=https://nocodb.beartariacampgrounds.com # API token (xc-token) created in NocoDB: Account Settings -> Tokens NOCODB_API_TOKEN= # Table ID of "2026 Campground Tickets" (right-click table -> Copy Table ID, looks like m1a2b3c4d5e6f7) NOCODB_TABLE_ID= # Optional: table ID of "2026 Ticket Audit Logs". If unset, audit logging is skipped. NOCODB_AUDIT_TABLE_ID= # Banquet mode — donor tables (optional; if the master list is unset, banquet is disabled) NOCODB_DONORS_TABLE_ID= NOCODB_DONOR_ONLINE_TABLE_ID= NOCODB_DONOR_OFFLINE_TABLE_ID= # Ice bags granted when a purchase includes ice but the webhook sends only a boolean ICE_BAGS_DEFAULT=3 # Ticket-voucher entitlement (donor free tickets). Donations on/after # VOUCHER_SINCE totalling >= TIER1 earn 1 voucher, >= TIER2 earn 2. Bump the # date each year. NOTE: with no donations after the cutoff, everyone gets 0. VOUCHER_SINCE=2025-09-04 VOUCHER_TIER1_MIN=400 VOUCHER_TIER2_MIN=1000 # Serve /test with sample QR codes (seeds test personas into the CURRENT table). # Keep this false/empty in production — only enable when pointed at a TEST table. ENABLE_TEST_PAGE=false # MailerSend MAILERSEND_API_TOKEN= MAIL_FROM_EMAIL=tickets@beartariacampgrounds.com MAIL_FROM_NAME=Beartaria Campgrounds # Shared secret FluentForms sends in the X-Webhook-Secret header (long random string) WEBHOOK_SECRET= # Gate staff PIN for the scanner app EVENT_PIN= # JWT signing secret (long random string) and token lifetime TOKEN_SECRET= TOKEN_TTL=30d LOG_LEVEL=info