
Как настроить SSL сертификат Lets Encrypt в docker
Предполагается, что у вас уже установлен docker и docker-compose.
docker-compose.yml
Для получения сертификата будем использовать образ certbot, примонтируем 3 раздела для хранения сертификатов, внешних ресурсов (необходимых для подтверждения домена по пути {DOMAIN_NAME}/.well-known/acme-challenge/), а также для настроек nginx.
version: "3.3"
services:
nginx:
container_name: service_nginx
image: nginx:latest
volumes:
- ./configs/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
ports:
- 80:80
- 443:443
certbot:
container_name: service_certbot
image: certbot/certbot
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
nginx.conf
Сконфигурируем default.conf (На данном этапе, мы не будем настраивать 443 порт для ssl, т.к. у нас еще нет сертификата)
upstream back {
server backend:3010;
}
server {
listen 80;
server_name example.com www.example.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://back;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade ;
proxy_set_header Connection "upgrade";
}
}
Теперь можно переходить к первичному получению сертификата:
curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh
chmod +x init-letsencrypt.sh
Отредактируем файл init-letsencrypt.sh, нас интересуют следующие строки
domains=(example.com)
rsa_key_size=4096
data_path="./data/certbot"
email="somebody@mail.ru"
staging=0
Указываем наше доменное имя (либо несколько) и email (опционально, однако, рекомендуется указывать). Также стоит отметить что мы можем делать не более 5 запросов на обновление сертификата в неделю. Чтобы не получить блокировку можно использовать флаг staging, в случае установки в 1 запросы будут отправляться для тестирования.
После всех манипуляций можем запустить ./init-letsencrypt.sh. После успешной генерации сделаем автообновление сертификата.
Автоообновление ssl сертификата
Первым делом изменим наш docker-compose.yml файл, добавим entrypoint для периодического запуска nginx и certbot.
nginx:
container_name: service_nginx
image: nginx:latest
volumes:
- ./configs/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
ports:
- 80:80
- 443:443
entrypoint: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
container_name: service_certbot
image: certbot/certbot
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
Отредактируем nginx файл для 443 порта, а также сделаем редирект с 80 (http => https).
server {
listen 80;
server_name example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://back;
}
}
На этом все, запускаем docker-compose (docker-compose up --build) и проверяем сертификат ;)