Caddy as a Reverse Proxy with Wildcard Certificates
Caddy serves as an elegant reverse proxy solution that can secure multiple internal services using a single wildcard certificate. This setup simplifies SSL management while providing secure access to your local network services.
Key Features
Section titled “Key Features”- Single wildcard certificate for all subdomains
- Automatic HTTPS certificate management via Cloudflare DNS
- Real-time configuration updates
- Built-in error handling
- Admin API for monitoring integration
Installation/Setup
Section titled “Installation/Setup”services: caddy: image: iarekylew00t/caddy-cloudflare:latest restart: unless-stopped environment: - CF_API_TOKEN=<YOUR_CLOUDFLARE_TOKEN> - CADDY_ADMIN=0.0.0.0:2019 cap_drop: - ALL cap_add: - NET_ADMIN - NET_BIND_SERVICE ports: - 80:80 - 443:443 - 443:443/udp - 2019:2019 command: caddy run --config /etc/caddy/Caddyfile --watch volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile - ./caddy/site:/srv - ./caddy/data:/data - ./caddy/config:/configCommon Usage/Examples
Section titled “Common Usage/Examples”Complete Caddyfile Configuration:
{}
*.local.domain.com, local.domain.com { tls { dns cloudflare {env.CF_API_TOKEN} }
@service1 host service1.local.domain.com handle @service1 { reverse_proxy http://10.0.0.10:8080 }
@service2 host service2.local.domain.com handle @service2 { reverse_proxy https://10.0.0.11:8443 { transport http { tls_insecure_skip_verify } } }
handle_path /* { # this is so that caddy knows to return a 404 for undefined subdomains error "Not found" 404 respond "404 - Page not found" 404 }
handle_errors { respond "Error {http.error.status_code}: {http.error.message}" {http.error.status_code} }}Additional Options/Tips
Section titled “Additional Options/Tips”-
Wildcard Certificate Setup: The configuration
*.local.domain.comrequests a single wildcard certificate that covers all subdomains. This means services likeservice1.local.domain.comandservice2.local.domain.comuse the same certificate, reducing management overhead. -
Error Handling: The configuration includes two important error handling blocks:
handleblock with a 404 response catches undefined subdomainshandle_errorsblock provides custom error responses for all error conditions
-
Admin API: Port 2019 exposes Caddy’s admin API, enabling integration with monitoring tools and dashboards
-
Service Integration:
- HTTP services can be proxied directly
- HTTPS services with self-signed certificates use
tls_insecure_skip_verify - Each service gets its own subdomain while sharing the main wildcard certificate
Prerequisites:
- Cloudflare account managing your domain
- Docker and Docker Compose installed
- Cloudflare API token with DNS permissions
- Domain configured in Cloudflare