Движок вебхуков и отправка уведомлений
В RUSEON Core встроен асинхронный Движок вебхуков (internal/events/webhooks.go), отправляющий HTTP POST уведомления в сторонние сервисы, чат-боты (Telegram/Slack) и платформы SIEM при наступлении ключевых системных событий.
1. Поддерживаемые типы событий
| Имя события | Условие срабатывания | Содержимое data |
|---|---|---|
camera.online | Камера подключилась и передаёт поток | camera_id, name, fps, resolution, timestamp |
camera.offline | Обрыв связи с камерой / таймаут RTSP | camera_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/jsonX-Ruseon-Event: camera.offlineX-Ruseon-Delivery: d8f3a9e1-5b2c-4e89-a1b7-99c0e4811a2fX-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"