Структурированный гайд по настройке 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-файлов дашбордов:
- Экспортируйте дашборд через UI:
Share → Export → Save JSON - Уберите поля
id,uid(если нужно автогенерировать) - Положите файлы в указанные
path - Убедитесь, что владелец файлов:
grafana:grafana(или UID472)
Важно:
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 denied→chown -R 472:472 /etc/grafana/provisioningfolder 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-конфиги. Логи покажут статус загрузки каждого файла.