{ servers { trusted_proxies static 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32 timeouts { read_body 10s read_header 10s # must exceed the API's 75s WriteTimeout (main.go), which itself exceeds the 60s docs/diff handler timeout write 90s idle 90s } } } {$DOMAIN:localhost} { tls internal encode gzip zstd header { X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # script-src must allow static.cloudflareinsights.com: Cloudflare # auto-injects the Web Analytics beacon, and without this the browser # blocks it — which logged a CSP error on every page load AND meant Web # Analytics recorded nothing at all. # # The host is allowed rather than Cloudflare's documented # `.../beacon.min.js`, because auto-injection serves the script from a # versioned sub-path (`/beacon.min.js/v4513...`). CSP source paths that # do not end in "/" are matched exactly, so the documented value does # not match the URL Cloudflare actually injects — verified in Chrome. # # connect-src stays 'self' for the beacon: under auto-injection it # reports to this origin, so it needs no third-party connect entry. # # EthicalAds needs both its hosts in script-src: the client script # (media.ethicalads.io) and the ad-decision API (server.ethicalads.io). # The client requests each ad as JSONP, i.e. a