https://github.com/1111mp/fastapi-app
一个基于 FastAPI + PostgreSQL + Redis + Taskiq + APScheduler 的后端服务模板
https://github.com/1111mp/fastapi-app
Last synced: 29 days ago
JSON representation
一个基于 FastAPI + PostgreSQL + Redis + Taskiq + APScheduler 的后端服务模板
- Host: GitHub
- URL: https://github.com/1111mp/fastapi-app
- Owner: 1111mp
- License: mit
- Created: 2026-04-26T13:18:49.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-26T13:30:10.000Z (3 months ago)
- Last Synced: 2026-04-26T15:22:02.996Z (3 months ago)
- Language: Python
- Homepage:
- Size: 91.8 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# FastAPI App
一个生产可用的 FastAPI 后端模板,内置认证、数据库、缓存、异步任务与可观测性能力。
## 功能特性
- 基于 `fastapi-users` 的完整认证体系(JWT / 注册 / 找回密码 / 邮箱验证)
- GitHub OAuth 登录
- 用户资料接口(`/users/me`)
- Post 示例业务接口(鉴权后可访问)
- PostgreSQL + SQLAlchemy(异步)
- Redis 缓存/连接管理
- Alembic 数据库迁移
- Taskiq 异步任务(worker + scheduler)
- APScheduler 应用内定时任务
- Prometheus 指标 + 健康检查(`/healthz` / `/readyz`)
- OpenTelemetry 链路追踪(可选)
- Correlation ID 与结构化日志
---
## 技术栈
- Python 3.14+
- FastAPI
- SQLAlchemy + Psycopg
- PostgreSQL
- Redis
- FastAPI Users
- Alembic
- Taskiq / taskiq-redis / taskiq-fastapi
- APScheduler
- Prometheus FastAPI Instrumentator
- OpenTelemetry
- Structlog
- uv
---
## 项目结构
```text
app/
├── api/ # 路由与 API 入口
├── auth/ # 认证相关(backend / manager / deps)
├── core/ # 配置、日志、数据库、Redis、可观测性
├── db/ # 数据访问层(CRUD)
├── models/ # ORM 模型
├── schemas/ # Pydantic 模型
├── scheduler/ # APScheduler 任务定义与生命周期
└── workers/ # Taskiq broker、任务与调度器
tests/
├── integration/ # 集成测试
└── unit/ # 单元测试
alembic/ # 数据库迁移
```
---
## 快速开始(本地开发)
### 1) 安装依赖
```bash
uv sync
```
### 2) 配置环境变量
配置通过 `pydantic-settings` 加载,支持以下文件(后者覆盖前者):
1. `.env`
2. `.env.local`
3. `.env.prod`
最小示例:
```env
PROJECT_NAME=fastapi-app
ENVIRONMENT=local
PORT=8000
FRONTEND_HOST=http://localhost:5173
BACKEND_CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
SECRET_KEY=change-me
LOGGER_LEVEL=INFO
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_DB=fastapi_app
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=redispass
# 或直接使用 REDIS_URL 覆盖上面四项
# REDIS_URL=redis://:redispass@127.0.0.1:6379/0
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
SLOW_QUERY_THRESHOLD_MS=1000
METRICS_ENABLED=true
OTEL_ENABLED=false
OTEL_EXPORTER_OTLP_ENDPOINT=
OTEL_EXPORTER_OTLP_INSECURE=true
FIRST_SUPERUSER=admin@example.com
FIRST_SUPERUSER_PASSWORD=password
```
### 3) 启动基础依赖
```bash
docker compose up -d db redis
```
### 4) 执行迁移
```bash
uv run alembic upgrade head
```
### 5) 启动 API
```bash
uv run fastapi run app/main.py --reload --port 8000
```
访问:
- Swagger UI: `http://127.0.0.1:8000/docs`
- OpenAPI JSON: `http://127.0.0.1:8000/api/v1/openapi.json`
---
## Docker Compose 启动(完整栈)
一键启动 API + PostgreSQL + Redis + Taskiq Worker + Taskiq Scheduler:
```bash
docker compose up --build
```
默认端口:
- API: `http://127.0.0.1:80`
- PostgreSQL: `127.0.0.1:5432`
- Redis: `127.0.0.1:6379`
---
## 常用命令
### 数据库迁移
```bash
# 生成迁移
uv run alembic revision --autogenerate -m "your message"
# 应用迁移
uv run alembic upgrade head
# 回滚一步
uv run alembic downgrade -1
```
### 运行单元测试
```bash
# 首次安装(包含 dev 依赖)
uv sync --group dev
# 执行全部测试(默认附带 coverage)
uv run pytest
# 生成覆盖率报告(终端 + coverage.xml)
uv run pytest --cov=app --cov-report=term-missing --cov-report=xml
```
### 集成测试数据回滚(避免脏数据)
项目提供了 `tests/integration/conftest.py` 的 `db_transaction` 夹具:
- 每个测试独立创建 `AsyncSession`。
- 覆盖 `get_async_session`,确保接口走测试会话。
- 测试期间把 `session.commit()` 临时替换为 `session.flush()`,结束后统一 `rollback()`。
- 默认 `uv run pytest` 不执行集成测试(只跑 `not integration`)。
```bash
# 显式执行集成测试
uv run pytest -m integration
```
`integration` 标记用法示例(如 `tests/integration/api/post_test.py`):
```python
import pytest
pytestmark = [pytest.mark.integration, pytest.mark.asyncio]
```
运行方式:
- 只跑集成测试:`uv run pytest -m integration`
- 排除集成测试:`uv run pytest -m "not integration"`
- 跑某个集成测试文件:`uv run pytest tests/integration/api/post_test.py -m integration`
### 启动 Taskiq Worker / Scheduler(本地)
```bash
# Worker
uv run taskiq worker app.workers.provider:broker
# Scheduler
uv run taskiq scheduler app.workers.scheduler:scheduler --fs-discover --tasks-pattern "app/**/tasks.py"
```
---
## API 概览
默认前缀:`/api/v1`
### 认证与用户
- `POST /auth/jwt/login`
- `POST /auth/jwt/logout`
- `POST /auth/register`
- `POST /auth/forgot-password`
- `POST /auth/reset-password`
- `POST /auth/verify`
- `POST /auth/request-verify-token`
- `GET /auth/github/authorize`
- `GET /auth/github/callback`
- `GET /users/me`
- `PATCH /users/me`
### Posts
- `POST /posts/`(需登录)
- `GET /posts/{id}`(需登录)
### 运维接口
- `GET /healthz`(存活检查)
- `GET /readyz`(就绪检查,含 DB/Redis)
- `GET /metrics`(Prometheus 指标,`METRICS_ENABLED=true` 时启用)
---
## CORS 配置说明
`BACKEND_CORS_ORIGINS` 支持两种格式:
- 逗号分隔字符串:`http://a.com,http://b.com`
- JSON 数组:`["http://a.com", "http://b.com"]`
系统会自动把 `FRONTEND_HOST` 追加到允许列表中。
---
## 定时任务说明
本项目有两类定时能力:
1. **应用内 APScheduler**(`app/scheduler`)
2. **Taskiq Scheduler**(`app/workers/tasks.py` 中使用 `schedule=[{"cron": "* * * * *"}]`)
如果你只需要一种调度方式,建议在实际项目中保留一种以降低复杂度。
---
## 可观测性与稳定性
本项目已提供基础可观测能力:
- `/healthz` + `/readyz`:容器探针与依赖可用性检查
- `/metrics`:Prometheus 文本格式指标
- 由 `prometheus-fastapi-instrumentator` 自动采集 HTTP 指标
- OpenTelemetry tracing(可选开启)
- `OTEL_ENABLED=true` 后自动启用 FastAPI / SQLAlchemy / Redis tracing
- 设置 `OTEL_EXPORTER_OTLP_ENDPOINT` 可上报到 OTLP Collector
- gRPC 本地示例:`OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4319` + `OTEL_EXPORTER_OTLP_INSECURE=true`
---
## 生产环境建议
- 使用强随机 `SECRET_KEY`
- 为 PostgreSQL 与 Redis 设置强密码
- 将 `ENVIRONMENT` 设为 `production`
- 正确配置 `BACKEND_CORS_ORIGINS`
- 通过反向代理(Nginx / Traefik)暴露 API
- 配置日志采集与告警
---
## License
[MIT](./LICENSE)