docker-machine + docker-compose + ssl (позволяет шифровать через nginx и certbot) - PullRequest
3 голосов
/ 13 октября 2019

Я пытаюсь добавить автоматическое завершение TLS / SSL для Nginx в docker-compose , развернутом через docker-machine (DigitalOcean).

Я нашел несколько хороших ресурсов [ humankode / как настроить ... , medium / nginx-and-lets-encrypt ... ] о том, как это сделать. через docker-compose, но оба они говорят с точки зрения нахождения на сервере. Я действительно хочу избежать этого. Я бы хотел сделать это локально, на своем ноутбуке, собрать все вместе и отправить. Или даже сделать это удаленно, не используя ssh.

Несколько попыток провалились, но кажется, что они были близки. Основным препятствием, похоже, являются файлы / тома. Следуя руководству medium / nginx-and-lets-encrytp ... , у меня возникли проблемы с сохранением OpenSSL privkey.pem. Другое руководство ( humankode ), насколько мне известно, делает все на сервере, и именно там живут тома.

Моя последняя попытка состояла в том, чтобы настроить сертификаты на компьютере через DigitalOcean tutorial и попробуйте включить их в мою сборку docker-compose. Не повезло.

Было много модификаций, но мои настройки похожи на:

docker-compose.yml

version: '3.7'

services:
  nginx:
    image: nginx:1.15.9-alpine
    container_name: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    restart: always
    volumes:
      - /etc/letsencrypt
      - /var/www/certbot
    ports:
      - "80:80"
      - "443:443"
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

  certbot:
    image: certbot/certbot
    restart: unless-stopped
    volumes:
      - "/etc/letsencrypt"
      - "/var/www/certbot"
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

nginx / Dockerfile

FROM nginx:1.15.9-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/

nginx / conf.d

# PRODUCTION
server {
    listen 80;
    listen [::]:80;
    server_name example.site;

    location ~ /.well-known/acme-challenge {
        allow all;
        root /usr/share/nginx/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name example.site;

    ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

1 Ответ

1 голос
/ 22 октября 2019

Мне потребуются дополнительные сведения об ошибках, которые вы получаете, но в целом все более или менее нормально в вашей конфигурации. Я вижу возможную ошибку в части томов. Но шаг за шагом, потому что вы задаете пару интересных вопросов:

  1. Вы можете проверить все локально, но я боюсь (или я не мог найти способ), что вы не можете сделать это сДавайте автоматически зашифруем, потому что certbot найдет подходящий доступный домен в интернете (поэтому локально недоступен). То, что я сделал, это сгенерировал сертификаты (я их проверил), а затем изменил хосты на вашем компьютере, указав домен, указывающий на localhost (или IP-адрес панели инструментов Docker в случае Windows), который вы выбираете с действительными сертификатами. Это обходной путь, но он может работать.

  2. В примере Medium volumes создаются как host volumes для обоих контейнеров:

     volumes:
        - ./data/certbot/conf:/etc/letsencrypt
        - ./data/certbot/www:/var/www/certbot
    

    Это означает, что сертификаты должны быть помещены в папку./data/certbot/conf или /path/to/host хост-машины докера, и они отображаются в папку /etc/letsencrypt в контейнере. Вы используете анонимные тома (у меня были проблемы в прошлом, когда я их использовал). Проверьте этот вопрос stackoverflow для более подробного объяснения типа томов.

Наконец, если вы предпочитаете другое более динамичное решение, которое автоматически включает https, вы можете проверить ответ на stackoverflow о том, как использовать nginx в качестве обратного прокси , чтобы упростить развертывание. Также имеется пример установки docker compose ELK

...