Активность, история и аудит
MonoPbx хранит две связанные записи административной деятельности.
- Журнал аудита показывает, кто, что, когда, откуда и каким способом изменил. Он хранит хеш каждого изменения, но не значения, поэтому его можно хранить долго (7 лет), не храня секреты.
- История изменений настроек сохраняет замаскированные значения до и после каждого изменения настроек, чтобы вы могли увидеть разницу и откатить её.
Журнал аудита

Страница «История звонков» с фильтрами и кнопками экспорта.
Каждая запись содержит исполнителя (user, api_key, device, job или anonymous), канал (ui, api, cli, mcp или system), адрес клиента, action, например auth.login или config.updated, объект (entity_type, entity_id), outcome (success, denied или error) и несколько подробностей, например имена изменённых полей. Канал ui, cli или api — это то, что аутентифицированный клиент передаёт в заголовке X-Mpbx-Channel; ключ API всегда использует канал api.
Сейчас записываются:
- изменения настроек: пользователи, отделы, внутренние номера, устройства, роли и назначения ролей (созданы, изменены, удалены);
- входы в систему, успешные и отклонённые (с причиной, например
wrong_passwordилиlocked), блокировки, выходы, повторное использование refresh-токенов, изменения пароля и двухфакторной аутентификации; - администрирование ролей, ключей API и системных ролей, а также вход системного субъекта в компанию;
- администрирование сертификатов и резервных копий;
- администрирование поставщиков SMS и номеров.
Пока не записываются: использование ключей API, неудачная аутентификация по bearer-токену, создание и приостановка компаний.
Чтение журнала
| Маршрут | Право | Что возвращает |
|---|---|---|
GET /api/v1/audit-log | audit:read (по умолчанию Владелец; у администратора отдела его нет) | Записи вашей компании, сначала новые |
GET /api/v1/system/audit-log | system.audit:read (администратор системы и владелец системы), токен уровня системы | Только записи всей установки |
Действуют обычные параметры списков: limit, cursor, filter=field:op:value и sort. Поля фильтра: ts (gt gte lt lte, RFC 3339), actor_type, actor_id, channel, entity_type, entity_id, outcome (eq) и action (eq или starts_with).
GET /api/v1/audit-log?filter=action:starts_with:auth.&filter=outcome:eq:denied&limit=50
Журнал аудита хранится в ClickHouse. Если clickhouse.url не настроен, маршруты отвечают 503 с кодом MPBX-API-NOT-CONFIGURED; записи ждут в Postgres, пока ClickHouse не станет доступен. Запись существует тогда и только тогда, когда её изменение зафиксировано. У журнала нет маршрута для записи. Цепочка хешей, которая обнаруживала бы подмену человеком с правом записи в ClickHouse, не реализована.
История изменений настроек и откат
GET /api/v1/config-history?filter=entity_type:eq:department&filter=entity_id:eq:<id>&sort=seq
GET /api/v1/config-history/{id}
POST /api/v1/config-history/{id}/revert
Каждая запись показывает, кто, каким способом и когда изменил настройки, а также значения изменённых полей до и после. Записи есть для отделов, пользователей, внутренних номеров, устройств, ролей, назначений ролей и языковых пакетов. Для чтения нужно право audit:read и право чтения соответствующего типа объекта (например, users:read). Записи того типа, который вам читать запрещено, возвращают 404, а не 403.
- Секреты никогда не отображаются. Любое поле, которое содержит секрет (пароль, токен, TOTP, учётные данные, хеш и подобные), показывается как
[masked]. Изменение такого поля указывается только по имени: история может сообщить, что пароль изменился, и ничего больше. - Откат — это новое изменение. Ничего не переписывается, а сам откат попадает в историю и журнал аудита.
- Таблица истории для роли компании допускает только добавление записей.
Для этого в веб-консоли есть страница истории.
События в реальном времени
Записи аудита и изменения настроек также передаются в темах audit и config WebSocket событий тем, у кого есть соответствующие права.