server-monitoring/docker-compose.yml
ShiZa039 74b6f92cb8 Стек мониторинга: Prometheus + Alertmanager + Grafana + node_exporter + cAdvisor
Самодостаточный docker compose стек с деплоем через deploy.sh,
bootstrap-установкой с нуля и конфигурацией через .env.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 12:54:40 +02:00

121 lines
4.2 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: monitoring
services:
node_exporter:
image: prom/node-exporter:v1.9.1
container_name: node_exporter
restart: unless-stopped
# host-сеть обязательна для настоящих хостовых сетевых метрик:
# из bridge-сети виден только netns контейнера
network_mode: host
pid: host
# root нужен systemd-коллектору для чтения состояния юнитов через D-Bus
user: root
volumes:
- /:/host:ro,rslave
- /run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro
- ./rendered/web.yml:/etc/node_exporter/web.yml:ro
command:
- --path.rootfs=/host
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --web.listen-address=${BIND_IP:?BIND_IP не задан — заполни .env}:${NODE_EXPORTER_PORT:-9100}
- --web.config.file=/etc/node_exporter/web.yml
- --collector.systemd
# без фильтра коллектор тащит сотни юнитов; разделитель списка — «|»
- --collector.systemd.unit-include=^(${CRITICAL_UNITS:-headscale.service})$$
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.52.1
container_name: cadvisor
restart: unless-stopped
# порт наружу не публикуется намеренно: у cAdvisor нет аутентификации,
# Prometheus ходит к нему по внутренней сети
privileged: true
devices:
- /dev/kmsg
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker:/var/lib/docker:ro
- /dev/disk:/dev/disk:ro
command:
- --docker_only=true
- --housekeeping_interval=30s
networks:
- monitoring
prometheus:
image: prom/prometheus:v3.5.0
container_name: prometheus
restart: unless-stopped
depends_on:
- cadvisor
- alertmanager
ports:
- "${BIND_IP:?}:${PROMETHEUS_PORT:-9090}:9090"
volumes:
- ./rendered/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./prometheus/rules/alerts.yml:/etc/prometheus/rules/alerts.yml:ro
- ./rendered/generated-rules.yml:/etc/prometheus/rules/generated.yml:ro
- ./rendered/web.yml:/etc/prometheus/web.yml:ro
- ./rendered/password:/etc/prometheus/auth/password:ro
- prometheus_data:/prometheus
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention.time=30d
- --web.config.file=/etc/prometheus/web.yml
networks:
- monitoring
alertmanager:
image: prom/alertmanager:v0.28.1
container_name: alertmanager
restart: unless-stopped
ports:
- "${BIND_IP:?}:${ALERTMANAGER_PORT:-9093}:9093"
environment:
TG_BOT_TOKEN: ${TG_BOT_TOKEN:-}
TG_CHAT_ID: ${TG_CHAT_ID:-}
# entrypoint рендерит alertmanager.yml из шаблона (подстановка секретов из env),
# секреты не появляются в файлах ни в репо, ни на диске
entrypoint: ["/bin/sh", "/etc/alertmanager/entrypoint.sh"]
volumes:
- ./alertmanager:/etc/alertmanager:ro
- ./rendered/web.yml:/etc/alertmanager/web.yml:ro
- alertmanager_data:/alertmanager
networks:
- monitoring
grafana:
image: grafana/grafana:12.0.2
container_name: grafana
restart: unless-stopped
depends_on:
- prometheus
ports:
- "${BIND_IP:?}:${GRAFANA_PORT:-3001}:3000"
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?GRAFANA_ADMIN_PASSWORD не задан — заполни .env}
GF_USERS_ALLOW_SIGN_UP: "false"
GF_ANALYTICS_REPORTING_ENABLED: "false"
# прокидываются в provisioning datasource (basic auth к Prometheus)
METRICS_USER: ${METRICS_USER:-admin}
METRICS_PASSWORD: ${METRICS_PASSWORD:-}
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning:ro
- grafana_data:/var/lib/grafana
networks:
- monitoring
volumes:
prometheus_data:
alertmanager_data:
grafana_data:
networks:
monitoring:
driver: bridge