Files
samreshu_docs/architecture/overview.md
Anton 99cd8ae727 docs: add full project documentation
- Architecture: overview, 7 ADR, tech stack
- Principles: code-style, git-workflow, security
- API contracts: auth, profile, tests, admin endpoints
- Database schema: tables, relationships, indexes
- LLM strategy: prompts, fallback, validation, Qwen 2.5 14B
- Onboarding: setup, Docker, .env template
- Progress: roadmap, changelog
- Agents: context, backend instructions

Made-with: Cursor
2026-03-04 12:07:17 +03:00

78 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Общая архитектура
## Tech stack
| Слой | Технология | Назначение |
| ------ | ----------- | ------------ |
| Backend | Fastify + TypeScript | REST API сервер |
| ORM | Drizzle ORM | Типизированный доступ к БД |
| Database | PostgreSQL | Основное хранилище |
| Cache | Redis | Кэш вопросов, сессии, rate limiting |
| Frontend | React + TypeScript + Vite | SPA клиент |
| LLM | Локальный LLM (dev), облачный API (prod) | Генерация вопросов |
| Логирование | Pino | Структурированные JSON-логи |
| Мониторинг ошибок | Sentry | Отлов ошибок в production |
| Deploy | VPS + Docker Compose | Хостинг |
## Схема взаимодействия
```mermaid
flowchart TB
Browser["Browser (React SPA)"]
API["Fastify API"]
DB["PostgreSQL"]
Cache["Redis"]
LLM["LLM Service"]
LocalLLM["Local LLM (dev)"]
CloudLLM["Cloud API (prod)"]
Browser -->|"HTTP/JSON"| API
API --> DB
API --> Cache
API --> LLM
LLM --> LocalLLM
LLM --> CloudLLM
```
## Структура репозиториев
```text
samreshu-backend Fastify + TS + Drizzle
samreshu-frontend React + TS + Vite
samreshu-docs Документация, ADR, прогресс
```
Общие типы хранятся в каждом репо отдельно — без отдельного shared-пакета.
## Архитектурные принципы
Принципы, не обсуждаемые при написании любого кода:
### 1. Подписка читается из БД через middleware
`user.plan` всегда определяется через subscription middleware. Права никогда не хардкодятся в контроллерах.
### 2. Снепшот вопросов при старте теста
Вопросы копируются в `test_questions` при создании теста. Во время прохождения теста `question_bank` никогда не читается напрямую.
### 3. LLM-вызовы только через LlmService
Остальной код не знает, какая модель работает. Провайдер, URL и ключ задаются через переменные окружения.
### 4. Валидация внешних данных по JSON-схеме
Все внешние события (webhooks, ответы LLM) валидируются. Внешним данным не доверяем без проверки.
### 5. Проверки прав и лимитов только на backend
Frontend только отображает состояние. Все авторизационные решения принимаются на сервере.
### 6. Все даты в UTC
Хранение и передача дат — UTC. Конвертация в часовой пояс пользователя только на фронте.
### 7. Конфигурация через переменные окружения
Никаких хардкодов. Все настройки (БД, Redis, LLM, ключи) читаются из `.env`.