· 16 мин чтения

Grafana OnCall: управление инцидентами и дежурствами команды админов

Семёнов Евгений Сергеевич, директор АйТи Фреш. Когда в компании больше одного админа и серверы работают круглосуточно — возникает вопрос дежурств. Кто принимает звонок ночью? Кому эскалация, если человек не отвечает 10 минут? Кто заменяет дежурного, когда он в отпуске? Я много лет использовал самописные скрипты на bash и Excel-таблицы с графиками, но в 2024 нашёл Grafana OnCall — бесплатный аналог PagerDuty с открытым кодом. Расскажу, как развернуть его за один день и избавить команду от головной боли с алертами.

Зачем нужен отдельный инструмент для дежурств

Если у вас один админ — хватает Telegram-бота от Grafana или Alertmanager. Как только команда вырастает до 3+ человек — начинаются проблемы. Алерт падает в общий чат, все думают «кто-то разберётся», никто не разбирается. Или дежурный спит и не слышит уведомление. Или он в отпуске, а никто не настроил подмену. Grafana OnCall решает это системно:

Я всегда рекомендую OnCall командам от 3 человек. Одному админу достаточно Telegram и будильника.

Установка через Docker Compose

Официальный способ развёртывания — Docker Compose. Готовим виртуалку Debian 12, ставим Docker и compose plugin, разворачиваем всё одной командой.

sudo apt install -y docker.io docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker

mkdir -p ~/oncall && cd ~/oncall
curl -fsSL https://raw.githubusercontent.com/grafana/oncall/dev/docker-compose.yml -o docker-compose.yml

# Задаём секреты
cat > .env <<EOF
DOMAIN=http://oncall.corp.ru
SECRET_KEY=$(openssl rand -hex 32)
MIRAGE_SECRET_KEY=$(openssl rand -hex 32)
RABBITMQ_PASSWORD=$(openssl rand -hex 16)
MYSQL_PASSWORD=$(openssl rand -hex 16)
EOF

docker compose up -d
docker compose ps

Через 2-3 минуты поднимаются контейнеры: engine, celery, celery_beat, redis, rabbitmq, mysql, nginx. Первый admin создаётся командой docker compose exec engine python manage.py createsuperuser.

Интеграция с основной Grafana

OnCall плагинится в существующую Grafana через админку Plugins. Устанавливаете плагин «Grafana OnCall», указываете URL контейнера (например http://engine:8080) и OnCall API token из CLI. Через минуту в боковом меню Grafana появляется пункт OnCall со всеми возможностями.

# Получение токена для плагина
docker compose exec engine python manage.py issue_invite_for_the_frontend \
  --override --email admin@corp.ru

# Вывод: Invite Token: ey...
# Этот токен вставляем в Grafana → Apps → OnCall → Settings

Расписания дежурств

OnCall поддерживает три типа расписаний. Я всегда начинаю с простого weekly rotation на 2-3 человека, потом уже подкручиваю под реальный график.

ТипКогда использоватьНастройка
WeeklyКоманда 2-4 человека, равномерная нагрузкаКаждый дежурит неделю, смена в понедельник 9:00
DailyБольшая команда, не хочется нагружать одногоСмена ежедневно в 9:00
CustomРабота 2/2, ночные смены, часовые поясаiCal-импорт или вручную через календарь
OverridesОтпуск, болезнь, подмена на деньПерекрытие основного расписания

Настройка: OnCall → Schedules → New Schedule → Rotation. Даёте имя «Ops Weekly», выбираете участников команды, шаг неделя, старт понедельник 9:00. Проверяете в календаре — видите, кто дежурит в следующем месяце.

Эскалация: кого звать и через сколько

Эскалация — это цепочка действий при инциденте. У нас на практике работает такая схема для производственного клиента:

Шаг 1 (immediate):   Telegram → дежурный
Шаг 2 (+5 минут):    SMS → дежурный
Шаг 3 (+10 минут):   Telegram → второй дежурный
Шаг 4 (+10 минут):   Звонок → руководитель отдела
Шаг 5 (+15 минут):   Уведомление в канал #ops-critical

Настройка в OnCall → Escalation Chains → New. Добавляете шаги, между ними задержки, для каждого — получатель. В конце привязываете Escalation Chain к Integration (Alertmanager / Zabbix / Webhook).

Интеграция с Alertmanager

Если используете Prometheus + Alertmanager — интеграция прямая. В OnCall создаёте Integration → Alertmanager, копируете webhook URL, прописываете в alertmanager.yml.

receivers:
  - name: oncall
    webhook_configs:
      - url: https://oncall.corp.ru/integrations/v1/alertmanager/abc123def456/
        send_resolved: true

route:
  receiver: oncall
  group_by: ['alertname','instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

Через пару минут тестовый алерт падает в OnCall: создаётся Alert Group, срабатывает эскалация, дежурный получает уведомление и жмёт ACK или Resolve.

Интеграция с Zabbix через webhook

Для Zabbix делаем обратное: в OnCall интеграция Zabbix, копируем URL, в Zabbix создаём медиа-тип Webhook.

// JavaScript для медиа-типа Zabbix
try {
  Zabbix.log(4, 'OnCall webhook starting');
  var params = JSON.parse(value);
  var req = new HttpRequest();
  req.addHeader('Content-Type: application/json');
  var resp = req.post(params.url, JSON.stringify(params));
  if (req.getStatus() != 200) {
    throw 'Unexpected response code ' + req.getStatus();
  }
  return 'OK';
} catch (err) {
  Zabbix.log(3, 'OnCall webhook error: ' + err);
  throw err;
}

Параметры медиа-типа: url = webhook URL из OnCall, subject = {EVENT.NAME}, message = {EVENT.SEVERITY} + описание. Привязываете к пользователям через User media.

Кейс: переход с Telegram-бота на OnCall в банке

В октябре 2025 обратился клиент — небольшой региональный банк, команда 6 админов, круглосуточный мониторинг критичных сервисов. До нас использовали общий Telegram-чат, алерты часто игнорировались, ночные инциденты разбирали к утру. Один раз пропустили падение процессинга на 40 минут, регулятор выписал штраф.

Мы развернули Grafana OnCall на виртуальной машине в дата-центре МТС, подключили существующие Zabbix и Prometheus, настроили расписание weekly rotation на 5 человек (шестой — руководитель как последний шаг эскалации), каналы Telegram для некритичных и SMS + звонок для critical. Через две недели после внедрения:

Стоимость проекта 185 000 руб за 6 дней, включая обучение команды и написание инструкций.

Каналы уведомлений: что предпочесть

Я всегда раскладываю каналы по критичности, чтобы не разбудить дежурного из-за маленькой проблемы:

Аналитика и post-mortem

OnCall собирает статистику по всем инцидентам: время до ACK, время до резолва, кто принял, кто решил, сколько эскалаций прошло. Еженедельно я экспортирую CSV и разбираю на planning-митинге — почему был всплеск алертов, можно ли оптимизировать пороги, где шумит мониторинг.

# API для экспорта инцидентов
curl -H "Authorization: ${ONCALL_TOKEN}" \
  "https://oncall.corp.ru/api/v1/alert_groups?started_at_gte=2026-04-01" \
  > incidents_april.json

Настроим управление инцидентами под ключ

Разворачиваем Grafana OnCall на вашей инфраструктуре, интегрируем с Zabbix, Prometheus, Alertmanager. Настраиваем расписания, эскалации, каналы уведомлений под вашу команду. За 2-4 рабочих дня.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы по Grafana OnCall

Чем Grafana OnCall отличается от PagerDuty?
OnCall — open-source, разворачивается на собственной инфраструктуре, бесплатный и не зависит от зарубежных SaaS. Функционал приближен к PagerDuty: расписания дежурств, эскалации, интеграции с мониторингом, каналы уведомлений.
Какие каналы уведомлений поддерживаются?
Telegram, Slack, MS Teams, email, webhook, мобильное приложение Grafana IRM, звонок через Twilio или российский шлюз.
Нужен ли отдельный сервер под OnCall?
Для команды до 10 инженеров достаточно виртуалки 2 vCPU / 4 ГБ RAM / 40 ГБ диска. OnCall запускается через Docker Compose вместе с PostgreSQL и Redis.
Как устроена эскалация?
Цепочка шагов: сначала уведомить дежурного, через 5 минут если не принял — следующего, через 10 минут — руководителя, параллельно уведомить в канал Telegram. Последовательность и время настраиваются в UI.
Можно ли интегрировать с Zabbix?
Да, OnCall имеет встроенную интеграцию Zabbix: получаете webhook URL, в Zabbix создаёте медиа-тип webhook и привязываете к пользователю. Алерты сразу падают в OnCall.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.