Automatic HTTPS reverse proxy powered by Caddy 2 - zero-config TLS
10K+
One-command HTTPS for any HTTP service — automatic Let's Encrypt, zero config.
Adding HTTPS to a service should be one line, not a wall of config. This image:
DOMAIN + UPSTREAM, that's itdocker run -d \
-p 80:80 -p 443:443 \
-e DOMAIN=app.example.com \
-e UPSTREAM=host.docker.internal:3000 \
-v ssl-data:/data \
zachbg/ssl-proxy
That's it. Your app at port 3000 now has HTTPS.
services:
ssl:
image: zachbg/ssl-proxy
ports:
- "80:80"
- "443:443"
environment:
- DOMAIN=app.example.com
- UPSTREAM=app:3000
- [email protected] # Optional: for Let's Encrypt notifications
volumes:
- ssl-data:/data
app:
image: your-app
# No ports needed — ssl-proxy handles it
volumes:
ssl-data:
| Variable | Default | Required | Description |
|---|---|---|---|
DOMAIN | Yes | Your domain name | |
UPSTREAM | Yes | Backend address (host:port) | |
EMAIL | No | Email for Let's Encrypt | |
HTTPS_PORT | 443 | No | HTTPS listen port |
HTTP_PORT | 80 | No | HTTP listen port (redirect) |
docker run -d --name app node-app
docker run -d -p 80:80 -p 443:443 \
-e DOMAIN=myapp.com \
-e UPSTREAM=app:3000 \
--link app \
-v ssl-data:/data \
zachbg/ssl-proxy
services:
ssl-api:
image: zachbg/ssl-proxy
ports: ["443:443", "80:80"]
environment:
DOMAIN: api.example.com
UPSTREAM: api:8080
volumes: [ssl-data:/data]
api:
image: my-api
volumes:
ssl-data:
docker run -d -p 443:443 \
-e DOMAIN=localhost \
-e UPSTREAM=host.docker.internal:3000 \
zachbg/ssl-proxy
Strict-Transport-Security — HSTS with preloadX-Content-Type-Options: nosniffX-Frame-Options: DENYReferrer-Policy: strict-origin-when-cross-originMIT
Content type
Image
Digest
sha256:2de66cbb1…
Size
22.7 MB
Last updated
6 months ago
docker pull zachbg/ssl-proxy