ONE DUDE`S BLOG

/media/LetsEncrypt.webp

Как настроить SSL сертификат Lets Encrypt в docker

19.09.2020
Пошаговая настройка 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) и проверяем сертификат ;)

Docker
NGINX
SSL
1
7533