从零搭建个人博客:用 FastAPI + SQLite 自建内容管理系统
在 AI 时代,拥有一个自己的博客不仅是对知识的沉淀,更是个人品牌的基石。今天我们来聊聊如何用最小成本搭建一个功能完备的个人博客。
为什么选择 FastAPI?
FastAPI 是近年来最流行的 Python Web 框架之一,它的优势在于:
- 异步原生 — 基于 Starlette,天然支持 async/await
- 类型提示 — 内置 Pydantic 数据校验,开发体验极佳
- 自动文档 — Swagger UI 开箱即用,调试方便
- 高性能 — 基准测试中接近 Go 和 Node.js 的速度
技术选型
| 组件 | 选择 | 理由 |
|---|---|---|
| Web 框架 | FastAPI | 异步、高性能、开发快 |
| 数据库 | SQLite + SQLAlchemy | 零配置、单文件、适合博客场景 |
| 模板引擎 | Jinja2 | 简单灵活,SEO 友好 |
| Markdown | python-markdown + bleach | 安全地渲染用户内容 |
| 部署 | systemd + Nginx | 稳定可靠,生产就绪 |
核心架构
┌──────────┐ ┌────────────┐ ┌──────────┐
│ Nginx │────▶│ FastAPI │────▶│ SQLite │
│ (:80/443)│ │ (:8000) │ │ (blog.db)│
└──────────┘ └────────────┘ └──────────┘
│ │
│ ┌─────────┐
│ │ Jinja2 │
│ │ Templates│
│ └─────────┘
数据模型设计
博客的核心数据模型包括:
- Post — 文章(标题、正文、摘要、封面、分类、标签、状态、浏览量)
- Category — 分类(支持排序)
- Tag — 标签(多对多关联)
- Comment — 评论(支持嵌套和审核)
- Option — 站点配置(键值对存储)
安全考虑
自建博客虽然面向自己,但安全问题同样重要:
- 密码哈希 — 使用 PBKDF2-SHA256,260,000 次迭代
- CSRF 防护 — 所有写操作都需要 CSRF Token
- 登录限频 — 5 分钟内 8 次失败锁定
- HTML 清洗 — bleach 过滤危险标签和属性
- 签名 Cookie — HMAC-SHA256 防篡改
部署方案
Docker 方式(推荐)
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app/ ./app/
RUN mkdir -p /app/data
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
systemd 方式
[Service]
User=blog
WorkingDirectory=/opt/blog
Environment="SECRET_KEY=<your-secret>"
ExecStart=/usr/local/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000
Restart=always
Nginx 反向代理配置:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
SEO 优化
一个好的博客还需要考虑搜索引擎优化:
- RSS Feed — 自动生成,方便订阅
- Sitemap — XML 格式,帮助索引
- Meta 标签 — 每篇文章独立 title/description/OG 标签
- Canonical URL — 避免重复内容
- robots.txt — 控制爬虫行为
总结
用 FastAPI + SQLite 搭建博客的优势非常明显:
- 零依赖 — 不需要额外安装数据库服务
- 易维护 — 单个
.db文件即可备份整个站点 - 快速开发 — 从 0 到上线不到一天
- 功能完备 — 分类、标签、评论、搜索、RSS 一应俱全
💡 提示:如果你也在使用这个博客系统,记得修改默认的
SECRET_KEY和管理员密码!
本文使用本博客系统撰写并发布,从编辑到上线不到 5 分钟。
评论 (0)