Проект: Log Storage Service

REST API для сбора и анализа логов с асинхронной обработкой и мониторингом

Задачи проекта:

Ключевые функции:

🔐 Безопасность и доступ

  • Авторизация по 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" }

Особенности реализации

Архитектурные решения