feat(monitoring): экспортер метрик по контейнерам поверх Docker Engine API
Разбивка по контейнерам (CPU/память/сеть) — то, что не смог дать
cAdvisor из-за несовместимости с containerd-снапшоттером сервера 1gb
(убран в 7f5c888). Свой минимальный сервис container-exporter (Python/
aiohttp/prometheus_client) опрашивает Docker Engine API параллельно в
фоновой задаче, не завязываясь на scrape-интервал Prometheus.
Доступ к докер-сокету изолирован через docker-socket-proxy: экспортеру
разрешены только GET /containers/json и /containers/*/stats, любые
изменяющие запросы блокируются на уровне прокси (POST=0) — полная
компрометация экспортера не даёт управлять Docker. Ни один из двух
сервисов не публикует портов наружу.
В host.json возвращены панели «Топ контейнеров по CPU/памяти» на новых
метриках vidconf_container_* (в 0.0.9 их убрали вместе с cAdvisor).
This commit is contained in:
32
deploy/monitoring/container-exporter/Dockerfile
Normal file
32
deploy/monitoring/container-exporter/Dockerfile
Normal file
@@ -0,0 +1,32 @@
|
||||
FROM python:3.12-slim AS base
|
||||
|
||||
# uv binary (тот же приём, что и backend/Dockerfile).
|
||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
ENV UV_COMPILE_BYTECODE=1 \
|
||||
UV_LINK_MODE=copy \
|
||||
PYTHONUNBUFFERED=1
|
||||
|
||||
COPY pyproject.toml uv.lock ./
|
||||
RUN uv sync --frozen --no-dev --no-install-project
|
||||
|
||||
COPY exporter.py ./
|
||||
|
||||
# Непривилегированный пользователь — сокет Docker сервис не видит вообще
|
||||
# (доступ только к socket-proxy по сети compose), но принцип наименьших
|
||||
# привилегий соблюдаем и здесь.
|
||||
RUN useradd --no-create-home --shell /usr/sbin/nologin exporter
|
||||
USER exporter
|
||||
|
||||
EXPOSE 9419
|
||||
|
||||
HEALTHCHECK --interval=10s --timeout=5s --retries=10 --start-period=15s \
|
||||
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:9419/health')" || exit 1
|
||||
|
||||
# Не `uv run` — тому нужен писабельный кэш в $HOME, а у непривилегированного
|
||||
# пользователя без домашней директории (--no-create-home выше) его нет;
|
||||
# зависимости уже установлены в .venv на шаге сборки, `uv run` в рантайме
|
||||
# не добавляет ничего, кроме этой проблемы.
|
||||
CMD [".venv/bin/python", "exporter.py"]
|
||||
Reference in New Issue
Block a user