Задать вопрос
belkin_aa
@belkin_aa
Обо мне: https://clck.ru/ge9cs

Почему контейнер не видит SSL-сертификат?

Запустил образ, открыл порты, но при заходе на адрес - все равно пишет не защищено, значит сертификат не встал. Что я сделал не так?
Структура части контейнера такая:
  • docker-compose.yml
  • nginx
    • Dockerfile
    • nginx.conf

  • file_setting
    • privkey.pem
    • fullchain.pem


privkey.pem и fullchain.pem - скопировал из папки (там сгенерированные SSL от Let's Encrypt):
/etc/letsencrypt/live/my_domain.ru/
Содержимое Dockerfile в папке nginx:
FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/

Содержимое nginx.conf:
server {
    listen 95;
    server_name my_domain.ru www.my_domain.ru;

    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;

    return 301 https://$host:96$request_uri;
}
server {
    listen 96 ssl;
    server_name my_domain.ru www.my_domain.ru;

    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;

    ssl on;
    ssl_certificate fullchain.pem;
    ssl_certificate_key privkey.pem;
    location / {
                  include uwsgi_params;
                  uwsgi_pass app:8095;
                 }
}

Содержимое сервиса nginx в docker-compose.yml:
nginx:
    volumes:
      - ./file_setting/fullchain.pem:/etc/nginx/fullchain.pem
      - ./file_setting/privkey.pem:/etc/nginx/privkey.pem
    build: ./nginx
    container_name: t_nginx
    restart: always
    ports:
      - 95:80
    depends_on:
      - app
  • Вопрос задан
  • 694 просмотра
Подписаться 2 Средний 25 комментариев
Решения вопроса 1
@dronmaxman
VoIP Administrator
Рабочий пример.

app.run(host='0.0.0.0', port=8095, debug=False)


services:
  app:
    command: python wsgi_docker.py
nginx:
    volumes:
      - ./file_setting/fullchain.pem:/etc/nginx/fullchain.pem
      - ./file_setting/privkey.pem:/etc/nginx/privkey.pem
    build: ./nginx
    container_name: t_nginx
    restart: always
    ports:
        - 80:95
        - 443:96
    depends_on:
      - app


server {
    listen 95;
    server_name my_domain.ru www.my_domain.ru;
    return 301 https://$host$request_uri;
}
server {
    listen 96 ssl;
    server_name my_domain.ru www.my_domain.ru;

    ssl_certificate fullchain.pem;
    ssl_certificate_key privkey.pem;
    location / {
        proxy_pass "http://app:8095/";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}


> Получается, что нельзя на одном домене поднять несколько докеров с SSL(раз 443 дам 1му докеру)?
Архитектура такая. Тебе нужен nginx, не важно как он будет запущен (docker или localhost), nginx будет держать сертификат и слушать порты 80 и 443. Т.к. у тебя домен один и порт тоже, то трафик надо рулить url.

services:
  app1:
    command: python wsgi_docker.py
 app2:
    command: python wsgi_docker.py
 app3:
    command: python wsgi_docker.py
   nginx:
      ports:
        - 80:95
        - 443:96
     
server {
    listen 96 ssl;
     server_name my_domain.ru www.my_domain.ru;
   
    ssl_certificate fullchain.pem;
    ssl_certificate_key privkey.pem;

location /app1 {
        proxy_pass "http://app1:8095/";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
location /app2 {
        proxy_pass "http://app2:8095/";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
location /app3 {
        proxy_pass "http://app3:8095/";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}


Стучаться соответственно на

https://domain.ru/app1
https://domain.ru/app2
https://domain.ru/app3
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Проверьте содержимое fullchain.pem/privkey.pem, может они пустые?

P.S. HTTPS может работать на любом порту, и на 95, и на 93, и даже на 80.
Ответ написан
Ваш ответ на вопрос

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

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