Prometheus и Grafana: мониторинг сервера в Docker Compose

Prometheus и Grafana — самая популярная бесплатная связка для мониторинга серверов: Prometheus собирает метрики — загрузку процессора, память, диски, сеть, — а Grafana рисует из них графики. У нас на домашнем сервере так наблюдают за 11 машинами: домашними компьютерами и несколькими VPS. Для статьи мы подняли ту же связку с нуля в Docker Compose и по дороге наступили на граблю из официального примера. Ниже — как настроить мониторинг Prometheus + Grafana, готовый docker-compose.yml, наш рабочий конфиг и как добавлять серверы без перезапуска.

Мониторинг сервера: Prometheus и Grafana
Как устроена связка: node_exporter → Prometheus → Grafana

Как это работает

  • node_exporter — маленькая программа на каждом сервере. Отдаёт метрики системы по адресу http://сервер:9100/metrics.
  • Prometheus — по документации, система мониторинга, которая сама ходит по списку адресов («целей»), забирает метрики с заданным интервалом и хранит их как временные ряды. Умеет правила оповещений.
  • Grafana — веб-интерфейс с дашбордами: берёт данные из Prometheus и рисует графики.

Важная особенность: Prometheus сам опрашивает серверы, а не ждёт, когда они пришлют данные. Поэтому достаточно поставить node_exporter на машину и добавить её адрес в список целей.

Prometheus и Grafana в Docker Compose: наш тест

Файл docker-compose.yml, который мы запустили:

services:
  prometheus:
    image: prom/prometheus:latest
    network_mode: host
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./targets:/etc/prometheus/targets:ro
  node-exporter:
    image: prom/node-exporter:latest
    network_mode: host
    pid: host
    volumes:
      - /:/host:ro
    command: --path.rootfs=/host
  grafana:
    image: grafana/grafana:latest
    network_mode: host
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=придумайте-пароль

Рядом — prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'nodes'
    file_sd_configs:
      - files: ['/etc/prometheus/targets/*.yml']
        refresh_interval: 30s

и файл со списком серверов targets/home.yml:

- targets: ['localhost:9100']
  labels:
    host: test-server

Запуск — docker compose up -d. Встали Prometheus 3.15.0 и Grafana 13.2.3. В памяти после запуска: node_exporter — 8 МБ, Prometheus — 36 МБ, Grafana — 226 МБ. Если Docker Compose для вас в новинку, начните со статьи Docker Compose для начинающих.

Грабля: «is not a shared or slave mount»

Во многих инструкциях корень системы монтируется в node_exporter с опцией rslave: /:/host:ro,rslave. У нас контейнер с ней не запустился:

Error response from daemon: path / is mounted on / but it is not a shared or slave mount

Так бывает, когда корневая файловая система хоста смонтирована в режиме private — например, на некоторых VPS и в контейнерах. Решение — убрать rslave и оставить /:/host:ro, как в файле выше. После этого node_exporter запустился, и обе цели в Prometheus перешли в состояние up. Проверить это можно на странице http://сервер:9090/targets или запросом к API:

curl -s localhost:9090/api/v1/targets | grep -o '"health":"[a-z]*"'

Grafana: подключение Prometheus и готовый дашборд

Grafana открывается на http://сервер:3000, логин admin и пароль из переменной GF_SECURITY_ADMIN_PASSWORD. Дальше два шага:

  1. Connections → Data sources → Add data source → Prometheus, адрес http://localhost:9090, сохранить.
  2. Dashboards → New → Import, ввести ID 1860 — это популярный дашборд Node Exporter Full, — выбрать источник Prometheus и импортировать.

Через пару минут на дашборде появятся графики процессора, памяти, дисков и сети:

Дашборд Node Exporter Full в Grafana
Дашборд Node Exporter Full на нашем тестовом сервере — первые минуты сбора данных

Наш рабочий мониторинг: 11 машин

Дома Prometheus 2.48.0 и Grafana 12.3.1 стоят обычными пакетами, без Docker. Конфиг почти такой же, как выше:

global:
  scrape_interval: 15s
  evaluation_interval: 15s
rule_files:
  - '/etc/prometheus/rules/*.yml'
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'nodes'
    file_sd_configs:
      - files:
          - '/etc/prometheus/targets/home/*.yml'
        refresh_interval: 30s
    scrape_timeout: 10s

Целей 12, все в состоянии up: сам Prometheus и 11 машин с node_exporter на порту 9100. Главное здесь — file_sd_configs: список машин лежит в отдельных файлах, и Prometheus перечитывает их каждые 30 секунд. Чтобы добавить новый VPS в мониторинг, достаточно поставить на него node_exporter и дописать строку в файл — перезапускать Prometheus не нужно. Правила оповещений лежат в одном файле в папке rules.

Prometheus у нас — не единственный мониторинг: на том же сервере работают Zabbix и InfluxDB с историей датчиков умного дома. Но для быстрого ответа на вопрос «что сейчас с серверами» хватает Prometheus и одного дашборда.

Безопасность: не открывайте порты в интернет

Ни у node_exporter, ни у Prometheus по умолчанию нет пароля: метрики на порту 9100 и интерфейс на 9090 видит любой, кто до них достучится. Метрики не дают управлять сервером, но много рассказывают о нём. Поэтому:

  • закройте порты 9100 и 9090 файрволом и разрешите доступ только с адреса сервера мониторинга — как настроить ufw, рассказано в статье первые 15 минут на новом VPS;
  • для удалённых VPS используйте частную сеть между серверами, а не открытые порты;
  • Grafana, если она нужна снаружи, — только через HTTPS и обратный прокси, например Nginx Proxy Manager, и со сменённым паролем администратора.

Источники: Prometheus: обзор, Prometheus: Node Exporter, Prometheus: конфигурация, Grafana в Docker, дашборд Node Exporter Full. Тест — Prometheus 3.15.0 и Grafana 13.2.3 в Docker; рабочий мониторинг — Prometheus 2.48.0 и Grafana 12.3.1. Проверено 5 октября 2026 года.

1 / 1
Оцените статью
Да будет Интернет!