Проект: Log Storage Service
REST API для сбора и анализа логов с асинхронной обработкой и мониторингом
Задачи проекта:
- Создание REST API для сбора логов через HTTP POST
- Реализация системы фильтрации и пагинации записей
- Авторизация по токену с ролями admin/user
- Асинхронная обработка запросов для высокой нагрузки
- Интеграция Grafana для визуализации и мониторинга
- Автоматическая очистка старых записей (retention policy)
- Строгая валидация данных через Pydantic
Ключевые функции:
🔐 Безопасность и доступ
- Авторизация по Bearer токенам
- Две роли: admin и user
- Хранение хэшей токенов (SHA256 + PEPPER)
- HTTPS через Caddy
🚀 Производительность
- Асинхронная архитектура FastAPI
- GIN-индексы для полнотекстового поиска
- Оптимизированные запросы к PostgreSQL
- Автоматический реконнект к БД
📊 Гибкость данных
- Поддержка двух форматов ввода
- Расширенная фильтрация по всем полям
- Автоматическая очистка старых записей
- Мощная валидация через Pydantic
Технологический стек:
Backend
- Python 3.11 + FastAPI
- PostgreSQL + asyncpg
- Pydantic для валидации
- Uvicorn ASGI сервер
Инфраструктура
- Docker + Docker Compose
- Caddy (обратный прокси + HTTPS)
- Grafana для визуализации
База данных
- Миграции с Alembic
- GIN-индексы для поиска
- Автоматический retention
- Изолированные пользователи БД
Деплой и настройка
# Запуск через Docker Compose
version: '3.8'
services:
app:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@postgres:5432/logs_db
- RETENTION_DAYS=30
depends_on:
- postgres
postgres:
image: postgres:15
environment:
- POSTGRES_DB=logs_db
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
postgres_data:
Примеры работы API
Сохранение логов (POST /api/v1/logs)
# Формат массива
curl -X POST "https://example.com/api/v1/logs" \
-H "Authorization: Bearer admin_token_123" \
-H "Content-Type: application/json" \
-d '[
"+1234567890", "sender123", "", "Hello!", "telegram",
"promt_001", "gpt-5", "...my_api_key", 100, 80, 20,
"no errors", "last function log", "node-01", 10000
]'
# Формат объекта
{
"channel_id": "channel_001",
"user_social_id": "user_123",
"user_message": "Привет!",
"bot_reply": "Здравствуйте!",
"channel_name": "telegram",
"bot_id": "bot_001",
"llm": "gpt-4",
"api_key": "sk-...",
"tokens_total": 150,
"tokens_in_source": 50,
"tokens_out_source": 100,
"tokens_user": 10000,
"function_error": null,
"function_call_params": "weather('Moscow')",
"server_name": "node-01"
}
Получение логов (GET /api/v1/logs)
# Запрос с фильтрами и пагинацией
GET /api/v1/logs?from=2024-01-01T00:00:00Z&to=2024-01-31T23:59:59Z
&channel_id=channel_001&page=1&page_size=20&sort_by=created_at&order=desc
# Ответ
{
"page": 1,
"page_size": 20,
"total": 150,
"items": [
{
"id": 123,
"channel_id": "channel_001",
"user_social_id": "user_123",
"user_message": "Привет!",
"bot_reply": "Здравствуйте!",
"created_at": "2024-01-15T10:30:00Z",
...
}
]
}
Генерация токенов (POST /api/v1/tokens/generate)
# Запрос (только для admin)
POST /api/v1/tokens/generate
{
"role": "user",
"comment": "Для внешнего сервиса",
"expires_at": "2024-12-31T23:59:59Z"
}
# Ответ
{
"token": "user_xyz_abcdef123456",
"role": "user"
}
Особенности реализации
Архитектурные решения
- Асинхронная обработка: FastAPI + asyncpg для высокой производительности
- Два формата ввода: Поддержка массива и объекта для обратной совместимости
- Расширенный поиск: GIN-индексы для полнотекстового поиска по всем текстовым полям
- Безопасность: Валидация всех данных через Pydantic, защита от инъекций
- Мониторинг: Интеграция Grafana для профессиональной визуализации
- Автоматизация: Retention policy для управления объемом данных