Новый раздел про container-exporter/docker-socket-proxy: зачем свой
экспортер вместо cAdvisor, какие метрики отдаёт, почему доступ к
докер-сокету через прокси безопасен. Дополнена таблица метрик backend
(vidconf_host_info).
На сервере 1gb Docker Engine использует containerd-снапшоттер
(driver-type: io.containerd.snapshotter.v1), а не классический overlay2.
cAdvisor (проверено на v0.49.2 и свежей v0.52.1, с --docker_only и через
--containerd/--containerd-namespace=moby) не может определить read-write
layer контейнеров — падает с «failed to identify the read-write layer
ID», метрики только по корневому cgroup, без разбивки по контейнерам.
Открытая проблема совместимости, флагами не решается.
Убран сервис cadvisor, job в prometheus.yml, панели «топ контейнеров» в
host.json (Prometheus иначе резолвит cadvisor:8080 в никуда — Grafana
показывала бы «No data» вечно). node-exporter метрики хоста (CPU/RAM/
диск/сеть) при этом покрывает полностью, без изменений.
Правка конфигурации мониторинга, без изменения пользовательского
поведения — версия не бампается.
Документация мониторинга описывала только старые компоненты (prometheus,
postgres/redis-exporter, дашборд пайплайнов) — актуализирована под
node-exporter/cAdvisor, дашборд host.json и три новых алерта.
Воспроизводимый путь от голой Ubuntu 24 до рабочего https://<домен>:
предусловия (DNS/firewall/место на диске), выпуск SSL (bootstrap
самоподписанным сертификатом → install.sh → certbot --webroot +
deploy-hook на автопродление), полный разбор обязательных значений .env,
профиль monitoring, чек-лист проверки после деплоя, TURN как опциональный
раздел для экстремального NAT (по итогам реального кросс-сетевого
тестирования — не обязателен), обновление/редеплой, бэкап и restore БД,
траблшутинг по реальным инцидентам проекта, полный разбор мониторинга
(доступ через SSH-туннель, панели дашборда с порогами тревоги, runbook
включения транскрибации/суммаризации).
Ссылки на документ добавлены в README.md: врезка под «Быстрый старт» и
приоритетная ссылка в разделе «Развёртывание».
Redis without a password was the root cause of the security incident
(cron miner via unauthenticated replication RCE, see
.forcc/deploy/SESSION2-FINDINGS.md). Loopback binding alone doesn't
protect against a compromised container inside the same compose
network, so wire REDIS_PASSWORD as a required secret everywhere redis
is used: backend/worker/worker-transcriber(-gpu), redis-exporter,
livekit and egress (via rendered templates). docker compose now
refuses to start without it instead of silently running unauthenticated.
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.
Целевой набор профилей compose по умолчанию (media,monitoring) не включает
llm/llm-gpu — job `llm` в prometheus.yml и алерт LlmDown в alerts.yml
закомментированы, иначе Prometheus постоянно логировал бы неудачный скрейп
несуществующего таргета, а LlmDown вечно оставался бы firing. Раскомментировать
оба вместе — на инсталляциях с профилем llm/llm-gpu (пресеты 3-5 install.sh).
Дашборд «Пайплайны пост-обработки» и docs/deploy/monitoring.md обновлены с
пояснением, что большинство панелей показывают «No data» без
transcribe/llm — это ожидаемо, не баг.
docker compose определяет .env для подстановки ${VAR} по каталогу
compose-файла (deploy/), а не по текущей директории — repo-root .env,
который использует install.sh и вся документация, молча не подхватывался.
Это и была причина "WARN: LIVEKIT_API_KEY not set" на боевом сервере:
секреты были в .env, но compose их не видел и подставлял небезопасные
дефолты (см. таблицу разведки сервера).
Теперь ставшие обязательными ${VAR:?} в docker-compose.yml (см. предыдущий
коммит) без этого немедленно проваливали бы конфиг на любой из
документированных команд. Добавлен `--env-file .env`/"$ENV_FILE" ко всем
вызовам docker compose в install.sh и в командах из README/docs.
install.sh дополнительно: ensure_default (аналог ensure_secret без генерации
секрета) для новых не-секретных параметров nginx/coturn/livekit
(NGINX_SERVER_NAMES, NGINX_CERT_NAME, LIVEKIT_USE_EXTERNAL_IP,
LIVEKIT_NODE_IP, TURN_EXTERNAL_IP) — дефолты только для локальной
разработки, не перезаписывают значения, заданные вручную на боевом
сервере. Плюс вызов deploy/render-templates.sh перед сборкой/подъёмом
стека.