Skip to content

Движок вебхуков и отправка уведомлений ​

В RUSEON Core встроен асинхронный Движок вебхуков (internal/events/webhooks.go), отправляющий HTTP POST уведомления в сторонние сервисы, чат-боты (Telegram/Slack) и платформы SIEM при наступлении ключевых системных событий.


1. Поддерживаемые типы событий ​

Имя событияУсловие срабатыванияСодержимое data
camera.onlineКамера подключилась и передаёт потокcamera_id, name, fps, resolution, timestamp
camera.offlineОбрыв связи с камерой / таймаут RTSPcamera_id, last_error, reconnect_count, timestamp
recording.segment_closedСегмент fMP4 закрыт и сохранён в каталогcamera_id, file_path, duration_sec, size_bytes
retention.prunedПланировщик ретенции удалил старые записиcamera_id, deleted_files_count, freed_bytes
ai.detectionСрабатывание правила видеоаналитикиcamera_id, class_name, confidence, bounding_box

2. Формат тела запроса и подпись HMAC-SHA256 ​

Каждый запрос содержит системные HTTP-заголовки безопасности и трассировки:

  • Content-Type: application/json
  • X-Ruseon-Event: camera.offline
  • X-Ruseon-Delivery: d8f3a9e1-5b2c-4e89-a1b7-99c0e4811a2f
  • X-Ruseon-Signature: sha256=2c5c... (Хэш HMAC-SHA256, вычисленный от тела с помощью webhook.secret)

Пример JSON-тела вебхука: ​

json
{
  "event": "camera.offline",
  "delivery_id": "d8f3a9e1-5b2c-4e89-a1b7-99c0e4811a2f",
  "timestamp": 1786802400,
  "data": {
    "camera_id": "cam_entrance_01",
    "name": "Главный въезд",
    "last_error": "RTSP connection reset by peer",
    "reconnect_count": 3
  }
}

3. Пример проверки подписи вебхука (Node.js) ​

javascript
const express = require('express');
const crypto = require('crypto');

const app = express();
app.use(express.raw({ type: 'application/json' }));

const WEBHOOK_SECRET = 'your_configured_webhook_secret';

app.post('/api/ruseon-webhook', (req, res) => {
  const signature = req.headers['x-ruseon-signature'];
  const hmac = crypto.createHmac('sha256', WEBHOOK_SECRET);
  const digest = 'sha256=' + hmac.update(req.body).digest('hex');

  if (signature !== digest) {
    return res.status(401).send('Неверная подпись HMAC');
  }

  const payload = JSON.parse(req.body.toString());
  console.log(`Получено событие ${payload.event} для камеры ${payload.data.camera_id}`);
  res.status(200).send('OK');
});

app.listen(3000);

4. Конфигурация в config.yaml ​

yaml
webhooks:
  enabled: true
  endpoints:
    - url: "https://api.company.com/v1/ruseon-events"
      secret: "your_configured_webhook_secret"
      events:
        - "camera.online"
        - "camera.offline"
        - "ai.detection"
      timeout: "5s"
      max_retries: 3
      circuit_breaker:
        failure_threshold: 5
        cooldown_period: "60s"

Связанная документация ​

Released under the MIT License.