В конце концов я нашел правильное решение - не использовать интеграцию Traefik ACME, а вместо этого просто смонтировать сетевой том (EFS), содержащий сертификаты, выданные certbot в ручном режиме.
Почему этот метод был выбран мной?Потому что я монтирую этот том NFS с сертификатом на двух серверах (синий и зеленый).Эти серверы являются живыми и промежуточными серверами для веб-серверов.В любой момент один из них будет «живым», а другой может быть кандидатом на релиз или иным образом в роли «горячего резерва».
По этой причине лучше разделить проблемы и иметь третийСервер работает как выделенный «менеджер сертификатов».Этот сервер t2.nano в основном никогда не будет затронут, и он несет единоличную ответственность за запуск certbot раз в неделю, записывая сертификаты в монтирование NFS, которое совместно используется (в режиме только для чтения) двумя веб-серверами.
Таким образом, Traefik работает как на синем, так и на зеленом серверах, чтобы позаботиться о своей основной задаче проксирования веб-трафика, и просто указывает на файлы сертификатов, выпущенных certbot.Для тех, кто нашел эту страницу и мог бы извлечь выгоду из того же решения, вот соответствующая выдержка из моего файла traefik.toml:
defaultEntryPoints = ["https","http"]
[docker]
watch = true
exposedbydefault = false
swarmMode = true
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "/cert.pem"
keyFile = "/privkey.pem"
Вот соответствующая секция из моего стекового файла Docker:
version: '3.2'
volumes:
composer:
networks:
traefik:
external: true
services:
proxy:
image: traefik:latest
command: --docker --web --docker.swarmmode --logLevel=DEBUG
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- "./certs/live/example.com/fullchain.pem:/cert.pem"
- "./certs/live/example.com/privkey.pem:/privkey.pem"
networks:
- traefik
И, наконец, команда cron, которая запускается раз в неделю на выделенном сервере сертификатов, настроена для использования ACME v2 для сертификатов подстановочных знаков и интеграции Route 53 для автоматизации вызовов:
sudo docker run -it --rm --name certbot \
-v `pwd`/certs:/etc/letsencrypt \
-v `pwd`/lib:/var/lib/letsencrypt \
-v `pwd`/log:/var/log/letsencrypt \
--env-file ./env \
certbot/dns-route53 \
certonly --dns-route53 \
--server https://acme-v02.api.letsencrypt.org/directory \
-d example.com \
-d example.net \
-d *.example.com \
-d *.example.net \
--non-interactive \
-m me@example.org \
--agree-tos
папка certs
- это том NFS, общий для трех серверов.