Как установить let's encrypt сертификат в docker совместно с nginx и certbot?

Приветствую.
Настройку производил по этому мануалу, но есть загвоздка. Вот файл docker-compose.yml:
version: "3.1"
services:
    db:
      image: mariadb
      container_name: test-mariadb
      restart: always
      volumes:
        - ./db/data/:/var/lib/mysql/
        - ./db/etc/:/etc/mysql/conf.d
        - ./db/logs/:/var/lib/mysql/logs/
      environment:
        - MYSQL_ROOT_PASSWORD=pass
        - MYSQL_USER=sqluser
        - MYSQL_PASSWORD=pass
      ports:
        - "127.0.0.1:3306:3306"
    
    php:
      build: 
        context: ./php
        dockerfile: Dockerfile.dockerfile
      container_name: test-php
      volumes:
        - ./public_html/:/var/www/html
      depends_on:
        - db

    apache:
      image: httpd:2.4
      container_name: test-apache
      volumes:
        - ./public_html/:/var/www/html
        - ./httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf
      depends_on:
        - php

    nginx:
      image: nginx:1.17
      container_name: test-nginx
      volumes:
        - ./public_html/:/var/www/html
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf
        - ./certbot/conf:/etc/letsencrypt
        - ./certbot/www:/var/www/certbot
      ports:
        - "80:80"
        - "443:443"

    certbot:
      image: certbot/certbot
      container_name: test-certbot
      restart: always
      volumes:
        - ./certbot/conf:/etc/letsencrypt
        - ./certbot/www:/var/www/certbot

Сами сертификаты у меня получены через SSL for free. Так я верифицировал домен руками через ./well-known. На руках у меня два сертификата (ca_bundle.crt, certificate.crt) и ключ private.key. Если я правильно понял, то данные из ca_bundle можно спокойно прописать в certificate.crt в конце и переименовать файлы в certificate.pem и private.pem.
Вопрос: исходя из файла docker-compose.yml куда мне нужно положить данные сертификаты и что прописать в nginx.conf? Сейчас в нём в блоке http следующее:
server {
        listen 80 default_server;
        return 444;
    }

    server {
        listen      80;
        server_name domain.ru www.domain.ru;
        root        /var/www/html;

        location / {
            index   index.html index.php;
        }

        location ^~ /.well-known/acme-challenge/ {
            default_type "text/plain";
            root        /var/www/html;
        }
    }

Заранее большое спасибо!
  • Вопрос задан
  • 4404 просмотра
Пригласить эксперта
Ответы на вопрос 2
neatsoft
@neatsoft
Life is too short for bad software
Проблема в неправильном выборе инструмента. Для решения этой задачи гораздо лучше подходит Traefik: он умеет динамически подхватывать контейнеры, которым необходим доступ извне, автоматически получать let's encrypt сертификаты, роутить запросы на основании имени домена / пути, и выступать в качестве load balancer-а. Настраивается гораздо проще, чем Nginx: вся конфигурация - несколько строк.
Ответ написан
@Trahibidadido
Backend/DevOps
Вы используете nginx как прокси, просто возьмите компаньона.
https://m.habr.com/ru/post/445448/ советую к прочтению.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы