Self-hosted мониторинг: собираем стек из open-source инструментов

Пошаговое руководство по развёртыванию стека мониторинга: Prometheus, Grafana, Loki, Node Exporter и Uptime Kuma.

Следить за серверами, сервисами и сайтами нужно. Но платить Datadog по $15 за хост в месяц — это больно, особенно когда у вас пяток VPS и десяток self-hosted приложений. Хорошая новость: open-source стек мониторинга собирается за час и покрывает 90% потребностей среднего проекта.

В этом гайде соберём стек: Prometheus (метрики), Grafana (дашборды), Loki (логи), Node Exporter (системные метрики), Uptime Kuma (статус сайтов). Всё в Docker Compose, всё с персистентностью, всё с алертами.

Шаг 1: Docker Compose

Создайте директорию monitoring и файл docker-compose.yml:

version: "3.8"
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--storage.tsdb.retention.time=30d"
    ports:
      - "9090:9090"
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - "--path.procfs=/host/proc"
      - "--path.sysfs=/host/sys"
      - "--path.rootfs=/rootfs"
    ports:
      - "9100:9100"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=changeme
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

Шаг 2: Prometheus — сбор метрик

Создайте prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["node-exporter:9100"]

  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

Node Exporter собирает CPU, RAM, диск, сеть — всё системное. Чтобы мониторить несколько серверов, запустите Node Exporter на каждом и пропишите их IP в targets.

Шаг 3: Grafana — визуализация

Зайдите на http://ваш-сервер:3000 (логин: admin, пароль: changeme). Добавьте Prometheus как data source (URL http://prometheus:9090).

Импортируйте дашборд 1860 (Node Exporter Full) — это самый популярный шаблон для системных метрик. После импорта увидите красивые графики.

Шаг 4: Loki — логи

Добавьте Loki и Promtail в docker-compose.yml:

  loki:
    image: grafana/loki:latest
    volumes:
      - loki_data:/loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    restart: unless-stopped

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml
    restart: unless-stopped

В Grafana добавьте Loki как data source и используйте Explore для поиска по логам. Все логи контейнеров и системные логи — в одном месте, с поиском и фильтрацией.

Шаг 5: Uptime Kuma — статус сайтов

Для мониторинга доступности сайтов и API отдельным контейнером запустите Uptime Kuma:

  uptime-kuma:
    image: louislam/uptime-kuma:latest
    volumes:
      - uptime_kuma_data:/app/data
    ports:
      - "3001:3001"
    restart: unless-stopped

Uptime Kuma может пинговать, проверять HTTP-статусы, SSL-сертификаты, TCP-порты, DNS-записи. Настройте оповещения в Telegram, Discord или Email.

Шаг 6: Алерты

Prometheus поддерживает Alertmanager для оповещений. Минимальная настройка — правило в prometheus.yml:

rule_files:
  - "alert.rules.yml"

А в alert.rules.yml:

groups:
  - name: node
    rules:
      - alert: HighCPU
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU выше 80% на {{ $labels.instance }}"

Alertmanager можно подключить к Telegram, Email, Slack.

Сколько это стоит по ресурсам

Весь стек на VPS с 2 ГБ RAM:

  • Prometheus: ~200 МБ RAM + диск под данные (зависит от retention)
  • Grafana: ~150 МБ RAM
  • Loki: ~200 МБ RAM
  • Node Exporter: ~50 МБ RAM
  • Promtail: ~100 МБ RAM
  • Uptime Kuma: ~100 МБ RAM

Итого: около 800 МБ RAM за полный мониторинг-стек. Оставшихся 1.2 ГБ хватит на ваши приложения.

Что дальше

С этим стеком вы получаете:

  • Метрики всех серверов в реальном времени
  • Централизованные логи с поиском
  • Красивые дашборды в Grafana
  • Алерты о проблемах
  • Мониторинг доступности сайтов

Когда проект вырастет, можно добавить: cAdvisor (контейнерные метрики), Blackbox Exporter (HTTP/DNS/TCP-проверки), Grafana Tempo (трейсинг).

Никаких $15 за хост. Только ваши данные на вашем сервере.

Официальный сайт Prometheus | Официальный сайт Grafana | Uptime Kuma на GitHub