deploy: bind backend/livekit-signaling/monitoring/llm ports to loopback

Close host-published ports that don't need to be reachable from outside
the docker network: nginx already proxies backend/livekit by service
name, and admin UIs (prometheus/grafana) and llm servers should only be
reachable via SSH tunnel. Only 80/443/7881 + the WebRTC UDP range stay
open to the internet.
This commit is contained in:
2026-07-25 22:58:38 +03:00
parent 6dda717ad8
commit d593add0f3
3 changed files with 35 additions and 6 deletions

View File

@@ -81,8 +81,12 @@ services:
volumes:
- ../config:/app/config:ro
- media:/app/media
# Публикуем ТОЛЬКО на loopback: backend нужен снаружи compose-сети
# только для локального curl-дебага на сервере — nginx проксирует
# запросы по имени `backend:8000` внутри docker-сети, публичный доступ
# идёт исключительно через nginx (80/443).
ports:
- "8000:8000"
- "127.0.0.1:8000:8000"
depends_on:
postgres:
condition: service_healthy
@@ -375,8 +379,13 @@ services:
# обязательно в кавычках: YAML запрещает ": " внутри неквотированного
# plain-скаляра.
LIVEKIT_KEYS: "${LIVEKIT_API_KEY:?LIVEKIT_API_KEY не задан в .env}: ${LIVEKIT_API_SECRET:?LIVEKIT_API_SECRET не задан в .env}"
# 7880 (signaling) — ТОЛЬКО loopback: nginx проксирует /livekit/ по имени
# `livekit:7880` внутри docker-сети (см. nginx.conf.template), браузеры
# снаружи ходят через nginx/443 (wss://), прямой доступ к 7880 им не
# нужен. 7881/tcp и UDP-диапазон ниже — реальные медиа-порты, остаются
# публичными.
ports:
- "7880:7880" # HTTP/WebSocket signaling
- "127.0.0.1:7880:7880" # HTTP/WebSocket signaling
- "7881:7881" # RTC TCP fallback
# Узкий диапазон для dev на macOS: широкий (50000-60000) почти всегда
# конфликтует с занятыми UDP-портами хоста и тормозит Docker Desktop.
@@ -556,8 +565,9 @@ services:
LLAMA_ARG_ENDPOINT_METRICS: 1
volumes:
- llm-models:/models/qwen:ro
# Loopback-only: admin/debug доступ по ssh-туннелю, наружу не публикуется.
ports:
- "8080:8080"
- "127.0.0.1:8080:8080"
depends_on:
llm-model-init:
condition: service_completed_successfully
@@ -596,8 +606,9 @@ services:
LLAMA_ARG_ENDPOINT_METRICS: 1
volumes:
- llm-models:/models/qwen:ro
# Loopback-only: admin/debug доступ по ssh-туннелю, наружу не публикуется.
ports:
- "8081:8080"
- "127.0.0.1:8081:8080"
# Алиас `llm` в сети compose (в дополнение к штатному `llm-gpu`) —
# `llm` и `llm-gpu` взаимоисключающи по профилю (install.sh включает
# ровно один), поэтому Prometheus (deploy/monitoring/prometheus.yml,
@@ -639,8 +650,9 @@ services:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./monitoring/alerts.yml:/etc/prometheus/alerts.yml:ro
- prometheus_data:/prometheus
# Loopback-only: админ-доступ по ssh-туннелю, наружу не публикуется.
ports:
- "9090:9090"
- "127.0.0.1:9090:9090"
healthcheck:
test: ["CMD-SHELL", "wget -q -O- http://127.0.0.1:9090/-/healthy || exit 1"]
interval: 10s
@@ -697,8 +709,9 @@ services:
- ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro
- ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro
- grafana_data:/var/lib/grafana
# Loopback-only: админ-доступ по ssh-туннелю, наружу не публикуется.
ports:
- "3001:3000"
- "127.0.0.1:3001:3000"
depends_on:
prometheus:
condition: service_healthy