Refactor monolithic modules and harden booking, email, and auth infrastructure.
Split oversized frontend API client, email service, and admin/booking pages into focused modules while preserving import surfaces, and add Redis-backed queues, stale booking cleanup, stronger auth, and scale deployment configs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -8,6 +8,40 @@ DATABASE_URL=./data/spanglish.db
|
||||
# For PostgreSQL
|
||||
# DATABASE_URL=postgresql://user:password@localhost:5432/spanglish
|
||||
|
||||
# Max PostgreSQL connections per instance (default 10). When running multiple
|
||||
# replicas, keep DB_POOL_MAX * replicas below the Postgres max_connections limit.
|
||||
# DB_POOL_MAX=10
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Horizontal scaling (all optional)
|
||||
# ---------------------------------------------------------------------------
|
||||
# Leave everything below UNSET to run as a single instance with in-memory
|
||||
# backends and local-disk uploads (zero-config, identical to the original
|
||||
# behavior). Set them to run multiple API replicas behind a load balancer.
|
||||
#
|
||||
# Note: running more than one instance requires DB_TYPE=postgres. SQLite is a
|
||||
# single local file and cannot be shared safely across instances.
|
||||
|
||||
# Redis connection URL. When set, the cache, rate limiter, pub/sub (real-time
|
||||
# payment events), distributed locks, and the email hourly cap are shared across
|
||||
# all instances. When unset, each instance uses in-memory equivalents.
|
||||
# REDIS_URL=redis://localhost:6379
|
||||
|
||||
# Optional S3-compatible object storage for media uploads (e.g. Garage, MinIO,
|
||||
# AWS S3). When S3_ENDPOINT and S3_BUCKET are set, uploads go to the bucket and
|
||||
# are shared across instances. When unset, uploads are written to ./uploads on
|
||||
# local disk (the default).
|
||||
# S3_ENDPOINT=https://garage.example.com
|
||||
# S3_REGION=garage
|
||||
# S3_BUCKET=spanglish-media
|
||||
# S3_ACCESS_KEY_ID=
|
||||
# S3_SECRET_ACCESS_KEY=
|
||||
# Public base URL used to build fileUrl for stored objects (CDN or web endpoint).
|
||||
# If unset, a path-style URL against S3_ENDPOINT/S3_BUCKET is used.
|
||||
# S3_PUBLIC_URL=https://media.example.com
|
||||
# Use path-style addressing (true for Garage/MinIO). Defaults to true.
|
||||
# S3_FORCE_PATH_STYLE=true
|
||||
|
||||
# JWT Secret (change in production!)
|
||||
JWT_SECRET=your-super-secret-key-change-in-production
|
||||
|
||||
@@ -73,3 +107,10 @@ SMTP_TLS_REJECT_UNAUTHORIZED=true
|
||||
# If the limit is reached, queued emails will pause and resume automatically
|
||||
MAX_EMAILS_PER_HOUR=30
|
||||
|
||||
# Pending Booking Cleanup
|
||||
# Pending bookings whose payment is still unpaid (not awaiting admin approval)
|
||||
# are cancelled after this many minutes, freeing the seats (default: 30)
|
||||
PENDING_BOOKING_TTL_MINUTES=30
|
||||
# How often the cleanup job runs, in milliseconds (default: 300000 = 5 min)
|
||||
PENDING_BOOKING_CLEANUP_INTERVAL_MS=300000
|
||||
|
||||
|
||||
Reference in New Issue
Block a user