This blog is now on HTTPS.
Setup:
Caddy is an open source HTTP/2 web server. caddy-docker-proxy is a plugin for Caddy enabling Docker integration - when an appropriately configured Docker container or service is brought up, caddy-docker-proxy generates a Caddy site specification entry for it and reloads Caddy. With Caddy's built-in Let's Encrypt functionality, this allows the new container/service to run over HTTPS seamlessly.
Below is my docker-compose.yml for Caddy. I built Caddy with the caddy-docker-proxy plugin from source and named the resulting Docker image samadhiweb/caddy. The Docker network caddynet is the private network for Caddy and the services it is proxying. The Docker volume caddy-data is for persistence of data such as cryptographic keys and certificates.
version: '3.6'
services:
caddy:
image: samadhiweb/caddy
command: -agree -docker-caddyfile-path=/pkg/caddy/caddyfile -log=/var/log/caddy/caddy.log
ports:
- "80:80"
- "443:443"
networks:
- caddynet
volumes:
- type: bind
source: /var/run/docker.sock
target: /var/run/docker.sock
- type: bind
source: /pkg/caddy
target: /pkg/caddy
- type: volume
source: caddy-data
target: /root/.caddy
- type: bind
source: /var/log/caddy
target: /var/log/caddy
restart: unless-stopped
networks:
caddynet:
name: caddynet
external: true
volumes:
caddy-data:
name: caddy-data
external: true
Here's the docker-compose.yml snippet for the blog engine:
services:
scms1app:
image: samadhiweb/scms1app
ports:
- "8081:8081"
networks:
- caddynet
volumes:
- type: bind
source: /pkg/smallcms1/config.json
target: /etc/smallcms1/config.json
- type: volume
source: smdw-content
target: /pkg/cms
labels:
- "caddy.address=www.samadhiweb.com"
- "caddy.targetport=8081"
- "caddy.targetprotocol=http"
- "caddy.proxy.header_upstream_1=Host www.samadhiweb.com"
- "caddy.proxy.header_upstream_2=X-Real-IP {remote}"
- "caddy.proxy.header_upstream_3=X-Forwarded-For {remote}"
- "caddy.tls=email-address@samadhiweb.com"
- "caddy.log=/var/log/caddy/www.samadhiweb.com.access.log"
ulimits:
rtprio:
soft: 2
hard: 2
restart: unless-stopped
networks:
caddynet:
name: caddynet
external: true
volumes:
smdw-content:
name: smdw-content
external: true
Of interest are the caddy.* labels from which caddy-docker-proxy generates the following in-memory Caddy site entry:
www.samadhiweb.com {
log /var/log/caddy/www.samadhiweb.com.access.log
proxy / http://<private-docker-ip>:8081 {
header_upstream Host www.samadhiweb.com
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
}
tls email-address@samadhiweb.com
}
Also note the ulimits section, which sets the suggested limits for the Pharo VM heartbeat thread. These limits must be set in the docker-compose file or on the docker command line - copying a prepared file into /etc/security/limits.d/pharo.conf does not work when run in a Docker container.
ulimits:
rtprio:
soft: 2
hard: 2
Tags: deployment, Docker