Структурированный гайд по настройке Grafana Provisioning через YAML-файлы

Гайд по настройке Grafana Provisioning через YAML: datasources, дашборды, алерты. Автоматизация развёртывания мониторинга.

2026.04.19                  


Структурированный гайд по настройке Grafana Provisioning через YAML-файлыСтруктурированный гайд по настройке Grafana Provisioning через YAML-файлы Ниже представлен подробный, структурированный гайд по настройке Grafana Provisioning через YAML-файлы. Материал актуален для Grafana 9–11 (Unified Alerting) и охватывает основные сценарии: источники данных, дашборды, контактные точки и политики уведомлений.


1. Структура директорий provisioning

По умолчанию Grafana ищет конфигурации в /etc/grafana/provisioning/.

Рекомендуемая структура:

/etc/grafana/provisioning/
├── datasources/
│   └── main.yaml
├── dashboards/
│   └── providers.yaml
└── alerting/
    ├── contactpoints.yaml
    ├── policies.yaml
    └── rules.yaml

Важно: Все файлы provisioning должны содержать apiVersion: 1 в начале.


2. Включение provisioning в grafana.ini

Обычно не требуется: Grafana автоматически подхватывает /etc/grafana/provisioning.

Если путь изменён, добавьте в grafana.ini:

[paths]
provisioning = /etc/grafana/provisioning

Файлы дашбордов обновляются автоматически каждые 30 сек. Для datasources и alerting изменения применяются при следующем сканировании или перезапуске сервиса.


3. Datasources (Источники данных)

Файл: /etc/grafana/provisioning/datasources/prometheus.yaml

apiVersion: 1

# Удаляем старые/неактуальные источники при следующем старте
deleteDatasources:
  - name: "Old Prometheus"
    orgId: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: false
    jsonData:
      timeInterval: "15s"
      httpMethod: POST

  - name: PostgreSQL
    type: postgres
    access: proxy
    url: postgres-db:5432
    database: metrics_db
    user: grafana_reader
    secureJsonData:
      password: "${PG_PASSWORD}"
    jsonData:
      sslmode: "require"
      maxOpenConns: 20
      maxIdleConns: 5
      connMaxLifetime: 14400
    editable: false

Ключевые поля:

Поле Описание
apiVersion Версия схемы provisioning (всегда 1)
access proxy (через сервер Grafana) или direct (браузер → источник)
isDefault Источник по умолчанию для новых дашбордов
editable false запрещает редактирование через UI
secureJsonData Хранит пароли/токены (не логируется, шифруется в БД)
${VAR} Поддержка переменных окружения

4. Dashboards (Дашборды)

Файл: /etc/grafana/provisioning/dashboards/providers.yaml

apiVersion: 1

providers:
  - name: "infrastructure"
    orgId: 1
    folder: "Infrastructure"
    folderUid: "infra-metrics"
    type: file
    disableDeletion: false
    editable: true
    allowUiUpdates: false
    updateIntervalSeconds: 30
    options:
      path: /var/lib/grafana/dashboards/infrastructure
      foldersFromFilesStructure: false

  - name: "applications"
    orgId: 1
    folder: "Applications"
    folderUid: "app-metrics"
    type: file
    disableDeletion: true
    editable: false
    allowUiUpdates: false
    options:
      path: /var/lib/grafana/dashboards/apps

Подготовка JSON-файлов дашбордов:

  1. Экспортируйте дашборд через UI: Share → Export → Save JSON
  2. Уберите поля id, uid (если нужно автогенерировать)
  3. Положите файлы в указанные path
  4. Убедитесь, что владелец файлов: grafana:grafana (или UID 472)

Важно:

  • allowUiUpdates: false означает: изменения, сделанные в UI, не перезаписывают YAML. При следующем сканировании UI-изменения сбросятся к версии из файла.

5. Alerting (Unified Alerting, Grafana 9+)

Контактные точки

Файл: /etc/grafana/provisioning/alerting/contactpoints.yaml

apiVersion: 1
contactPoints:
  - orgId: 1
    name: "Telegram Alerts"
    receivers:
      - uid: telegram-main
        type: telegram
        settings:
          bottoken: "${TELEGRAM_BOT_TOKEN}"
          chatid: "${TELEGRAM_CHAT_ID}"
        disableResolveMessage: false

Политики уведомлений

Файл: /etc/grafana/provisioning/alerting/policies.yaml

apiVersion: 1
policies:
  - orgId: 1
    receiver: "Telegram Alerts"
    group_by:
      - grafana_folder
      - alertname
    group_wait: 30s
    group_interval: 5m
    repeat_interval: 4h
    routes:
      - receiver: "Slack Critical"
        matchers:
          - severity = critical
        group_wait: 10s
        continue: false

Правила алертов (опционально)

Правила можно провизионировать, но чаще используют UI или Terraform/Grafana Provider.

Если нужно:

apiVersion: 1
groups:
  - orgId: 1
    name: "system-health"
    folder: "Infrastructure"
    interval: 1m
    rules:
      - uid: node-cpu-high
        title: "High CPU Usage"
        condition: A
        data:
          - refId: A
            datasourceUid: "prometheus"
            model:
              expr: '100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85'
              interval: 15s
              instant: true
        noDataState: "Alerting"
        execErrState: "Error"
        for: 5m

6. Практические рекомендации (Best Practices)

Практика Почему важно
editable: false для datasources Предотвращает дрейф конфигурации через UI
allowUiUpdates: false для dashboards Гарантирует единую версию из Git
Использование ${ENV_VARS} Секреты не попадают в репозиторий
Разделение по средам provisioning/dev/, provisioning/prod/ → разные Docker-компоузы
Версионирование YAML Все provisioning-файлы храните в Git
disableDeletion: true Не удаляет дашборды при перезапуске контейнера

7. Отладка и валидация

1. Проверка логов:

   journalctl -u grafana-server -f
   # или
   docker logs grafana --tail 100 -f

2. Типичные ошибки:

  • invalid yaml → проверьте отступы (2 пробела, не табы)
  • permission deniedchown -R 472:472 /etc/grafana/provisioning
  • folder uid mismatch → убедитесь, что folderUid совпадает или оставьте пустым (Grafana сгенерирует)

3. Проверка статуса в UI:

   `Administration → Provisioning → Status`

8. Готовый docker-compose.yml для тестирования

version: "3.8"
services:
  grafana:
    image: grafana/grafana:11.0.0
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=changeme
      - PG_PASSWORD=secret123
      - TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
      - TELEGRAM_CHAT_ID=-1001234567890
    volumes:
      - ./provisioning/datasources:/etc/grafana/provisioning/datasources
      - ./provisioning/dashboards:/etc/grafana/provisioning/dashboards
      - ./provisioning/alerting:/etc/grafana/provisioning/alerting
      - ./dashboards:/var/lib/grafana/dashboards
      - grafana-storage:/var/lib/grafana
    user: "472"
    restart: unless-stopped

volumes:
  grafana-storage:

После docker compose up -d Grafana автоматически подхватит все YAML-конфиги. Логи покажут статус загрузки каждого файла.