{ email {$CADDY_EMAIL} } # 反代到后端时,用 Caddy 实测到的对端地址覆盖 X-Real-IP, # 防止客户端伪造 X-Forwarded-For 影响限流、审计和支付下单的 client_ip。 (backend_proxy) { header_up X-Real-IP {remote_host} } # 公开 API 反代片段:主站与选号网共用。 (public_api) { @api_sse { path /api/chats/events /api/admin/chats/events } handle @api_sse { reverse_proxy backend:8080 { flush_interval -1 import backend_proxy } } handle /api/* { request_body { max_size 11MB } reverse_proxy backend:8080 { import backend_proxy } } handle /health { reverse_proxy backend:8080 { import backend_proxy } } } {$CADDY_DOMAIN} { encode zstd gzip header { Strict-Transport-Security "max-age=31536000" X-Content-Type-Options "nosniff" X-Frame-Options "DENY" Referrer-Policy "strict-origin-when-cross-origin" Permissions-Policy "camera=(), microphone=(), geolocation=()" Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' https: data: blob:; font-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'" } import public_api # 生产后台页面使用构建时配置的隐藏入口,旧 /admin 入口直接返回 404。 @legacy_admin path /admin /admin/* handle @legacy_admin { respond 404 } # 其余流量返回主站前端静态资源。 handle { root * /srv/dist try_files {path} /index.html file_server } } # 选号网(hfb_show):仅当 CADDY_SHOW_DOMAIN 有值时由部署脚本启用 conf.d/show.caddy。 # 未配置时 conf.d 为空,不影响主站。 import /etc/caddy/conf.d/*.caddy # Beszel 自带登录与权限控制;单独子域避免与业务站点的 CSP、路由相互影响。 monitor.{$CADDY_DOMAIN} { encode zstd gzip request_body { max_size 10MB } reverse_proxy beszel:8090 { transport http { read_timeout 360s } } }