# Caddy reverse proxy for the DGB RPC backend.
# Terminates TLS via Let's Encrypt. Proxies to Core RPC on localhost:14022.
# Rate-limits per client IP. Forwards Authorization header for Core basic auth.
#
# The @DOMAIN@ token is substituted by setup.sh.

@DOMAIN@ {
    encode zstd gzip

    # Basic security hardening for the endpoint
    header {
        # No caching of RPC responses
        Cache-Control "no-store"
        # Disable browser MIME sniffing
        X-Content-Type-Options "nosniff"
        # No referrer bleed
        Referrer-Policy "no-referrer"
        # Strict transport security (2 years)
        Strict-Transport-Security "max-age=63072000; includeSubDomains"
        # Remove server identification
        -Server
    }

    # Rate limit — 60 requests per minute per IP, per remote endpoint.
    # Requires github.com/mholt/caddy-ratelimit plugin.
    rate_limit {
        zone rpc_zone {
            key {client.ip}
            events 60
            window 1m
        }
    }

    # Only POST (JSON-RPC). Reject everything else.
    @not_post {
        not method POST
    }
    respond @not_post "Method Not Allowed" 405

    # Proxy JSON-RPC to Core. Basic-auth is passed through unchanged;
    # Core validates rpcuser/rpcpassword against digibyte.conf.
    reverse_proxy 127.0.0.1:14022 {
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Proto {scheme}
        transport http {
            keepalive 30s
            keepalive_idle_conns 8
        }
    }

    # Structured access log; journalctl -u caddy
    log {
        output stdout
        format json
        level INFO
    }
}
