Как правильно настроить nginx + ssl в докер?

Ссылка скопирована
1 ответ
version: "3.9" networks:   opencart-network: services:   webserver:     build:       context: .       dockerfile: ./docker/welcomepage/Dockerfile       args:         - DOMAIN_NAME=${DOMAIN_NAME:-domain.com}         - DOMAIN_EMAIL=${DOMAIN_EMAIL:-mail@domain.com}     ports:       - "80:80"       - "443:443"     networks:       - backend-network     volumes:       - ./certbot/www/:/var/www/certbot/:ro   certbot:     image: certbot/certbot     restart: unless-stopped     volumes:       - ./certbot/www/:/var/www/certbot/:rw       - ./certbot/conf/:/etc/letsencrypt/:rw     entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot certonly --webroot --webroot-path=/var/www/certbot --email ${DOMAIN_EMAIL} --agree-tos --no-eff-email -d ${DOMAIN_NAME}; sleep 12h & wait $${!}; done;'"     networks:       - backend-network

version: "3.9" networks: opencart-network: services: webserver: build: context: . dockerfile: ./docker/welcomepage/Dockerfile args: - DOMAIN_NAME=${DOMAIN_NAME:-domain.com} - DOMAIN_EMAIL=${DOMAIN_EMAIL:-mail@domain.com} ports: - "80:80" - "443:443" networks: - backend-network volumes: - ./certbot/www/:/var/www/certbot/:ro certbot: image: certbot/certbot restart: unless-stopped volumes: - ./certbot/www/:/var/www/certbot/:rw - ./certbot/conf/:/etc/letsencrypt/:rw entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot certonly --webroot --webroot-path=/var/www/certbot --email ${DOMAIN_EMAIL} --agree-tos --no-eff-email -d ${DOMAIN_NAME}; sleep 12h & wait $${!}; done;'" networks: - backend-network

Nginx conf

server {     listen 80;     server_name ${DOMAIN_NAME};      root /var/www/html;     index index.html;      charset utf-8;      location /.well-known/acme-challenge/ {         root /var/www/certbot;     }     # Redirect from 80 to 443     location / {         return 301 https://$host$request_uri;     } }  server {     listen 443 default_server ssl;      server_name ${DOMAIN_NAME};      root /var/www/html;     index index.html;      charset utf-8;      ssl_certificate /etc/letsencrypt/ssl/live/${DOMAIN_NAME}/fullchain.pem;     ssl_certificate_key /etc/letsencrypt/ssl/live/${DOMAIN_NAME}/privkey.pem;          location ~ /.(?!well-known).* {         deny all;     }  }

server { listen 80; server_name ${DOMAIN_NAME}; root /var/www/html; index index.html; charset utf-8; location /.well-known/acme-challenge/ { root /var/www/certbot; } # Redirect from 80 to 443 location / { return 301 https://$host$request_uri; } } server { listen 443 default_server ssl; server_name ${DOMAIN_NAME}; root /var/www/html; index index.html; charset utf-8; ssl_certificate /etc/letsencrypt/ssl/live/${DOMAIN_NAME}/fullchain.pem; ssl_certificate_key /etc/letsencrypt/ssl/live/${DOMAIN_NAME}/privkey.pem; location ~ /.(?!well-known).* { deny all; } }

Выполняю команду:

docker-compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot/ -d domain.com

docker-compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot/ -d domain.com

Основная загвоздка, это вначале нужно обратиться к 80 порту от certbot, чтобы он выдал сертификаты, и потом их установить и перезаписать настройки nginx, как это правильно сделать?

Дополнительно:

это вы сами такую архитектуру - "генерация сертификата по требовнию" придумали или прочитали где ? вначале нужно обратиться к 80 порту от certbot, чтобы он выдал сертификаты, и потом вот тут поподробнее что вы там придумали .

  • listen 443 default_server #ssl; - не запустится без сертификата, выключи ssl и ssl_certificate и ssl_certificate_key. Запусти контейнеры, запроси сертификат, а потом уже включай ssl. Продление сертификата уже будет проходить без бубна.

    У тебя еще должен быть доступен сертификат в контейнере nginx поэтому подмонтируй к нему /etc/letsencrypt

    Из за таких танцев с бубном а предпочитаю traefik

  • Valentin Barbolin, спасибо, нашел решение в виде подстановки временного самописного сертификата, чтобы nginx не ругался и потом сверху прописать через certbot. Потом мне нужно было через поддомены прописывать, просто выписал wildcart один раз и для всех поддоменов подставил.
  • По поводу traefik, надо изучать что это, на сложном там написано)
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

    Для того чтобы правильно настроить Nginx + SSL в Docker, следует выполнить следующие шаги:

    1. Создайте Dockerfile для сборки образа Nginx. Пример Dockerfile:

    FROM nginx:latest
    COPY nginx.conf /etc/nginx/nginx.conf
    COPY ssl.crt /etc/nginx/ssl/ssl.crt
    COPY ssl.key /etc/nginx/ssl/ssl.key

    FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf COPY ssl.crt /etc/nginx/ssl/ssl.crt COPY ssl.key /etc/nginx/ssl/ssl.key

    2. Создайте файл конфигурации Nginx (nginx.conf) с необходимыми настройками. Пример конфигурации:

    server {
        listen 443 ssl;
        server_name example.com;
     
        ssl_certificate /etc/nginx/ssl/ssl.crt;
        ssl_certificate_key /etc/nginx/ssl/ssl.key;
     
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }

    server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/ssl.crt; ssl_certificate_key /etc/nginx/ssl/ssl.key; location / { root /usr/share/nginx/html; index index.html; } }

    3. Сгенерируйте SSL сертификат и ключ, либо используйте самоподписанный сертификат для тестов. Пример генерации самоподписанного сертификата:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl.key -out ssl.crt

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl.key -out ssl.crt

    4. Соберите образ Nginx с помощью команды `docker build -t my-nginx .`.

    5. Запустите контейнер с образом Nginx, пробросив порт 443 на хост машину. Пример запуска контейнера:

    docker run -d -p 443:443 my-nginx

    docker run -d -p 443:443 my-nginx

    Теперь у вас должен быть настроенный Nginx с SSL в Docker контейнере. Проверьте доступность вашего сайта по HTTPS, введя в браузере https://example.com.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно