mirror of
https://github.com/chatmail/relay.git
synced 2026-05-10 07:54:36 +00:00
docker: add Traefik reverse-proxy compose example (untested)
Add docker-compose-traefik.yaml as an example for running chatmail behind a Traefik reverse proxy. This uses TLS_EXTERNAL_CERT_AND_KEY to let Traefik handle TLS certificate management.
This commit is contained in:
70
docker/docker-compose-traefik.yaml
Normal file
70
docker/docker-compose-traefik.yaml
Normal file
@@ -0,0 +1,70 @@
|
||||
# Traefik reverse-proxy example — use as a compose override:
|
||||
#
|
||||
# docker compose -f docker-compose.yaml -f docker-compose-traefik.yaml up -d
|
||||
#
|
||||
# Traefik handles HTTP→HTTPS redirect and ACME certificate issuance.
|
||||
# traefik-certs-dumper extracts the certificates to the filesystem so
|
||||
# chatmail's Postfix/Dovecot/nginx can use them via TLS_EXTERNAL_CERT_AND_KEY.
|
||||
#
|
||||
# Prerequisites:
|
||||
# mkdir -p traefik/data traefik/dynamic-configs
|
||||
# touch traefik/data/acme.json && chmod 600 traefik/data/acme.json
|
||||
# cp traefik/config.yaml.example traefik/config.yaml # see below
|
||||
#
|
||||
# Required .env variables (in addition to MAIL_DOMAIN):
|
||||
# ACME_EMAIL=admin@example.org
|
||||
|
||||
services:
|
||||
chatmail:
|
||||
environment:
|
||||
# Point chatmail at the certs dumped by traefik-certs-dumper.
|
||||
# The container's tls-cert-reload.path watches for changes.
|
||||
TLS_EXTERNAL_CERT_AND_KEY: >-
|
||||
/traefik-certs/${MAIL_DOMAIN}/certificate.crt
|
||||
/traefik-certs/${MAIL_DOMAIN}/privatekey.key
|
||||
volumes:
|
||||
- traefik-certs:/traefik-certs:ro
|
||||
depends_on:
|
||||
- traefik-certs-dumper
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.services.chatmail.loadbalancer.server.scheme=https
|
||||
- traefik.http.services.chatmail.loadbalancer.server.port=443
|
||||
- traefik.http.routers.chatmail.rule=Host(`${MAIL_DOMAIN}`) || Host(`mta-sts.${MAIL_DOMAIN}`) || Host(`www.${MAIL_DOMAIN}`)
|
||||
- traefik.http.routers.chatmail.tls=true
|
||||
- traefik.http.routers.chatmail.tls.certresolver=letsEncrypt
|
||||
|
||||
traefik:
|
||||
image: traefik:v3.3
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
command:
|
||||
- "--configFile=/config.yaml"
|
||||
- "--certificatesresolvers.letsEncrypt.acme.email=${ACME_EMAIL}"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- ./traefik/config.yaml:/config.yaml:ro
|
||||
- ./traefik/data/acme.json:/acme.json
|
||||
- ./traefik/dynamic-configs:/dynamic/conf:ro
|
||||
|
||||
traefik-certs-dumper:
|
||||
image: ldez/traefik-certs-dumper:v2.10.0
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- traefik
|
||||
entrypoint: sh -c '
|
||||
apk add openssl
|
||||
&& while ! [ -e /data/acme.json ]
|
||||
|| ! [ $$(jq ".[] | .Certificates | length" /data/acme.json | jq -s "add") != 0 ]; do
|
||||
sleep 1;
|
||||
done
|
||||
&& traefik-certs-dumper file
|
||||
--version v3 --watch --domain-subdir=true
|
||||
--source /data/acme.json --dest /certs'
|
||||
volumes:
|
||||
- ./traefik/data/acme.json:/data/acme.json:ro
|
||||
- traefik-certs:/certs
|
||||
|
||||
volumes:
|
||||
traefik-certs:
|
||||
Reference in New Issue
Block a user