Skip to content

Commit 71c2a0f

Browse files
committed
docs: оформить полноценный README проекта
- Добавлены бейджи CI/CD и технологического стека - Описаны архитектура, API маппинг, запуск и observability - Добавлены разделы по тестам, CI/CD и релизному процессу
1 parent 700c5bd commit 71c2a0f

File tree

1 file changed

+272
-1
lines changed

1 file changed

+272
-1
lines changed

README.md

Lines changed: 272 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,274 @@
11
# Task Manager FastAPI
22

3-
WIP: документация будет добавлена после завершения основных этапов разработки.
3+
[![CI](https://github.com/RomanVetrov/Task-Manager-FastAPI/actions/workflows/ci.yml/badge.svg)](https://github.com/RomanVetrov/Task-Manager-FastAPI/actions/workflows/ci.yml)
4+
[![CD](https://github.com/RomanVetrov/Task-Manager-FastAPI/actions/workflows/cd.yml/badge.svg)](https://github.com/RomanVetrov/Task-Manager-FastAPI/actions/workflows/cd.yml)
5+
[![Python](https://img.shields.io/badge/Python-3.12-3776AB?logo=python&logoColor=white)](https://www.python.org/)
6+
[![FastAPI](https://img.shields.io/badge/FastAPI-0.135-009688?logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com/)
7+
[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-336791?logo=postgresql&logoColor=white)](https://www.postgresql.org/)
8+
[![Redis](https://img.shields.io/badge/Redis-7-DC382D?logo=redis&logoColor=white)](https://redis.io/)
9+
[![Docker](https://img.shields.io/badge/Docker-Compose-2496ED?logo=docker&logoColor=white)](https://www.docker.com/)
10+
[![Prometheus](https://img.shields.io/badge/Prometheus-Metrics-E6522C?logo=prometheus&logoColor=white)](https://prometheus.io/)
11+
[![Grafana](https://img.shields.io/badge/Grafana-Dashboard-F46800?logo=grafana&logoColor=white)](https://grafana.com/)
12+
[![Jaeger](https://img.shields.io/badge/Jaeger-Tracing-66CFE3)](https://www.jaegertracing.io/)
13+
[![Ruff](https://img.shields.io/badge/Ruff-Lint%2FFormat-D7FF64)](https://docs.astral.sh/ruff/)
14+
[![Pytest](https://img.shields.io/badge/Pytest-Tests-0A9EDC?logo=pytest&logoColor=white)](https://docs.pytest.org/)
15+
16+
Практический backend-проект на FastAPI с акцентом на:
17+
- безопасную auth-логику (JWT access + refresh, Argon2, rate limit)
18+
- чистую слоистую архитектуру (routes/services/repositories/models)
19+
- полноценную наблюдаемость (logs + metrics + tracing)
20+
- production-ready инфраструктуру (Docker, CI/CD, GHCR)
21+
22+
## Что реализовано
23+
24+
- Регистрация, логин, refresh, logout, endpoint `/me`
25+
- CRUD задач с валидацией дедлайна и ownership-check
26+
- CRUD тегов и связь many-to-many `Task <-> Tag`
27+
- Ограничение запросов по IP для auth-ручек через Redis Lua script
28+
- Корреляция запросов через `X-Request-ID`
29+
- Структурированные JSON-логи с `trace_id` и `span_id`
30+
- Метрики Prometheus и готовый Grafana dashboard
31+
- Трейсинг FastAPI + SQLAlchemy + Redis в Jaeger
32+
- Нагрузочные сценарии в Locust
33+
- Unit / API / Integration тесты, coverage, pre-commit, Ruff
34+
35+
## Технологический стек
36+
37+
| Слой | Инструменты |
38+
|---|---|
39+
| API | FastAPI, Pydantic |
40+
| Бизнес-логика | Services, Repositories |
41+
| БД | PostgreSQL, SQLAlchemy 2.0 (async), Alembic |
42+
| Кэш / лимиты | Redis |
43+
| Безопасность | JWT (access/refresh), Argon2, rate limiting |
44+
| Observability | Structlog, Prometheus, Grafana, OpenTelemetry, Jaeger |
45+
| Тесты | Pytest, pytest-asyncio, httpx, pytest-cov |
46+
| Инфраструктура | Docker, Docker Compose, GitHub Actions, GHCR |
47+
| Инструменты | uv, Ruff, pre-commit, Just |
48+
49+
## Архитектура и маппинг
50+
51+
### Доменные сущности
52+
53+
- `User` -> `Task` = `1:N`
54+
- `Task` -> `Tag` = `N:M` через `task_tags`
55+
56+
### Слои
57+
58+
- `app/routes`
59+
HTTP-слой: валидация входа/выхода, статус-коды, DI
60+
- `app/services`
61+
Бизнес-правила: auth-flow, проверка активного пользователя, логика задач/тегов
62+
- `app/repositories`
63+
Изоляция SQL-запросов
64+
- `app/models` + `app/schemas`
65+
SQLAlchemy-модели и Pydantic-контракты
66+
- `app/security`, `app/limits`
67+
JWT, password hashing, refresh guard, rate limit
68+
- `app/middleware`, `app/metrics`, `app/telemetry`
69+
Логирование, метрики, трейсинг
70+
71+
## API маппинг
72+
73+
Префикс API: `/api/v1`
74+
75+
### Auth
76+
77+
- `POST /auth/register`
78+
- `POST /auth/login`
79+
- `POST /auth/refresh`
80+
- `POST /auth/logout`
81+
- `GET /auth/me`
82+
83+
### Tasks
84+
85+
- `POST /tasks`
86+
- `GET /tasks`
87+
- `GET /tasks/{task_id}`
88+
- `PATCH /tasks/{task_id}`
89+
- `DELETE /tasks/{task_id}`
90+
- `POST /tasks/{task_id}/tags/{tag_id}`
91+
- `DELETE /tasks/{task_id}/tags/{tag_id}`
92+
93+
### Tags
94+
95+
- `POST /tags`
96+
- `GET /tags`
97+
- `GET /tags/{tag_id}`
98+
- `PATCH /tags/{tag_id}`
99+
- `DELETE /tags/{tag_id}`
100+
101+
### Service endpoints
102+
103+
- `GET /metrics`
104+
- `GET /api/v1/health/db`
105+
- `GET /api/v1/health/redis`
106+
107+
## Локальный запуск через Docker Compose
108+
109+
### 1. Подготовить `.env`
110+
111+
Минимально нужны:
112+
113+
```env
114+
POSTGRES_PASSWORD=your_strong_password
115+
SECRET_KEY=your_secret_key_min_32_chars
116+
GRAFANA_ADMIN_USER=admin
117+
GRAFANA_ADMIN_PASSWORD=admin
118+
```
119+
120+
### 2. Поднять сервисы
121+
122+
```bash
123+
just up
124+
```
125+
126+
### 3. Открыть сервисы
127+
128+
```bash
129+
just urls
130+
```
131+
132+
Ожидаемые адреса:
133+
134+
- API docs: `http://localhost:8000/docs`
135+
- Prometheus: `http://localhost:9090`
136+
- Grafana: `http://localhost:3000`
137+
- Jaeger: `http://localhost:16686`
138+
- Locust: `http://localhost:8089`
139+
140+
## Запуск без Docker (режим разработки)
141+
142+
```bash
143+
uv sync --frozen --dev
144+
uv run uvicorn app.main:app --reload
145+
```
146+
147+
Важно: для полного функционала нужны PostgreSQL и Redis.
148+
149+
## Наблюдаемость
150+
151+
### Logs
152+
153+
- middleware пишет JSON-логи запроса/ответа
154+
- каждый запрос получает `X-Request-ID`
155+
- в лог автоматически добавляются `trace_id` и `span_id`
156+
157+
### Metrics
158+
159+
- endpoint: `GET /metrics`
160+
- базовые метрики:
161+
- `http_requests_total`
162+
- `http_request_duration_seconds`
163+
164+
### Tracing
165+
166+
- OpenTelemetry включен по умолчанию
167+
- экспорт в Jaeger по OTLP (`4317`)
168+
- есть спаны для auth/jwt/password операций и инфраструктурных вызовов
169+
170+
## Нагрузочное тестирование
171+
172+
Locust-сценарии находятся в `load/locustfile.py`.
173+
174+
Запуск UI-режима:
175+
176+
```bash
177+
just load
178+
```
179+
180+
Headless-режим:
181+
182+
```bash
183+
just load-headless users=100 spawn=10 run_time=10m
184+
```
185+
186+
## Тесты и качество кода
187+
188+
Основные команды:
189+
190+
```bash
191+
just test
192+
just test-unit
193+
just test-integration
194+
just test-cov
195+
just lint
196+
just format
197+
```
198+
199+
Pre-commit:
200+
201+
```bash
202+
just pre-commit-install
203+
just pre-commit-run
204+
```
205+
206+
## CI/CD
207+
208+
### CI (`.github/workflows/ci.yml`)
209+
210+
На каждый `push` и `pull_request` в `main`:
211+
- Ruff lint + format check
212+
- тесты с coverage и JUnit artifact
213+
- проверка Docker build
214+
215+
### CD (`.github/workflows/cd.yml`)
216+
217+
Триггеры:
218+
- тег формата `v*.*.*`
219+
- ручной запуск (`workflow_dispatch`)
220+
221+
Результат:
222+
- сборка и публикация Docker image в GHCR
223+
224+
## Релизный поток
225+
226+
1. Пуш в `main` и зеленый CI
227+
2. Создание тега версии
228+
3. Публикация image в GHCR через CD
229+
230+
Пример:
231+
232+
```bash
233+
git tag v0.1.0
234+
git push origin v0.1.0
235+
```
236+
237+
## GHCR package
238+
239+
После релиза образ доступен в GitHub Packages репозитория.
240+
Пример pull:
241+
242+
```bash
243+
docker pull ghcr.io/romanvetrov/task-manager-fastapi:v0.1.0
244+
```
245+
246+
## Структура проекта
247+
248+
```text
249+
app/
250+
routes/ # HTTP endpoints
251+
services/ # бизнес-логика
252+
repositories/ # работа с БД
253+
models/ # SQLAlchemy модели
254+
schemas/ # Pydantic схемы
255+
security/ # JWT, password, auth dependencies
256+
limits/ # rate-limit зависимости и сервис
257+
middleware.py # request id, logging, metrics
258+
telemetry.py # OpenTelemetry setup
259+
tests/
260+
unit/
261+
api/
262+
integration/
263+
monitoring/
264+
prometheus.yml
265+
grafana/
266+
load/
267+
locustfile.py
268+
```
269+
270+
## Что дальше
271+
272+
- SonarCloud quality gate
273+
- финальная полировка README примерами API-ответов
274+
- разворот CD в отдельную deployment-среду

0 commit comments

Comments
 (0)