Задача: Получить и 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;