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

Как это работает
- 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. Дальше два шага:
- Connections → Data sources → Add data source → Prometheus, адрес
http://localhost:9090, сохранить. - Dashboards → New → Import, ввести ID 1860 — это популярный дашборд Node Exporter Full, — выбрать источник Prometheus и импортировать.
Через пару минут на дашборде появятся графики процессора, памяти, дисков и сети:

Наш рабочий мониторинг: 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 года.








