Nginx Reverse Proxy
Nginx служи като единствена входна точка за ASR stack-а. Рутира WebSocket, HTTP и metrics заявки към съответните вътрешни услуги. Работи на порт 8765 и е единственият контейнер, изложен към Cloudflare Tunnel.
Архитектура
Routing правила
Основни routes
| Location | Upstream | Описание |
|---|---|---|
/ws/ | http://asr:8765 | WebSocket транскрипция -- основният ASR endpoint |
/health | http://asr:8765 | HTTP health check на ASR сървъра |
/dashboard/ | http://dashboard:8766 | Dashboard UI и API |
/ | -- | 302 redirect към /dashboard/ |
Metrics routes
| Location | Upstream | Описание |
|---|---|---|
/metrics/asr | http://asr:8765/metrics/ | Prometheus метрики от ASR (FastAPI + prometheus-client) |
/metrics/node | http://node-exporter:9100/metrics | Node Exporter метрики (CPU, RAM, disk, network) |
/metrics/gpu | http://dcgm-exporter:9400/metrics | DCGM Exporter метрики (GPU температура, VRAM, power) |
Блокирани routes
| Location | Отговор | Описание |
|---|---|---|
/ingest/ | 404 | Предотвратява външен достъп до Dashboard ingest API |
/metrics | 404 | Блокира достъп до суровия /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_version | 1.1 | Необходимо за WebSocket upgrade |
Upgrade header | $http_upgrade | Пренасочва WebSocket upgrade header |
Connection header | $connection_upgrade | upgrade при WebSocket, close иначе |
X-Real-IP | $remote_addr | Предава истинския IP адрес на клиента |
proxy_read_timeout | 300s | 5 минути timeout -- съобразено с MAX_DURATION_SECS |
Connection Upgrade Map
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
Тази map директива задава стойността на Connection header-а:
- Ако клиентът изпраща
Upgradeheader -->Connection: upgrade(WebSocket) - Ако няма
Upgradeheader -->Connection: close(обикновен HTTP)
DNS Resolver
resolver 127.0.0.11 valid=10s;
127.0.0.11е вграденият Docker DNS resolvervalid=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_buffering | off | Изключен buffering за SSE (Server-Sent Events) поддръжка |
proxy_cache | off | Без кеширане -- данните са в реално време |
Сигурност
Блокиране на вътрешни 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
| Параметър | Стойност | Описание |
|---|---|---|
| Image | nginx:alpine | Лек Nginx image |
| Порт | 8765:8765 | Единственият порт, изложен към Cloudflare Tunnel |
| Volume | nginx.conf -> default.conf | Read-only конфигурация |
depends_on | asr, dashboard | Стартира след ASR и Dashboard |
Мониторинг
Prometheus на мониторинг VM-ът scrape-ва трите metrics endpoints чрез Cloudflare Tunnel: