Docker — Nginx with SSL

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

Метки: Метки

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии