quality / commitlint (push) Skipped
quality / changes (push) Successful in 7s
quality / docker-check (push) Skipped
quality / web (push) Successful in 40s
quality / api (push) Successful in 36s
CD / quality (push) Successful in 1m37s
CD / publish (push) Successful in 1m40s
Регистрация mm в каталоге приложений, permissions mm:*, target-app и docs. Co-authored-by: Cursor <[email protected]>
64 lines
2.0 KiB
Markdown
64 lines
2.0 KiB
Markdown
# Audit ingest — интеграция приложений с Auth Portal
|
||
|
||
Центральный журнал: `GET /api/v1/admin/audit` (только admin).
|
||
Приложения пишут **локально** и дублируют события в portal.
|
||
|
||
## Endpoint
|
||
|
||
```
|
||
POST /api/v1/ingest/audit
|
||
Authorization: Bearer <AUDIT_INGEST_SECRET>
|
||
Content-Type: application/json
|
||
```
|
||
|
||
### Body
|
||
|
||
```json
|
||
{
|
||
"events": [
|
||
{
|
||
"event_id": "uuid-unique-per-event",
|
||
"source_app": "vps",
|
||
"action": "vps.vps.create",
|
||
"severity": "info",
|
||
"actor_user_id": "…",
|
||
"actor_email": "[email protected]",
|
||
"actor_name": "Name",
|
||
"target_type": "app_resource",
|
||
"target_id": "entity-id",
|
||
"summary": "Человекочитаемое описание",
|
||
"details": { "entity": "vps", "diff": {} },
|
||
"ip": "1.2.3.4",
|
||
"created_at": "2026-07-21T00:00:00.000Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
- `events`: 1–50 за запрос
|
||
- `source_app`: `vps` | `cfdm` | `bgp` | `fw` | `dns` | `cdn` | `mm` (не `portal`)
|
||
- `event_id`: идемпотентность (дубликаты → `duplicates++`)
|
||
- Ответ: `{ "accepted": N, "duplicates": M }`
|
||
|
||
## Env
|
||
|
||
| Где | Переменная |
|
||
|-----|------------|
|
||
| auth-portal | `AUDIT_INGEST_SECRET` |
|
||
| apps (vps / cfdm / bgp / fw / cdn) | `AUTH_PORTAL_URL` + `AUTH_AUDIT_INGEST_SECRET` (тот же секрет) |
|
||
|
||
Dev default secret: `dev-audit-ingest-secret`.
|
||
|
||
## Dual-write
|
||
|
||
1. Записать в локальный `audit_log`
|
||
2. Fire-and-forget `POST` в portal (timeout ~2s)
|
||
3. Ошибка push **не** должна ломать CRUD
|
||
|
||
## Фильтры admin UI
|
||
|
||
- `/admin/audit` — source_app + type tabs + range
|
||
- Клик по пользователю на `/admin` — Sheet с событиями, где `actor_user_id` или `target_id` = user id
|
||
|
||
Preview: [solution-users-1](https://reui.io/preview/base/solution-users-1) · [solution-users-6](https://reui.io/preview/base/solution-users-6)
|