
Задача: Получить и SSL сертификат для Nginx'a, который живет в контейнере, от Let’s Encrypt и автоматически его продлевать
Nginx в контейнере настроен пока только на прослушивание 80-го порта. В контейнер примонтирована директория с хост машины, для верификации сертификатов, и этот путь описан в локейшене. В примере используется Docker-Compose, но он не является обязательным.
app.conf
server {
listen 80;
server_name artem.services;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/certbot;
}
}
docker-compose.yaml
version: '3.1'
services:
backend:
image: nginx/nginx:latest
ports:
- 80:80
volumes:
- ./data/nginx/app.conf:/etc/nginx/conf.d/default.conf
- ./data/nginx/nginx.conf:/etc/nginx/nginx.conf
- /var/www/certbot:/var/www/certbot
Получаем сертификат:
certbot certonly --webroot -w /var/www/certbot/ -d artem.services
После успешного получения, монтируем директорию сертификатов, добавляем SSL опции в Nginx
docker-compose.yaml
version: '3.1'
services:
backend:
image: nginx/nginx:latest
ports:
- 80:80
- 443:443
volumes:
- ./data/nginx/app.conf:/etc/nginx/conf.d/default.conf
- ./data/nginx/nginx.conf:/etc/nginx/nginx.conf
- /var/www/certbot:/var/www/certbot
- /etc/letsencrypt:/etc/nginx/letsencrypt
app.conf
server {
listen 80;
server_name artem.services;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name artem.services;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
}
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/certbot;
}
ssl_certificate /etc/nginx/letsencrypt/live/artem.services/fullchain.pem;
ssl_certificate_key /etc/nginx/letsencrypt/live/artem.services/privkey.pem;
}
Осталось добавить в крон задачу на хост машину, на продление сертификата и перечитывания конфигурации Nginx'а. К примеру будем запускать его раз в неделю ночью:
crontab -e
30 2 * * 1 /usr/bin/certbot renew --webroot -w /var/www/certbot/
35 2 * * 1 docker exec -it $(docker ps | grep 'nginx' | awk '{print $1}') /bin/bash -l -c "/etc/init.d/nginx reload"
"grep 'nginx'" — имя моего контейнера "nginx", не забудьте указать нужное имя.
Так же можно подключить для Certbot'a "options-ssl-nginx.conf" и "ssl-dhparams.pem"
cd /etc/letsencrypt/ curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/options-ssl-nginx.conf > options-ssl-nginx.conf" curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/ssl-dhparams.pem > ssl-dhparams.pem"
И добавляем в конфигурации Nginx'a:
include /etc/nginx/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/nginx/letsencrypt/ssl-dhparams.pem;