基于 FastAPI 的博客后端,带 C 扩展加速和 Go 迁移版本。
| 类别 | 技术 |
|---|---|
| 后端 | Python >=3.11, <3.15, FastAPI, SQLAlchemy, Uvicorn |
| 前端 | Next.js, TypeScript |
| 数据库 | SQLite (SQLAlchemy) |
| AI 集成 | GLM (智谱) + Qwen (通义千问), OpenAI SDK 转发 |
| 安全 | JWT, RSA 加密, Argon2 密码哈希, 权限中间件, 速率限制 |
| 监控 | Prometheus 指标, 远程日志服务 |
| 缓存 | 多级内存缓存 (LRU + TTL) |
| 静态站点 | Hexo 迁移, 自定义 SSG, 静态导出器 |
| 构建 | Poetry, GCC/Make (C 扩展) |
| 可选 | Go 1.21+ Gin (实验性迁移), PySide6 (桌面端) |
<project_root>/ ├── src/ # Python FastAPI 后端 │ ├── FastNextAppBackEnd.py # 应用入口 │ ├── FastNextAppLifeSpan.py # 生命周期管理 (启动/关闭) │ ├── FastNextAppDatabase.py # 数据库会话与建表 │ ├── models/ # SQLAlchemy 数据模型 │ │ ├── user.py # 用户模型 │ │ ├── content.py # 内容模型 │ │ ├── stats.py # 统计模型 │ │ └── file.py # 文件模型 │ ├── services/ # 业务服务层 │ │ ├── content_service.py # 内容管理服务 │ │ ├── user_service.py # 用户服务 │ │ ├── stats_service.py # 统计服务 │ │ ├── archive_service.py # 归档服务 │ │ ├── file_monitor_service.py # 文件同步服务 │ │ ├── backup_service.py # 自动备份 │ │ ├── post_push_service.py # Post 推送服务 │ │ ├── glm_service/ # AI 模型服务 │ │ └── couch_service/ # CouchDB/Obsidian 服务 │ ├── nextjs_router/ # 路由层 │ │ ├── api/ # REST API 接口 │ │ ├── client.py # 用户客户端路由 │ │ ├── auth.py # 认证路由 │ │ ├── control.py # 控制面板 │ │ ├── ssg.py # 静态站点生成 │ │ └── comm.py # 通用路由 │ ├── middleware/ # 中间件 │ │ ├── auth_middleware.py # 权限验证 │ │ ├── rate_limit.py # 速率限制 │ │ └── prometheus_metrics.py # 监控指标 │ ├── utils/ # 工具层 │ │ ├── static_exporter.py # 静态站点导出 │ │ ├── content_importer.py # 内容导入 │ │ ├── slug.py # slug 生成 │ │ ├── snapshot_build.py # API 快照构建 (CLI 入口) │ │ ├── snapshot_transform.py # 快照格式转换 │ │ ├── nginx_manager.py # Nginx 进程管理 │ │ └── cache_manager.py # 缓存管理 │ └── log_utils/ # 日志工具 ├── src_go/ # Go Gin 版本 (实验性) ├── lib_c/ # C 扩展加速模块 │ ├── loader.py # 统一加载器 + c_or_py 装饰器 │ ├── c_*.c # C 源码 (7 个模块) │ ├── *_wrapper.py # Python wrapper (含降级) │ └── libs/ # 编译产物 (.so/.dll) ├── lib/ # 公共库 (Jinja2 模板等) ├── resource/ # 静态资源 ├── setup/ # 部署配置 (systemd) ├── pyproject.toml # Poetry 依赖配置 ├── configs.json # 配置模板 (占位符) └── .config.prod # 生产环境配置 (实际值)
free_models_finder)将整个网站导出为纯静态 HTML 文件,可用于无后端的静态托管。
激活方式: 在 configs.json 中设置 STATIC_EXPORT.ENABLED: true,应用启动时 FastNextAppLifeSpan.startup() 会自动调用 StaticSiteExporter.export_all()。
组件架构:
| 组件 | 文件 | 职责 |
|---|---|---|
StaticSiteExporter | static_exporter.py | 主引擎,协调所有组件 |
URLDiscovery | static_exporter_url_discovery.py | 从路由/模板发现 URL |
ContentFetcher | content_fetcher.py | 抓取页面 HTML + 下载静态资源 |
APIMocker | api_mocker.py | 生成 API mock 数据 + 正则匹配规则 |
SEOGenerator | static_exporter_seo_generator.py | 生成 sitemap/robots.txt 等 |
API 兼容机制 (页面注入 <script> 实现):
window.__staticApiData: 精确匹配的 mock JSON 数据 (30+ 端点)window.__staticApiPatterns: 正则模式匹配规则 (14 条,覆盖动态路径)ReadableStream,避免前端解析异常window.fetch 和 XMLHttpRequest (兼容 axios)全量 API 数据快照,支持两种输出格式:
full_snapshot.json,按 endpoint 路径为 key三阶段执行: 静态端点 → 参数化端点 (自动提取文章 ID/slug/年份/标签) → 写入文件
# CLI 独立运行
python -m src.utils.snapshot_build -o .cnb.build/snapshot -f mirror,merged
# 运行时 API 触发
Invoke-WebRequest -Uri "http://127.0.0.1:30026/api/v1/control/snapshot" `
-Method POST -Headers @{"Authorization" = "Bearer <admin_token>"; "Content-Type" = "application/json"} `
-Body '{"formats": ["mirror", "merged"]}'
快照转换: snapshot_transform.py 将 merged 格式拆分为前端可消费的路由级 JSON 目录,旧快照自动清理 (保留最近 5 个目录)。
项目内置示例数据库,包含完整演示数据:
| 数据 | 数量 |
|---|---|
| 文章 | 63 篇 (前端/后端/DevOps/数据科学/随笔) |
| 用户 | 3 个 (管理员/普通用户/访客) |
| 分类 | 6 个 (含父子关系) |
| 评论 | 80+ 条 (含回复链) |
| 点赞 | 100+ 条 |
| 统计数据 | 30 天 (PV/UV/内容/用户) |
随机种子固定为 SEED=42,每次构建结果一致。
/metrics)/feed.xml)/sitemap.xml)通过 C 扩展加速关键计算路径,采用统一加载器 + c_or_py 装饰器自动降级。
| 模块 | C 源码 | 功能 | 降级支持 |
|---|---|---|---|
content_utils | c_content_utils.c | 内容处理、字数统计 | 有 |
similarity | c_similarity.c | 文本相似度计算 | 有 |
hash_utils | c_hash.c | 哈希计算 (Keccak) | 有 |
toc_parser | c_toc_parser.c | Markdown 目录解析 | 有 |
log_reader | c_log_reader.c | 日志读取 | 有 |
hexo_utils | c_hexo_utils.c | Hexo 迁移工具 | 有 |
fastutils | c_fastutils.c | 路径处理 | 无 |
activation | c_active_fui.c | 激活码生成 | 无 |
from lib_c.loader import load_lib, c_or_py
# 加载动态库 (自动查找 .so/.dll)
_lib = load_lib("content_utils")
# c_or_py 装饰器: C 可用时走 C,否则自动降级 Python
@c_or_py(fallback_fn=_word_count_py)
def word_count(text: str) -> int:
return _lib.cu_word_count(text.encode('utf-8'))
# 调用端直接使用,无需关心底层实现
from lib_c.content_utils import word_count
count = word_count(markdown_text)
cd lib_c && make clean && make
configs.json 使用占位符系统,启动时由 lib/settingRenderCI.py 从 .config.prod 读取实际值并注入环境变量。
| 占位符 | 说明 |
|---|---|
{BASE_DIR} | 项目根目录 |
{RES_DIR} | 资源目录 (resource/) |
{WEB_PORT} | 服务端口 |
{FRONT_PATH} | 前端项目路径 |
{SMTP_*} | 邮件服务配置 |
{ADMIN_REGISTER_KEY} | 管理员注册密钥 |
{ZHIPU_API_KEY} | 智谱 AI API 密钥 |
{HEXO_PATH} | Hexo 博客源目录 |
{SITE_URL} | 站点域名 |
git clone https://cnb.cool/paimon/public/BackEnd.git
cd BackEnd
poetry install
# 编译 C 扩展 (推荐)
cd lib_c && make && cd ..
# 创建生产配置
cp .config.prod.example .config.prod
# 编辑 .config.prod 填入实际值
poetry run uvicorn src.FastNextAppBackEnd:app --host 0.0.0.0 --port 30026
项目内置完整的 CI/CD 管线,通过 CNB 平台一键完成从代码到运行的全流程。
| 按钮 | 功能 | 触发条件 |
|---|---|---|
| 部署到生产环境 | 完整构建:Poetry 安装 -> C 编译 -> 启动服务 -> API 快照导出 | 正式上线 |
| 导出 API 快照 | 仅执行 snapshot_build 导出全量 JSON 到 .cnb.build/snapshot/ | 数据更新后 |
| 编译 C 模块 | 仅编译 lib_c/ 并推送 .so 文件([skip ci] 不触发完整构建) | C 源码变更 |
| 重启服务 | 停止旧进程、重新启动 uvicorn | 配置变更 |
| 清理缓存 | 清理 Poetry 缓存和 .venv/ | 构建异常时 |
| 快速预览 | Python 语法检查 + Poetry 配置校验 | 提交前验证 |
部署流程详情:
# 以下步骤由 CNB 自动执行,手动部署可参考
# 1. 环境准备
apt-get install -y gcc make curl
curl -sSL https://install.python-poetry.org | python3 -
export PATH="$HOME/.local/bin:$PATH"
# 2. 配置镜像源(国内加速)
poetry config repositories.tsinghua https://pypi.tuna.tsinghua.edu.cn/simple
poetry config repositories.aliyun https://mirrors.aliyun.com/pypi/simple/
poetry config repositories.tencent https://mirrors.cloud.tencent.com/pypi/simple/
# 3. 安装依赖(多源自动切换)
poetry install --no-interaction --no-root --only main || \
poetry install --no-interaction --no-root --only main --source tsinghua || \
poetry install --no-interaction --no-root --only main --source aliyun || \
poetry install --no-interaction --no-root --only main --source tencent
# 4. 编译 C 扩展
cd lib_c && make clean && make && cd ..
# 5. 创建运行目录
mkdir -p src/instance resource/_posts resource/static
# 6. API 快照导出
python -m src.utils.snapshot_build -o .cnb.build/snapshot -f mirror,merged
# 7. 启动服务
poetry run python -m uvicorn src.FastNextAppBackEnd:app \
--host 0.0.0.0 --port 30026 > backend.log 2>&1 &
环境变量(CNB 构建时可设置):
| 变量 | 说明 | 默认值 |
|---|---|---|
ADMIN_KEY | 管理员注册密钥 | 无 |
SKIP_TESTS | 是否跳过测试 | false |
CNB_TRIGGER_TOKEN | 触发前端部署令牌 | 无 |
适用于本地服务器或非 CNB 环境。
# 1. 克隆项目
git clone <repo_url> && cd BackEnd
# 2. 安装 Python 3.11+ 和 Poetry
# Ubuntu/Debian:
sudo apt-get update && sudo apt-get install -y python3.11 python3-pip gcc make
pip3 install poetry
# macOS:
brew install python@3.11 poetry
# 3. 安装依赖
poetry install
# 4. 编译 C 扩展(可选但推荐)
cd lib_c && make && cd ..
# 5. 初始化配置
cp .config.prod.example .config.prod
# 编辑 .config.prod 填入实际值(数据库路径、端口、密钥等)
# 6. 构建示例数据库(可选)
python -m src.utils.db.build_examples_db --output resource/examples.db
# 7. 导出 API 快照(静态站点模式需要)
python -m src.utils.snapshot_build -o .cnb.build/snapshot -f mirror,merged
# 8. 启动服务
poetry run uvicorn src.FastNextAppBackEnd:app --host 0.0.0.0 --port 30026
# 1. 注册服务
sudo cp setup/fastapp.service /etc/systemd/system/
sudo systemctl daemon-reload
# 2. 开机自启并启动
sudo systemctl enable fastapp
sudo systemctl start fastapp
# 3. 常用操作
sudo journalctl -u fastapp -f # 实时查看日志
sudo systemctl restart fastapp # 重启
sudo systemctl status fastapp # 状态检查
netstat -tlnp | grep 30026 # 确认端口监听
# 4. 定时重启(可选,每周日凌晨 4 点)
sudo tee /etc/cron.d/fastapp-restart <<'EOF'
0 4 * * 0 root systemctl restart fastapp
EOF
快照将所有 API 端点的返回数据导出为静态 JSON,供前端静态页面消费。
# CLI 独立运行(两种格式可选或同时使用)
python -m src.utils.snapshot_build -o .cnb.build/snapshot -f mirror,merged
# 仅 mirror 格式(按端点路径分文件,适合 nginx 直接 serve)
python -m src.utils.snapshot_build -o output/mirror -f mirror
# 仅 merged 格式(单个 full_snapshot.json)
python -m src.utils.snapshot_build -o output/merged -f merged
# 运行中通过 API 触发(需认证)
curl -X POST http://127.0.0.1:30026/api/v1/control/snapshot \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '{"formats": ["mirror", "merged"]}'
# 输出结构
# .cnb.build/snapshot/
# ├── manifest.json # 元信息(端点列表、错误统计)
# ├── full_snapshot.json # 合并格式
# ├── snapshot_20260404_120000/ # 按时间戳的独立目录
# │ ├── api/v1/info/... # mirror 格式的路径镜像
# │ └── ...
# └── snapshot_latest -> snapshot_20260404_120000 # 最新快照软链接
项目内置跨平台 Nginx 进程管理器 (nginx_manager.py),支持 Linux / Windows。
自动管理:应用启动时 FastNextAppLifeSpan 会自动:
手动部署 Nginx 配置:
# 使用内置工具一键部署到系统默认位置(带备份)
python -m src.utils.dev.openconf \
template=nginx.conf.template platform=linux \
output=/etc/nginx/conf.d/fastapp.conf backup=True
# 或生成到自定义位置查看
python -m src.utils.dev.openconf platform=linux output=./openconf/nginx.linux.conf
python -m src.utils.dev.openconf platform=windows output=./openconf/nginx.windows.conf
Nginx 配置要点:
# 反向代理到 FastAPI location /api/ { proxy_pass http://127.0.0.1:30026; # 关键:透传 Cookie(Session 依赖) proxy_set_header Cookie $http_cookie; } # 静态资源(含 API 快照的 mirror 格式) location ~ ^/(static|_next)/ { alias /path/to/resource/; } # 注意:alias 末尾必须带斜杠 location /_export_html/ { alias /path/to/resource/_export_html/; }
# Poetry 相关
poetry cache clear --all --no-interaction # 清理缓存重试
poetry install --no-interaction --no-root # 重新安装依赖
# C 扩展编译失败
apt-get install -y gcc make # 确认系统工具链
cd lib_c && make clean && make # 清理后重编
# 服务启动失败
cat backend.log # 查看 nohup 日志
journalctl -u fastapp -n 50 # systemd 日志
poetry run python -c "from src.FastNextAppBackEnd import app; print('OK')" # 导入检查
# 端口被占用
lsof -i :30026 # 查看占用进程
kill -9 <PID> # 终止占用
# 权限问题
chmod -R 755 src/instance # 运行目录权限
chown -R www-data:www-data resource/ # Nginx 可读资源
src_go/ 目录包含从 Python FastAPI 到 Go Gin 的迁移版本,覆盖核心路由和模型。
详见 src_go/README.md,包含完整的 Python -> Go 模型和路由映射表。
项目遵循 paimon1999原则:
loader.py 统一加载c_or_py 装饰器自动处理)首次正式发布: