# FlatRender V2 — Caddy reverse proxy # # Domains are injected via environment variables so this file is environment-agnostic. # Set in .env.v2: # DOMAIN e.g. flatrender.io (→ https://flatrender.io) # API_DOMAIN e.g. api.flatrender.io (→ https://api.flatrender.io) # STORAGE_DOMAIN e.g. storage.flatrender.io (→ https://storage.flatrender.io) # # Caddy auto-provisions Let's Encrypt TLS for all three. For local dev without # real domains, replace with http:// blocks and remove the ACME config. {env.DOMAIN} { # Frontend (Next.js standalone, port 3000 inside Docker) reverse_proxy frontend:3000 # Security headers header { Strict-Transport-Security "max-age=31536000; includeSubDomains" X-Content-Type-Options "nosniff" X-Frame-Options "SAMEORIGIN" Referrer-Policy "strict-origin-when-cross-origin" -Server } encode gzip } {env.API_DOMAIN} { # V2 API gateway (port 8080 inside Docker) reverse_proxy gateway:8080 header { Strict-Transport-Security "max-age=31536000; includeSubDomains" X-Content-Type-Options "nosniff" -Server } # Allow large body for file uploads routed through the gateway request_body { max_size 512MB } } {env.STORAGE_DOMAIN} { # MinIO S3 API (port 9000 inside Docker) — used for presigned URL downloads reverse_proxy minio:9000 header { Strict-Transport-Security "max-age=31536000; includeSubDomains" X-Content-Type-Options "nosniff" -Server } # Pre-flight (CORS) passthrough — MinIO handles its own CORS headers @options method OPTIONS respond @options 204 }