- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
221 lines
7.9 KiB
Markdown
221 lines
7.9 KiB
Markdown
# Система аудита и аналитики
|
||
|
||
## Обзор
|
||
|
||
Реализована комплексная система аудита, логирования действий пользователей и расширенной аналитики для дашборда.
|
||
|
||
## Компоненты системы
|
||
|
||
### 1. Система аудита (`lib/audit/`)
|
||
|
||
#### `audit-service.ts`
|
||
- **Создание записей аудита** - логирование всех изменений данных
|
||
- **История изменений** - получение истории для конкретного ресурса
|
||
- **Поиск записей** - фильтрация по пользователю, действию, типу ресурса, датам, IP адресу
|
||
- **Откат изменений** - восстановление предыдущего состояния
|
||
- **Экспорт логов** - экспорт в JSON или CSV
|
||
|
||
#### `user-activity-logger.ts`
|
||
- **Логирование действий пользователей:**
|
||
- Просмотр данных (`logView`)
|
||
- Создание записей (`logCreate`)
|
||
- Изменение записей (`logUpdate`)
|
||
- Удаление записей (`logDelete`)
|
||
- Экспорт данных (`logExport`)
|
||
- Использование ИИ агента (`logAIAgentUsage`)
|
||
|
||
### 2. API Endpoints
|
||
|
||
#### `/api/audit`
|
||
- `GET /api/audit` - поиск записей аудита с фильтрами
|
||
- `GET /api/audit?format=json|csv` - экспорт логов
|
||
- `GET /api/audit/[resourceType]/[resourceId]` - история изменений ресурса
|
||
- `POST /api/audit/rollback` - откат изменений
|
||
|
||
#### `/api/analytics`
|
||
- `GET /api/analytics?type=timeseries` - данные для графиков по времени
|
||
- `GET /api/analytics?type=compare` - сравнение периодов
|
||
- `GET /api/analytics?type=forecast` - прогнозирование
|
||
- `GET /api/analytics?type=activity` - статистика активности пользователей
|
||
|
||
#### `/api/logs/search`
|
||
- `GET /api/logs/search` - поиск по всем логам (файловым и БД)
|
||
|
||
### 3. Страница истории изменений
|
||
|
||
**Путь:** `/audit-history`
|
||
|
||
**Функционал:**
|
||
- Просмотр всех записей аудита
|
||
- Фильтрация по действию, типу ресурса, датам, поиск
|
||
- Просмотр деталей изменений (старые/новые значения)
|
||
- Откат изменений (для UPDATE операций)
|
||
- Экспорт в CSV или JSON
|
||
|
||
### 4. Система логирования
|
||
|
||
#### Ротация логов (`lib/logs/log-rotation.ts`)
|
||
- **По размеру** - удаление файлов, превышающих лимит
|
||
- **По времени** - удаление старых файлов (настраиваемый retention)
|
||
- **Очистка БД** - удаление старых записей из `audit_log`
|
||
|
||
**Команда:** `npm run logs:rotate`
|
||
|
||
#### Поиск по логам (`lib/logs/log-search.ts`)
|
||
- Поиск в файловых логах (JSON формат)
|
||
- Поиск в базе данных (audit_log)
|
||
- Комплексный поиск по всем источникам
|
||
|
||
### 5. Аналитика (`lib/analytics/analytics-service.ts`)
|
||
|
||
#### Временные ряды
|
||
- Группировка по дням, неделям, месяцам
|
||
- Поддержка различных типов ресурсов (aircraft, risks, audits)
|
||
|
||
#### Сравнение периодов
|
||
- Текущий период vs предыдущий период
|
||
- Расчет изменений в процентах
|
||
- Определение тренда (рост/падение/стабильно)
|
||
|
||
#### Прогнозирование
|
||
- Простое линейное прогнозирование на основе исторических данных
|
||
- Настраиваемый период прогноза
|
||
|
||
#### Статистика активности
|
||
- Общее количество действий
|
||
- Распределение по типам действий
|
||
- Топ пользователей по активности
|
||
|
||
## Использование
|
||
|
||
### Интеграция логирования в API endpoints
|
||
|
||
```typescript
|
||
import { logCreate, logUpdate, logDelete, getClientIP, getUserAgent } from '@/lib/audit/user-activity-logger';
|
||
|
||
// При создании записи
|
||
await logCreate('aircraft', newAircraftId, newValues, userId, ipAddress, userAgent);
|
||
|
||
// При изменении записи
|
||
await logUpdate('aircraft', aircraftId, oldValues, newValues, userId, ipAddress, userAgent);
|
||
|
||
// При удалении записи
|
||
await logDelete('aircraft', aircraftId, oldValues, userId, ipAddress, userAgent);
|
||
```
|
||
|
||
### Получение истории изменений
|
||
|
||
```typescript
|
||
import { getAuditHistory } from '@/lib/audit/audit-service';
|
||
|
||
const history = await getAuditHistory('aircraft', aircraftId, 50);
|
||
```
|
||
|
||
### Поиск записей аудита
|
||
|
||
```typescript
|
||
import { searchAuditLogs } from '@/lib/audit/audit-service';
|
||
|
||
const { logs, total } = await searchAuditLogs({
|
||
userId: 'user-id',
|
||
action: 'UPDATE',
|
||
resourceType: 'aircraft',
|
||
startDate: new Date('2025-01-01'),
|
||
endDate: new Date('2025-01-31'),
|
||
}, 100, 0);
|
||
```
|
||
|
||
### Откат изменений
|
||
|
||
```typescript
|
||
import { rollbackChange } from '@/lib/audit/audit-service';
|
||
|
||
const success = await rollbackChange(auditLogId);
|
||
```
|
||
|
||
## Настройка
|
||
|
||
### Ротация логов
|
||
|
||
Создайте cron job для автоматической ротации:
|
||
|
||
```bash
|
||
# Ежедневно в 2:00
|
||
0 2 * * * cd /path/to/project && npm run logs:rotate
|
||
```
|
||
|
||
Или используйте системный таймер (systemd):
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Rotate KLG logs
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=oneshot
|
||
WorkingDirectory=/path/to/project
|
||
ExecStart=/usr/bin/npm run logs:rotate
|
||
|
||
[Timer]
|
||
OnCalendar=daily
|
||
OnCalendar=02:00
|
||
|
||
[Install]
|
||
WantedBy=timers.target
|
||
```
|
||
|
||
### Retention период
|
||
|
||
Настройте в `.env.local`:
|
||
|
||
```env
|
||
AUDIT_LOG_RETENTION_DAYS=90
|
||
LOG_RETENTION_DAYS=30
|
||
LOG_MAX_SIZE=10485760 # 10MB
|
||
LOG_MAX_FILES=10
|
||
```
|
||
|
||
## Структура данных
|
||
|
||
### Таблица `audit_log`
|
||
|
||
```sql
|
||
CREATE TABLE audit_log (
|
||
id UUID PRIMARY KEY,
|
||
user_id UUID REFERENCES users(id),
|
||
action VARCHAR(100) NOT NULL,
|
||
resource_type VARCHAR(100) NOT NULL,
|
||
resource_id UUID NOT NULL,
|
||
old_values JSONB,
|
||
new_values JSONB,
|
||
ip_address VARCHAR(45),
|
||
user_agent TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### Партиционирование
|
||
|
||
Таблица `audit_log` партиционирована по месяцам для оптимизации производительности при больших объемах данных.
|
||
|
||
## Безопасность
|
||
|
||
- Все действия пользователей логируются
|
||
- IP адреса и User-Agent сохраняются для аудита безопасности
|
||
- Откат изменений требует подтверждения
|
||
- Экспорт логов доступен только авторизованным пользователям
|
||
- Rate limiting на всех API endpoints
|
||
|
||
## Производительность
|
||
|
||
- Индексы на часто используемых полях
|
||
- Партиционирование таблицы audit_log
|
||
- Пагинация результатов поиска
|
||
- Кэширование статистики (опционально через Redis)
|
||
|
||
## Мониторинг
|
||
|
||
- Логи аудита доступны через страницу `/audit-history`
|
||
- Статистика активности через `/api/analytics?type=activity`
|
||
- Автоматическая ротация предотвращает переполнение диска
|