# Audit ingest — интеграция приложений с Auth Portal Центральный журнал: `GET /api/v1/admin/audit` (только admin). Приложения пишут **локально** и дублируют события в portal. ## Endpoint ``` POST /api/v1/ingest/audit Authorization: Bearer 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": "user@example.com", "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` (не `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)