Мониторинг сервисов в homelab: полное руководство

Лучшие инструменты мониторинга для homelab: от базовых метрик до продвинутого наблюдения за сервисами. Полное руководство для самостоятельных хостеров.

Не указано
Алексей Кузнецов
Алексей Кузнецов
Системный администратор5 февраля 2026 г.

Введение и обзор инструментов

Мониторинг — это фундаментальная часть управления любой IT-инфраструктурой, включая homelab. Он позволяет отслеживать состояние систем, выявлять проблемы до их влияния на пользователей и принимать обоснованные решения по оптимизации. Homelab имеет свои особенности: ориентирован на личные проекты, может включать физические и виртуальные машины, часто ограничен по ресурсам.

Настройка базового мониторинга систем

Для сбора системных метрик используем node_exporter из экосистемы Prometheus. Он собирает широкий range метрик ОС и предоставляет их в формате, понятном Prometheus.

wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin
sudo useradd -rs /bin/false node_exporter

Настройка сервиса node_exporter

Создадим systemd сервис для node_exporter, чтобы он запускался автоматически при загрузке системы.

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Мониторинг Docker-контейнеров

Для мониторинга Docker-контейнеров используем cadvisor, который автоматически соберет метрики по всем запущенным контейнерам.

docker run -d \
  --name cadvisor \
  -p 8080:8080 \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  gcr.io/cadvisor/cadvisor:latest

Проверка доступности сервисов

Для проверки доступности сервисов используем blackbox_exporter, который позволяет проверять доступность по HTTP, TCP, ICMP и другим протоколам.

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      method: GET
      headers:
        Host: "example.com"
      no_follow_redirects: false
      fail_if_ssl: false
      fail_if_not_ssl: false
      preferred_ip_protocol: "ip4"
  tcp_connect:
    prober: tcp
    timeout: 5s
  icmp:
    prober: icmp
    timeout: 5s
    icmp:
      preferred_ip_protocol: "ip4"

Настройка сбора логов с Loki и Promtail

Loki — это система агрегации логов, вдохновенная Prometheus. Она хранит метаданные и метки, а сами логи — как объекты в объектном хранилище. Promtail — агент для сбора логов, который отправляет их в Loki.

docker run -d \
  --name loki \
  -p 3100:3100 \
  -v /var/loki:/loki \
  grafana/loki:latest \
  --config.file=/etc/loki/local-config.yaml

docker run -d \
  --name promtail \
  -p 9080:9080 \
  -v /var/log:/var/log \
  -v /etc/promtail:/etc/promtail \
  grafana/promtail:latest \
  -config.file=/etc/promtail/docker-config.yml

Настройка оповещений в Prometheus

Определение SLI/SLO (Service Level Indicator/Objective) — метрик, отражающих качество сервиса, и настройка алертинга на их основе.

groups:
- name: example
  rules:
  - alert: HighErrorRate
    expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High error rate on {{ $labels.instance }}"
      description: "{{ $value }} errors per 5s"
      
  - alert: HighLatency
    expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High latency on {{ $labels.instance }}"
      description: "95th percentile latency is {{ $value }}s"

Визуализация данных в Grafana

Установка и настройка Grafana для визуализации собранных метрик и логов. Создание дашбордов для типичных сервисов.

docker run -d \
  --name grafana \
  -p 3000:3000 \
  -v /var/grafana:/var/lib/grafana \
  grafana/grafana:latest

Примеры запросов для дашбордов

Примеры PromQL запросов для создания дашбордов в Grafana для веб-серверов и баз данных.

# Дашборд для веб-сервера:
# 1. Количество запросов в секунду:
rate(http_requests_total[5m])

# 2. Время ответа:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

# 3. Коды ответов:
sum by (status) (rate(http_requests_total[5m]))

# 4. Использование CPU:
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Дашборд для базы данных:
# 1. Активные подключения:
pg_stat_database_numbackends

# 2. Время выполнения запросов:
pg_stat_database_total_time / pg_stat_database_calls

# 3. Размер свободного места:
pg_database_size / pg_database_total_size

Продвинутые техники мониторинга

Прогнозирование и capacity planning, распределенное трассирование, синтетический мониторинг и A/B тестирование для более комплексного подхода к мониторингу.

# Пример запроса для прогнозирования использования диска:
predict_linear(node_filesystem_avail{job="node"}[24h], 3600 * 24 * 7) < 0

Полная конфигурация для типичного homelab

Пример полной конфигурации для мониторинга типичного homelab с использованием Docker Compose.

version: '3.7'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=200h'
      - '--web.enable-lifecycle'

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana

  loki:
    image: grafana/loki
    container_name: loki
    ports:
      - "3100:3100"
    volumes:
      - ./loki.yml:/etc/loki/local-config.yaml
      - loki_data:/loki

  promtail:
    image: grafana/promtail
    container_name: promtail
    volumes:
      - /var/log:/var/log
      - ./promtail.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager

volumes:
  prometheus_data:
  grafana_data:
  loki_data:
  alertmanager_data:

Как отслеживать ваши сервисы: полное руководство по мониторинга для homelab

Введение

Мониторинг — это фундаментальная часть управления любой IT-инфраструктурой, включая homelab. Он позволяет отслеживать состояние систем, выявлять проблемы до того, как они повлияют на пользователей, и принимать обоснованные решения по оптимизации. В этом руководстве мы рассмотрим полный цикл настройки мониторинга для вашего homelab, от сбора базовых метрик до визуализации данных и настройки оповещений.

Homelab, в отличие от корпоративной среды, имеет свои особенности:

  • Ориентирован на личные проекты и эксперименты
  • Может включать как физические, так и виртуальные машины
  • Часто ограничен по ресурсам (электричество, место, охлаждение)
  • Может содержать как стандартные, так и экспериментальные сервисы

Наша цель — построить систему мониторинга, которая будет:

  • Эффективно использовать ресурсы homelab
  • Предоставлять полную картину состояния инфраструктуры
  • Быть расширяемой и гибкой
  • Не требовать постоянного вмешательства

Базовый мониторинг с использованием встроенных средств

Сбор системных метрик — это основа любого мониторинга. Давайте рассмотрим, как получить основные данные о состоянии ваших систем.

Системные метрики

Для большинства Linux-систем идеальным инструментом является node_exporter из экосистемы Prometheus. Он собирает широкую range метрик ОС и предоставляет их в формате, понятном Prometheus.

Установка node_exporter на Debian/Ubuntu:

wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin
sudo useradd -rs /bin/false node_exporter

Создадим systemd сервис для node_exporter:

# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Запустим и включим сервис:

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Теперь метрики доступны по адресу http://ваш-ip:9100/metrics.

Мониторинг Docker-контейнеров

Для мониторинга Docker-контейнеров можно использовать cadvisor:

docker run -d \
  --name cadvisor \
  -p 8080:8080 \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  gcr.io/cadvisor/cadvisor:latest

Cadvisor автоматически соберет метрики по всем запущенным контейнерам. Доступны они по адресу http://ваш-ip:8080/metrics.

Проверка доступности сервисов

Для проверки доступности сервисов можно использовать blackbox_exporter. Он позволяет проверять доступность по HTTP, TCP, ICMP и другим протоколам.

Установка blackbox_exporter:

wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.24.0/blackbox_exporter-0.24.0.linux-amd64.tar.gz
tar xvfz blackbox_exporter-0.24.0.linux-amd64.tar.gz
sudo cp blackbox_exporter-0.24.0.linux-amd64/blackbox_exporter /usr/local/bin

Создадим конфигурационный файл /etc/blackbox_exporter/config.yml:

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      method: GET
      headers:
        Host: "example.com"
      no_follow_redirects: false
      fail_if_ssl: false
      fail_if_not_ssl: false
      preferred_ip_protocol: "ip4"
  tcp_connect:
    prober: tcp
    timeout: 5s
  icmp:
    prober: icmp
    timeout: 5s
    icmp:
      preferred_ip_protocol: "ip4"

Создадим systemd сервис:

# /etc/systemd/system/blackbox_exporter.service
[Unit]
Description=Blackbox Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/blackbox_exporter --config.file=/etc/blackbox_exporter/config.yml

[Install]
WantedBy=multi-user.target

Запустим и включим сервис:

sudo systemctl daemon-reload
sudo systemctl start blackbox_exporter
sudo systemctl enable blackbox_exporter

Метрики blackbox_exporter теперь доступны по адресу http://ваш-ip:9115/metrics.

Агрегация логов

Сбор и анализ логов — не менее важная часть мониторинга, чем сбор метрик. Рассмотрим настройку централизованного сбора логов с использованием Loki.

Установка Loki

Loki — это система агрегации логов, вдохновенная Prometheus. Она хранит метаданные и метки, а сами логи — как объекты в объектном хранилище.

Установим Loki с помощью Docker:

docker run -d \
  --name loki \
  -p 3100:3100 \
  -v /var/loki:/loki \
  grafana/loki:latest \
  --config.file=/etc/loki/local-config.yaml

Установка Promtail

Promtail — агент для сбора логов, который отправляет их в Loki.

docker run -d \
  --name promtail \
  -p 9080:9080 \
  -v /var/log:/var/log \
  -v /etc/promtail:/etc/promtail \
  grafana/promtail:latest \
  -config.file=/etc/promtail/docker-config.yml

Пример конфигурации для Promtail (/etc/promtail/docker-config.yml):

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log

- job_name: docker
  docker_sd_configs:
    - host: unix:///var/run/docker.sock
      refresh_interval: 5s
  relabel_configs:
    - source_labels: [__meta_docker_container_log_stream]
      target_label: stream
    - source_labels: [__meta_docker_container_name]
      target_label: container_name
  pipeline_stages:
    - json:
        expressions:
          timestamp: time
    - timestamp:
        source: timestamp
        format: RFC3339

Настройка Grafana для просмотра логов

Добавим источник данных Loki в Grafana:

  1. Перейдите в Configuration > Data Sources
  2. Выберите "Add data source"
  3. Выберите Loki
  4. Введите URL: http://loki:3100
  5. Нажмите "Save & Test"

Теперь можно создавать дашборды с логами, добавив панель с типом "Log" и указав нужный запрос.

Наблюдение за состоянием сервисов

Сбор метрик и логов — это основа, но для полноценного мониторинга нам нужно определить, какие именно показатели важны для наших сервисов, и настроить оповещения при отклонении от нормы.

Определение SLI/SLO

SLI (Service Level Indicator) — метрика, отражающая качество сервиса. SLO (Service Level Objective) — целевое значение для SLI.

Для типичных сервисов homelab можно определить следующие SLI:

Веб-сервис:

  • Время отклика (p99 < 500ms)
  • Доступность (99.9%)
  • Код ответа (количество ошибок 5xx < 1%)

База данных:

  • Время выполнения запросов (p95 < 100ms)
  • Количество активных подключений (< 80% от максимума)
  • Размер свободного места на диске (> 10%)

Настройка алертинга в Prometheus

Добавим в Prometheus конфигурацию правил алертинга:

# /etc/prometheus/alerts.yml
groups:
- name: example
  rules:
  - alert: HighErrorRate
    expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High error rate on {{ $labels.instance }}"
      description: "{{ $value }} errors per 5s"
      
  - alert: HighLatency
    expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High latency on {{ $labels.instance }}"
      description: "95th percentile latency is {{ $value }}s"

Для отправки уведомлений настроим Alertmanager:

# /etc/prometheus/alertmanager.yml
global:
  smtp_smarthost: 'localhost:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'password'

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'

receivers:
- name: 'web.hook'
  email_configs:
  - to: 'admin@example.com'
    subject: 'Prometheus Alert'
``### Отслеживание зависимостей

Для отслеживания зависимостей между сервисами можно использовать метрики, которые указывают на вызовы между сервисами:

```yaml
# Пример правила для отслеживания зависимостей
- alert: ServiceDependencyDown
  expr: up{job="service-a"} == 1 and absent(up{job="service-b"})
  for: 1m
  labels:
    severity: critical
  annotations:
    summary: "Service {{ $labels.job }} depends on service-b which is down"
    description: "Service {{ $labels.job }} depends on service-b which is down. This may cause issues."

Визуализация данных

Собранные метрики и логи нужно представить в удобном виде для анализа. Для этой цели отлично подходит Grafana.

Установка Grafana

Установим Grafana с помощью Docker:

docker run -d \
  --name grafana \
  -p 3000:3000 \
  -v /var/grafana:/var/lib/grafana \
  grafana/grafana:latest

Создание дашбордов для типичных сервисов

Дашборд для веб-сервера:

  1. Количество запросов в секунду:

    rate(http_requests_total[5m])
    
  2. Время ответа:

    histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
    
  3. Коды ответов:

    sum by (status) (rate(http_requests_total[5m]))
    
  4. Использование CPU:

    100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
    

Дашборд для базы данных:

  1. Активные подключения:

    pg_stat_database_numbackends
    
  2. Время выполнения запросов:

    pg_stat_database_total_time / pg_stat_database_calls
    
  3. Размер свободного места:

    pg_database_size / pg_database_total_size
    

Настройка кастомных виджетов

Grafana позволяет создавать собственные виджеты с помощью HTML и JavaScript. Для сложных визуализаций можно использовать плагин Grafana Worldmap Panel для отображения расположения серверов или Pie Chart для отображения распределения ресурсов.

Продвинутые техники мониторинга

Прогнозирование и capacity planning

Для прогнозирования будущих метрик можно использовать Prometheus с Predictive Power или VictoriaMetrics с встроенной функцией прогнозирования.

Пример запроса для прогнозирования использования диска:

predict_linear(node_filesystem_avail{job="node"}[24h], 3600 * 24 * 7) < 0

Этот запрос предупредит, если свободное место на диске закончится в течение следующей недели.

Distributed tracing

Для отслеживания запросов между микросервисами можно использовать Jaeger. Интеграция с Prometheus позволяет связывать трейсы с метриками.

Установка Jaeger:

docker run -d \
  --name jaeger \
  -p 16686:16686 \
  -p 5778:5778 \
  jaegertracing/all-in-one:latest

Синтетический мониторинг

Для проверки доступности и производительности с внешних точек можно использовать Uptime Kuma или Freshping.

Установка Uptime Kuma через Docker:

docker run -d \
  --name uptime-kuma \
  -p 3001:3001 \
  --restart=always \
  louislam/uptime-kuma:latest

A/B тестирование и эксперименты

Для мониторинга экспериментов можно использовать Grafana с Experiment Dashboard плагином или StatsD для сбора метрик A/B тестов.

Практические примеры конфигураций

Полная конфигурация для типичного homelab

Вот пример полной конфигурации для мониторинга типичного homelab с использованием Docker Compose:

version: '3.7'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=200h'
      - '--web.enable-lifecycle'

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana

  loki:
    image: grafana/loki
    container_name: loki
    ports:
      - "3100:3100"
    volumes:
      - ./loki.yml:/etc/loki/local-config.yaml
      - loki_data:/loki

  promtail:
    image: grafana/promtail
    container_name: promtail
    volumes:
      - /var/log:/var/log
      - ./promtail.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager

volumes:
  prometheus_data:
  grafana_data:
  loki_data:
  alertmanager_data:

Примеры дашбордов и алертов для разных сервисов

Дашборд для Nextcloud:

  1. Использование CPU и памяти:

    rate(container_cpu_usage_seconds_total{image="nextcloud"}[5m])
    container_memory_usage_bytes{image="nextcloud"}
    
  2. Количество активных пользователей:

    nextcloud_users_num_users
    
  3. Общее количество файлов:

    nextcloud_files_num_files
    

Алерты для Plex:

- alert: PlexHighCPUUsage
  expr: rate(container_cpu_usage_seconds_total{image="plex"}[5m]) > 0.8
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "High CPU usage on Plex"
    description: "Plex CPU usage is {{ $value }} for 5 minutes"

- alert: PlexTranscoderBusy
  expr: plex_sessions_transcoder_count > 0
  for: 10m
  labels:
    severity: info
  annotations:
    summary: "Plex transcoder is busy"
    description: "Plex transcoder has been busy for 10 minutes"

Скрипты автоматизации

Скрипт для автоматического добавления новых хостов в мониторинг:

#!/bin/bash

# Скрипт для добавления нового хоста в Prometheus и перезапуска сервиса

HOST_IP=$1
HOST_NAME=$2

# Добавляем хост в Prometheus конфиг
cat << EOF >> /etc/prometheus/prometheus.yml
  - job_name: '$HOST_NAME'
    static_configs:
      - targets: ['$HOST_IP:9100']
EOF

# Перезапускаем Prometheus
sudo systemctl restart prometheus

# Добавляем хост в Grafana
curl -X POST http://admin:admin@localhost:3000/api/datasources \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Prometheus",
    "type": "prometheus",
    "url": "http://localhost:9090",
    "access": "proxy",
    "basicAuth": false
  }'

curl -X POST http://admin:admin@localhost:3000/api/dashboards/db \
  -H "Content-Type: application/json" \
  -d '{"dashboard": {"id": null, "title": "'"$HOST_NAME"'", "tags": ["'"$HOST_NAME"'"], "timezone": "browser", "panels": [], "time": {"from": "now-6h", "to": "now"}, "timepicker": {}}}'

Заключение

Мы рассмотрели полный цикл настройки мониторинга для homelab: от сбора базовых метрик до визуализации данных и настройки оповещений. Эта система обеспечит вас полной видимостью состояния вашей инфраструктуры и позволит быстро реагировать на возникающие проблемы.

Ключевые выводы:

  • Начните с базового сбора метрик систем и сервисов
  • Централизованное собирание логов значительно упрощает анализ
  • Визуализация данных через Grafana делает мониторинг эффективным
  • Правильно настроенные оповещения позволяют реагировать на проблемы до того, как их заметят пользователи
  • Автоматизация процесса мониторинга экономит время и снижает количество ошибок

Для дальнейшего улучшения системы мониторинга рекомендуется:

  • Экспериментировать с новыми инструментами, такими как Thanos для долгосрочного хранения метрик
  • Настроить динамическое масштабирование оповещений в зависимости от времени суток
  • Внедрить автоматическое создание дашбордов для новых сервисов
  • Регулярно пересматривать и оптимизировать правила алертинга

Полезные ресурсы:

Мониторинг — это непрерывный процесс, который должен адаптироваться под изменяющуюся инфраструктуру. Регулярно обновляйте и улучшайте вашу систему мониторинга, чтобы она всегда соответствовала текущим потребностям вашего homelab.

Поделиться:TelegramX / TwitterVK