# ─── Database ─────────────────────────────────────────────────────────────── # Local dev (host MySQL): # DATABASE_URL=mysql://queuemed:queuemed@localhost:3306/queuemed # Docker compose (uses the "db" service): # DATABASE_URL=mysql://queuemed:queuemed@db:3306/queuemed DATABASE_URL=mysql://queuemed:queuemed@localhost:3306/queuemed # ─── Auth ─────────────────────────────────────────────────────────────────── # REQUIRED. Must be at least 32 characters of high-entropy random data. # Generate one with: openssl rand -hex 64 # The server refuses to start if this is missing or too short. JWT_SECRET=replace_me_with_openssl_rand_hex_64_output # ─── Server ───────────────────────────────────────────────────────────────── PORT=5000 NODE_ENV=development # Public URL used to build QR code links (e.g. https://queuemed.example.com). # In production this should match the public origin allowed by CORS. PUBLIC_BASE_URL= # ─── Stripe ───────────────────────────────────────────────────────────────── # All Stripe vars are OPTIONAL. If STRIPE_SECRET_KEY is not set, the app still # runs and the subscription UI shows a friendly "not configured" notice. STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= STRIPE_BASIC_PRICE_ID= STRIPE_PRO_PRICE_ID= # Client-side price IDs — must be exposed at build time via VITE_ prefix. # Same values as STRIPE_BASIC_PRICE_ID / STRIPE_PRO_PRICE_ID. VITE_STRIPE_BASIC_PRICE_ID= VITE_STRIPE_PRO_PRICE_ID= # ─── WhatsApp (Baileys) ───────────────────────────────────────────────────── # Persistent directory used to store Baileys auth credentials per clinic. # Must live on a Docker volume in production so sessions survive restarts. WHATSAPP_SESSION_DIR=/app/data/whatsapp-sessions # ─── Twilio SMS ───────────────────────────────────────────────────────────── # All Twilio vars are OPTIONAL. If any is missing, SMS sending is disabled # and the app logs a warning instead of failing. Each clinic also has a # `smsEnabled` opt-in flag; SMS is never sent without both. TWILIO_ACCOUNT_SID= TWILIO_AUTH_TOKEN= TWILIO_PHONE_NUMBER= # ─── Docker compose only ──────────────────────────────────────────────────── MYSQL_ROOT_PASSWORD=replace_me_with_a_strong_password MYSQL_DATABASE=queuemed MYSQL_USER=queuemed MYSQL_PASSWORD=replace_me_with_a_strong_password MYSQL_PORT=3306 APP_PORT=5000 # ─── Backups (used by scripts/backup-db.sh) ───────────────────────────────── # Inside the `app` container these point at the `db` service. # Override only if running the script outside docker compose. # MYSQL_HOST=db # BACKUP_DIR=/app/data/backups # BACKUP_KEEP=7