# Caddy config for WROLPi services (RPi/Debian bare metal). { # No ACME - WROLPi is designed for offline use. auto_https disable_redirects } :443 { tls /etc/ssl/wrolpi/cert.crt /etc/ssl/wrolpi/cert.key header Access-Control-Allow-Origin "*" header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" header Access-Control-Allow-Headers "Content-Type, Accept" handle /ca.crt { root * /media/wrolpi/config/ssl header Content-Type "application/x-x509-ca-cert" header Content-Disposition "attachment; filename=\"wrolpi-ca.crt\"" file_server } handle /favicon.ico { root * /opt/wrolpi rewrite * /icon.ico file_server } handle /apple-touch-icon.png { root * /opt/wrolpi rewrite * /icon.png file_server } # WebSocket for React dev server. handle /ws { reverse_proxy 0.0.0.0:3000 } # Controller - system management API and UI. handle_path /controller/* { reverse_proxy 0.0.0.0:80 } handle /controller { redir * /controller/ 301 } # Speed test streams generated bytes; never buffer it. handle /api/speedtest/* { reverse_proxy 0.0.0.0:8081 { flush_interval -1 } } # Main API. handle /api/* { reverse_proxy 0.0.0.0:8081 } # WROLPi blobs (planet overview map, fonts, etc.) handle_path /blobs/* { root * /opt/wrolpi-blobs file_server } # Map static assets (fonts, sprites) for embedded MapLibre viewer. handle_path /map-assets/* { root * /opt/wrolpi/modules/map/static file_server } # Custom MIME types not in Caddy's defaults. @yaml path *.yaml *.yml header @yaml Content-Type "text/yaml" @epub path *.epub header @epub Content-Type "application/epub+zip" @mobi path *.mobi header @mobi Content-Type "application/x-mobipocket-ebook" # Static media files with directory browsing. handle_path /media/* { root * /media/wrolpi header Content-Disposition "inline" file_server browse } handle /media { redir * /media/ 301 } # Downloads with Content-Disposition header. handle_path /download/* { root * /media/wrolpi header Content-Disposition "attachment" file_server browse } handle /download { redir * /download/ 301 } # React app with fallback to Controller. handle { reverse_proxy 0.0.0.0:3000 } handle_errors 502 503 504 { redir * "http://{host}/?fallback=true" 302 } } # Kiwix HTTPS proxy. :8085 { tls /etc/ssl/wrolpi/cert.crt /etc/ssl/wrolpi/cert.key header ?Access-Control-Allow-Origin "*" header ?Access-Control-Allow-Methods "GET, OPTIONS" reverse_proxy 0.0.0.0:9085 } # Help HTTPS proxy. :8086 { tls /etc/ssl/wrolpi/cert.crt /etc/ssl/wrolpi/cert.key header ?Access-Control-Allow-Origin "*" header ?Access-Control-Allow-Methods "GET, OPTIONS" reverse_proxy 0.0.0.0:9086 } # Map viewer - serves MapLibre static assets and PMTiles data via Caddy. :8084 { tls /etc/ssl/wrolpi/cert.crt /etc/ssl/wrolpi/cert.key header ?Access-Control-Allow-Origin "*" header ?Access-Control-Allow-Methods "GET, HEAD, OPTIONS" header ?Access-Control-Expose-Headers "Content-Range, Content-Length" # PMTiles file list from WROLPi API. handle /api/map/* { reverse_proxy 0.0.0.0:8081 } # WROLPi blobs (planet overview map). handle_path /blobs/* { root * /opt/wrolpi-blobs file_server } # PMTiles data files from media directory (Range Requests supported by default). handle_path /data/* { root * /media/wrolpi/map file_server } # MapLibre static assets (HTML, JS, CSS, fonts, sprites). handle { root * /opt/wrolpi/modules/map/static file_server } }