Self-host Caddy
A web server and reverse proxy with automatic HTTPS on by default: name a domain in a two-line Caddyfile and it obtains and renews the certificate from Let's Encrypt or ZeroSSL and redirects HTTP to HTTPS for you. A single Apache-2.0 Go binary with no external dependencies, HTTP/3 on by default, and a JSON admin API for zero-downtime config changes — no web UI and no container auto-discovery out of the box.
Key facts
Pick Caddy when you want automatic HTTPS with the least configuration of any proxy here: name a domain in the Caddyfile, point it at a backend, and Caddy obtains and renews the certificate from Let's Encrypt or ZeroSSL and redirects HTTP to HTTPS for you. It is a single Apache-2.0 Go binary with no external dependencies, and it doubles as a full static-file web server. If you would rather click than edit a file, Nginx Proxy Manager is the answer; if you want routes to follow Docker labels, Traefik is.
Follow the Caddy deploy guide →What you need
- Any VPS with at least 256 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Paid link — we earn a commission if you shop through it.
Install with Docker Compose
Save this as compose.yml and run docker compose up -d:
# Caddy — official image; the Caddyfile lives in ./conf, certificates in the caddy_data volume
services:
caddy:
image: caddy:2
restart: unless-stopped
ports: ["80:80", "443:443", "443:443/udp"]
volumes:
- ./conf:/etc/caddy
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
# ./conf/Caddyfile: app.example.com { reverse_proxy app:3000 } — then docker compose up -dWhat you take on
Caddy's defaults are safe and few; the things worth knowing come from its own docs and its official Docker image: