Есть 3 сервера. В Docker Swarm запускаю Nginx с 1 репликой на node1, но на случай падения он поднимется на node2.
Возник вопрос с cerbot. Сейчас есть два контейнера nginx и cerbot, cerbot автоматом следить за сроком сертификатов и обновляет их. Как можно расшарить сертификаты между нодами? Если вдруг node1 упадет, чтобы nginx поднялся на node3 и заработал.
Облачное хранение не подходит
Если здесь подразумевается создание двух volumes на разных нодах, то каждый будет смотреть в папку ssl на конкретной ноде, а cerbot будет обновлять ее только на своей ноде
kondratev-ad, создание двух volumes
Я бы сказал монтирование.
Я не видел твой docker-compose, соответственно предложил такой шаблон, путь выбрал с потолка (./ssl:/opt/ssl:ro). В данном варианте все контейнеры умеют доступ к общей папке SSL в которой certbot имеет права на запись и занимается обновление сертификатов, остальные контейнеры могут только читать.
version: '3.8'
services:
nginx:
image: nginx:1.25.0
deploy:
placement:
constraints:
- "node.labels.TAG==prod"
replicas: 1
ports:
- '80:80'
- '443:443'
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
networks:
- network
# Перезапустит nginx контейнер каждые 6 часов и подгрузит новые сертификаты, если есть
command: '/bin/sh -c ''while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g "daemon off;"'''
certbot:
image: certbot/certbot:v1.28.0
deploy:
placement:
constraints:
- "node.labels.TAG==prod"
replicas: 1
container_name: certbot
# Проверяет каждые 12 часов, нужны ли новые сертификаты
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
networks:
- network
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
networks:
network:
name: network
external: true
Допустим есть 3 ноды: node1, node2 и node3. На двух из них label TAG=prod, допустим на node1 и node2. Допустим, nginx и cerbot запустились на node1, у них есть общая папка ./data и все прекрасно работает.
Теперь nginx глюканул и рестартует на node2. Там этой папки нет и ему не откуда взять серты.
Если поместить эту папку в volume, то это будет локальный volume на конкретной ноде.
Valentin Barbolin, может быть такой случай как я описал, все работает на node1, вдруг nginx "ловит ошибку" и swarm поднимает его на node2, а cerbot остался работать на node1
kondratev-ad, Сорян, я не силен в swarm. Но видится три подхода.
1. Использовать общее хранилище, типа NFS на котором будут лежать сертификаты.
2. Запускать certbot на всех нодах.
3. Использовать общий прокси перед nginx.
Valentin Barbolin, 1 - это хранилище тогда будет точкой отказа. Склоняюсь ко 2, но вот интересный вопрос, можно ли одно hostname получить два действующих серта?
kondratev-ad, По умолчанию certbot использует DNA A запись для получения сертификата, соответственно появляется два варианта.
1. Придумать механизм синхронизации, копирования сертификата на все ноды.
2. Использовать DNS TXT запись для получения сертификата. В таком случае нет необходимости заворачивать 80 порт на ноду которая получает сертификат, но требуется взаимодействие с DNS сервером через API.
можно ли одно hostname получить два действующих серта
да можно, так же можно использовать разные порты для запроса сертификата (--http-01-port), в таком случае каждый certbot будет использовать свой порт и не будет конфликтовать с другими.