leadsdoit/certbot
Данный образ основан на образе certbot/certbot:v2.11.0
Предназначен для удобного взаимодействия с nginx.
Данный образ умеет при запуске генерировать все нужные файлы
и сертификаты переданные в переменную $DOMAINS
Опубликовано на Docker Hub
DOMAINS - принимает массив доменов для которых надо создать сертификаты. Обязательно при запуске контейнера укажите внешний volume чтоб сертификаты и вспомогательные файлы сложились в него
WEBROOT_PATH - не обязательная переменная,
указывает папку куда cerbot будет генерить временные файлы.
По умолчанию данная папка лежит в /etc/letsencrypt/httpscert
потому вам достаточно подключить внешнюю папку для cerbot и nginx /etc/letsencrypt
и в самом nginx прописать роут
location /.well-known/acme-challenge/ {
root /etc/letsencrypt/httpscert;
}
Необходимо подключить внешнее хранилище для папки /etc/letsencrypt
.
Туда будут складываться сертификаты и дополнительный ключ для шифрования.
Этот же volume надо будет подключить и к nginx. Далее можно использовать в конфиге nginx
ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
Где {domain}
- это ваш домен/субдомен для данного конфига
Чтоб создать ssl-сертификат
Если через docker
docker exec -it <имя контейнера> create_cert <домен>
Если создано через docker compose
docker compose exec <имя сервиса> create_cert <домен>
version: '3.8'
services:
certbot:
image: leadsdoit/certbot
restart: always
environment:
DOMAINS: |
example.com
example.org
example.net
# или так
# DOMAINS: "example.com example.org example.net"
volumes:
- "./cert:/etc/letsencrypt"
nginx:
image: nginx:stable-alpine3.19
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- "./cert:/etc/letsencrypt:ro"
- "./conf/https.conf:/etc/nginx/conf.d/default.conf:ro"
- "./conf/ssl-nginx.conf:/etc/nginx/ssl-nginx.conf:ro"
Для старта
server {
listen 80;
listen [::]:80;
server_name {domain};
# другие настройки
location /.well-known/acme-challenge/ {
root /etc/letsencrypt/httpscert;
}
}
После генерации сертификата
Создайте общий конфиг /etc/nginx/ssl-nginx.conf
куда поместите общие настройки для всех доменов настройки защищенного соединения HTTPS
listen 443 ssl;
listen [::]:443 ssl;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
В конфиг nginx необходимо добавить
server {
listen 80;
listen [::]:80;
server_name {domain};
############################
#
# другие настройки NGINX
#
############################
location /.well-known/acme-challenge/ {
root /etc/letsencrypt/httpscert;
}
include /etc/nginx/ssl-nginx.conf;
ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
}
Или для редиректа всегда на https
server {
server_name {domain};
############################
#
# другие настройки NGINX
#
############################
location /.well-known/acme-challenge/ {
root /etc/letsencrypt/httpscert;
}
include /etc/nginx/ssl-nginx.conf;
ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
}
server {
listen 80;
listen [::]:80;
server_name {domain};
server_tokens off;
location /.well-known/acme-challenge/ {
root /etc/letsencrypt/httpscert;
}
location / {
return 301 https://$host$request_uri;
}
}
После изменения конфига, необходимо перечитать конфиги nginx
nginx -t
Для начала делаем тест конфига nginx -t
Если через docker
docker exec -it <имя контейнера> nginx -t
Если создано через docker compose
docker compose exec <имя сервиса> nginx -t
nginx -s reload
Если все ок, то выполняем перечитывание конфигов nginx -s reload
Если через docker
docker exec -it <имя контейнера> nginx -s reload
Если создано через docker compose
docker compose exec <имя сервиса> nginx -s reload
docker pull leadsdoit/certbot