Преминете към основното съдържание

Nginx Reverse Proxy

Nginx служи като единствена входна точка за ASR stack-а. Рутира WebSocket, HTTP и metrics заявки към съответните вътрешни услуги. Работи на порт 8765 и е единственият контейнер, изложен към Cloudflare Tunnel.

Архитектура

Routing правила

Основни routes

LocationUpstreamОписание
/ws/http://asr:8765WebSocket транскрипция -- основният ASR endpoint
/healthhttp://asr:8765HTTP health check на ASR сървъра
/dashboard/http://dashboard:8766Dashboard UI и API
/--302 redirect към /dashboard/

Metrics routes

LocationUpstreamОписание
/metrics/asrhttp://asr:8765/metrics/Prometheus метрики от ASR (FastAPI + prometheus-client)
/metrics/nodehttp://node-exporter:9100/metricsNode Exporter метрики (CPU, RAM, disk, network)
/metrics/gpuhttp://dcgm-exporter:9400/metricsDCGM Exporter метрики (GPU температура, VRAM, power)

Блокирани routes

LocationОтговорОписание
/ingest/404Предотвратява външен достъп до Dashboard ingest API
/metrics404Блокира достъп до суровия /metrics path (без subpath)

WebSocket конфигурация

Ключови настройки за WebSocket proxy:

location /ws/ {
proxy_pass http://asr:8765;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300s;
}
НастройкаСтойностОписание
proxy_http_version1.1Необходимо за WebSocket upgrade
Upgrade header$http_upgradeПренасочва WebSocket upgrade header
Connection header$connection_upgradeupgrade при WebSocket, close иначе
X-Real-IP$remote_addrПредава истинския IP адрес на клиента
proxy_read_timeout300s5 минути timeout -- съобразено с MAX_DURATION_SECS

Connection Upgrade Map

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

Тази map директива задава стойността на Connection header-а:

  • Ако клиентът изпраща Upgrade header --> Connection: upgrade (WebSocket)
  • Ако няма Upgrade header --> Connection: close (обикновен HTTP)

DNS Resolver

resolver 127.0.0.11 valid=10s;
  • 127.0.0.11 е вграденият Docker DNS resolver
  • valid=10s -- кешира DNS записите за 10 секунди
  • Upstream адресите се задават чрез set $variable за поддръжка на dynamic resolution (контейнерите могат да бъдат рестартирани и да получат нов IP)
# Пример за dynamic upstream resolution
set $asr_upstream http://asr:8765;
proxy_pass $asr_upstream;

Тази техника (задаване на upstream чрез променлива) е необходима, тъй като Nginx по подразбиране resolve-ва upstream адресите само при стартиране. С променлива Nginx re-resolve-ва DNS при всяка заявка (с кеширане от 10 секунди).

Metrics proxy детайли

ASR метрики

location /metrics/asr {
proxy_pass http://asr:8765/metrics/;
proxy_set_header Host $host;
}

Забележка: Trailing slash (/metrics/) е необходим, за да се избегне 307 redirect от Starlette/FastAPI (което пренасочва /metrics към /metrics/).

Node Exporter метрики

location /metrics/node {
proxy_pass http://node-exporter:9100/metrics;
proxy_set_header Host $host;
}

GPU метрики (DCGM)

location /metrics/gpu {
proxy_pass http://dcgm-exporter:9400/metrics;
proxy_set_header Host $host;
}

Dashboard proxy

location /dashboard/ {
proxy_pass http://dashboard:8766;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_cache off;
}
НастройкаСтойностОписание
proxy_bufferingoffИзключен buffering за SSE (Server-Sent Events) поддръжка
proxy_cacheoffБез кеширане -- данните са в реално време

Сигурност

Блокиране на вътрешни endpoints

# Dashboard ingest API -- само за вътрешна комуникация ASR → Dashboard
location /ingest/ {
return 404;
}

# Суров /metrics path -- само /metrics/{asr,node,gpu} са достъпни
location = /metrics {
return 404;
}

Тези правила предотвратяват достъп до вътрешни API endpoints от външни клиенти (през Cloudflare Tunnel).

Допълнителна защита

  • API key -- ASR сървърът проверява api_key в metadata за WebSocket заявки
  • Cloudflare Tunnel -- криптиране и автентикация на ниво мрежов достъп
  • Вътрешна мрежа -- Data Collector, Dashboard и metrics exporters не са директно достъпни отвън (порт 8767, 8766 не са изложени на хоста)

Docker Compose конфигурация

proxy:
image: nginx:alpine
ports:
- "8765:8765"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- asr
- dashboard
restart: unless-stopped
ПараметърСтойностОписание
Imagenginx:alpineЛек Nginx image
Порт8765:8765Единственият порт, изложен към Cloudflare Tunnel
Volumenginx.conf -> default.confRead-only конфигурация
depends_onasr, dashboardСтартира след ASR и Dashboard

Мониторинг

Prometheus на мониторинг VM-ът scrape-ва трите metrics endpoints чрез Cloudflare Tunnel: