Configure organization-wide defaults and DNS automation.
{/* ── Instance Sync ── */}
}
title="Instance Sync"
description="Choose whether this instance acts independently, pushes configuration to slave nodes, or pulls configuration from a master."
accent={A.sync}
>
{isSlave && (
Master Connection
{instanceSync.slave?.lastSyncError ? (
{instanceSync.slave?.lastSyncAt
? `Last sync: ${instanceSync.slave.lastSyncAt} (${instanceSync.slave.lastSyncError})`
: "No sync payload has been received yet."}
) : (
{instanceSync.slave?.lastSyncAt
? `Last sync: ${instanceSync.slave.lastSyncAt}`
: "No sync payload has been received yet."}
)}
)}
{/* ── General ── */}
}
title="General"
accent={A.general}
>
{generalState?.message && (
)}
{isSlave && (
setGeneralOverride(!!v)}
/>
)}
{/* ── DNS Providers ── */}
}
title="DNS Providers"
description="Configure DNS providers for ACME DNS-01 challenges (required for wildcard certificates). You can add multiple providers and select a default."
accent={A.dnsProvider}
>
{dnsProviderState?.message && (
)}
{isSlave && (
{/* ── DNS Resolvers ── */}
}
title="DNS Resolvers"
description="Configure custom DNS resolvers for ACME DNS-01 challenges. These resolvers will be used to verify DNS records during certificate issuance."
accent={A.dns}
>
{dnsState?.message && (
)}
{isSlave && (
setDnsOverride(!!v)}
/>
)}
e.g. 5s, 10s
Custom DNS resolvers are useful when your DNS provider has slow propagation or when using split-horizon DNS.
Common public resolvers: 1.1.1.1 (Cloudflare), 8.8.8.8 (Google), 9.9.9.9 (Quad9).
{/* ── Upstream DNS Pinning ── */}
}
title="Upstream DNS Pinning"
description="Optionally resolve upstream hostnames at config apply time and pin reverse proxy dials to IP addresses. Avoids runtime DNS churn and lets you force IPv6, IPv4, or both."
accent={A.upstreamDns}
>
Both resolves AAAA + A with IPv6 preferred ordering.
Host-level settings can override this default. Resolution happens at config save/reload time and resolved IPs are written into
Caddy's active config. If one handler has multiple different HTTPS upstream hostnames, HTTPS pinning is skipped for those
HTTPS upstreams to avoid SNI mismatch.
{/* ── Authentik Defaults ── */}
}
title="Authentik Defaults"
description="Set default Authentik forward authentication values. These will be pre-filled when creating new proxy hosts but can be customized per host."
accent={A.authentik}
>
{authentikState?.message && (
)}
{isSlave && (
setAuthentikOverride(!!v)}
/>
)}
{/* ── Metrics & Monitoring ── */}
}
title="Metrics & Monitoring"
description={`Enable Caddy metrics exposure for Prometheus, Grafana, or other observability tools. Metrics will be available at http://caddy:${metrics?.port ?? 9090}/metrics on a dedicated port.`}
accent={A.metrics}
>
{metricsState?.message && (
)}
{isSlave && (
setMetricsOverride(!!v)}
/>
)}
Separate from admin API on port 2019.
After enabling metrics, configure your monitoring tool to scrape http://caddy-proxy-manager-caddy:{metrics?.port ?? 9090}/metrics from within the Docker network.
To expose metrics externally, add a port mapping like “{metrics?.port ?? 9090}:{metrics?.port ?? 9090}” in docker-compose.yml.
{/* ── Access Logging ── */}
}
title="Access Logging"
description="Enable HTTP access logging to track all requests going through your proxy hosts. Logs are stored in the caddy-logs directory."
accent={A.logging}
>
{loggingState?.message && (
)}
{isSlave && (
setLoggingOverride(!!v)}
/>
)}
Access logs are stored in the caddy-logs Docker volume.
View with: docker exec caddy-proxy-manager-caddy tail -f /logs/access.log
{/* ── Global Geoblocking ── */}
}
title="Global Geoblocking"
description="Configure default geoblocking rules applied to all proxy hosts. Per-host rules can merge with or override these global defaults."
accent={A.geoblock}
>
{geoBlockState?.message && (
)}
{/* ── OAuth Providers ── */}
}
title="OAuth Providers"
description="Configure OAuth/OIDC providers for single sign-on. Users can log in via these providers in addition to local credentials."
accent={A.oauth}
>