{ # Global Options # Enable Prometheus metrics servers { metrics } } :4000 { # Root directory for static files root * /usr/share/caddy # Access Logs (JSON format for Docker) log { output stdout format json } # Enable Gzip/Zstd compression encode gzip zstd # Templates for runtime configuration (config.json) templates { mime application/json } # Cache Control for static assets (immutable) @static { file path *.js *.css *.png *.jpg *.svg *.wasm } header @static Cache-Control "public, max-age=31536000, immutable" # Security Headers (Future Proofing for Wasm) header { # Cross-Origin Isolation for SharedArrayBuffer (required for some Wasm features) Cross-Origin-Opener-Policy "same-origin" Cross-Origin-Embedder-Policy "require-corp" # Standard Security Headers X-Content-Type-Options "nosniff" X-Frame-Options "DENY" Referrer-Policy "strict-origin-when-cross-origin" Permissions-Policy "camera=(), microphone=(), geolocation=()" } # --- ROUTING LOGIC --- # 1. API Proxy (Priority 1) handle /api/* { reverse_proxy api-gateway:8081 { header_up Host {upstream_hostport} } } # 2. Health Check handle /health { respond "healthy" 200 } # 3. Static Files & SPA Fallback (Priority 2) handle { # Serve static files if they exist file_server # SPA Routing: Fallback to index.html for non-existent files try_files {path} /index.html } }