В текущей конфигурации Docker Compose внешний доступ пользователей к системе организуется через единый порт 443/TCP.
Входной точкой выступает контейнер nginx-proxy. Он принимает HTTPS-запросы и маршрутизирует их к нужному внутреннему сервису по доменному имени, используя заголовок Host.
Для корректной работы схемы доступа через порт 443 необходимо заранее настроить DNS-записи для поддоменов.

Пользователь обращается к системе по HTTPS, используя один из доменов экземпляра:
Все домены указывают на один внешний IP-адрес и используют порт 443.
Контейнер nginx-proxy перенаправляет запросы во внутреннюю сеть Docker Compose по HTTP на соответствующий сервис.
Внутри nginx-proxy используется маршрутизация по параметру server_name.
Соответствие доменов и внутренних сервисов:
В файлах settings.json и client-settings.json внешние адреса сервисов задаются как HTTPS-адреса на отдельных поддоменах.
{
"api": {
"url": "https://api-timetta.domain.com"
},
"passport": {
"url": "https://auth-timetta.domain.com"
},
"websocket": {
"url": "https://ws-timetta.domain.com"
}
}
В конфигурации settings.json параметры TokenIssuer и RedirectUris должны указывать на доменное имя сервиса аутентификации.
Не используйте адрес с портом 5401.
Рекомендуется использовать:
https://auth-timetta.domain.com
вместо:
http://<host>:5401
Для работы HTTPS-доступа необходимо настроить SSL/TLS-сертификаты в контейнере nginx-proxy.
Сертификат должен покрывать все используемые домены:
Допустимые варианты настройки:
Если используется не wildcard-сертификат, он должен явно включать все перечисленные поддомены.
Сертификаты подключаются к контейнеру nginx-proxy через конфигурацию:
configs:
- source: proxy_cert
target: /etc/nginx/ssl/cert.pem
- source: proxy_key
target: /etc/nginx/ssl/key.pem
Для публикации сервисов через единый внешний порт 443 необходимо обновить конфигурацию обратного прокси в файле proxy/nginx.conf.
events {
worker_connections 1024;
}
http {
# Основной параметр для больших файлов
client_max_body_size 100M;
# Буферизация и таймауты
client_body_buffer_size 128k;
client_body_timeout 300s;
# Для proxy
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
#Подключение сертификатов
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
proxy_pass_request_headers on;
proxy_set_header Authorization $http_authorization;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
server {
listen 80;
listen [::]:80;
server_name timetta.domain.com
api-timetta.domain.com
auth-timetta.domain.com
ws-timetta.domain.com
reporting-timetta.domain.com
scheduler-timetta.domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name timetta.domain.com;
location / {
proxy_pass http://client:80;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name api-timetta.domain.com;
location / {
proxy_pass http://api:80;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name auth-timetta.domain.com;
location / {
proxy_pass http://passport:80;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name ws-timetta.domain.com;
location / {
proxy_pass http://web-socket:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name reporting-timetta.domain.com;
location / {
proxy_pass http://reporting:80;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name scheduler-timetta.domain.com;
location / {
proxy_pass http://scheduler:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
В контейнере nginx-proxy должны быть открыты только внешние порты 443 и 80.
Все пользовательские запросы проходят через обратный прокси с маршрутизацией по доменному имени.
nginx-proxy:
container_name: nginx-proxy
image: nginx
ports:
- "443:443"
- "80:80"
configs:
- source: proxy_config
target: /etc/nginx/nginx.conf
- source: proxy_cert
target: /etc/nginx/ssl/cert.pem
- source: proxy_key
target: /etc/nginx/ssl/key.pem
depends_on:
- api
- consumer
- passport
- web-socket
- scheduler
- client
Перейти на русскую версию?