
2026
维护中个人博客 —— 从零到上线的全栈实践
Dice是一个基于 Monorepo 架构的全栈个人博客系统,包含前台展示、内容管理后台、后端 API 和独立文件存储服务,从开发到部署全程自建。
DiceIO 个人博客 —— 从零到上线的全栈实践
项目简介
DiceIO 是一个基于 Monorepo 架构的全栈个人博客系统,包含前台展示、内容管理后台、后端 API 和独立文件存储服务,从开发到部署全程自建。
这个项目是一次 AI 辅助开发的完整实践:UI 设计参考由 ChatGPT o3(Codex) 生成设计思路与视觉方向,具体编码实现由 Claude Code 全程辅助完成——从组件拆分、接口设计到部署配置,AI 深度参与了每一个环节。
技术栈
Monorepo 架构
- pnpm Workspace — 多包管理,依赖共享
- Turborepo — 构建编排,任务缓存
后端(apps/server)
- Koa2 + TypeScript — 轻量级 Node.js 框架
- MongoDB + Mongoose — 文档数据库,存储文章/项目/笔记
- Redis — Session 存储、接口缓存、GitHub 贡献图缓存
- JWT + Cookie — 认证方案(UUID Cookie + Redis 存 Token,前端不接触 JWT)
- koa-helmet / koa-ratelimit — 安全与限流
文件存储(apps/server-storage)
- Koa2 + TypeScript — 独立微服务,端口 3003
- MongoDB — 文件元数据存储
- Sharp — 图片压缩处理
- API Key 鉴权 — 与主服务隔离
管理后台(apps/admin)
- React 18 + TypeScript
- Ant Design 5 — UI 组件库
- MobX — 状态管理
- Vite — 构建工具
前台(apps/web-ssr)
- Nuxt 3 + Vue 3 + TypeScript — SSR 服务端渲染
- Tailwind CSS v4 — 原子化样式
- Pinia — 状态管理
- marked — Markdown 渲染
部署
- GitHub Actions — CI/CD 自动部署,secrets 注入环境变量
- Linux VPS(腾讯云) — 云服务器
- PM2 — 进程守护,零停机重载
- Nginx — 反向代理 + HTTPS
- TrustAsia SSL — HTTPS 证书
项目结构
blog/
├── apps/
│ ├── server/ # Koa2 后端 API
│ ├── server-storage/ # 独立文件存储服务
│ ├── admin/ # React 管理后台
│ └── web-ssr/ # Nuxt 3 前台
├── packages/
│ └── shared/ # 共享静态资源
├── .github/workflows/ # CI/CD 配置
└── ecosystem.config.cjs # PM2 进程配置
核心功能
- 文章、笔记、项目的增删改查
- Markdown 编辑与渲染
- 标签与分类管理
- 图片上传与存储
- GitHub 贡献热力图(GraphQL API + Redis 缓存至次日凌晨)
- 站点统计数据(文章数、项目数、笔记数、标签数)
- SSR 服务端渲染,SEO 友好
- 移动端响应式适配
部署流程
- 推送代码到
main分支触发 GitHub Actions - SSH 连接服务器,自动生成
.env文件(从 GitHub Secrets 注入) pnpm install安装依赖- 构建四个子包(
tsc/nuxi build/vite build) - PM2 零停机重载服务
- Nginx 反向代理分发流量:
diceio.com→ 前台 SSRxxx.diceio.com→ 管理后台static.diceio.com→ 文件存储
CI/CD 设计
项目采用 GitHub Actions + appleboy/ssh-action 实现全自动部署,核心设计原则是敏感信息零提交。
流程图
push to main
│
▼
GitHub Actions 触发
│
▼
SSH 连接服务器
│
├─ git pull 拉取最新代码
│
├─ 从 GitHub Secrets 生成 .env 文件
│ ├─ apps/server/.env
│ └─ apps/server-storage/.env
│
├─ pnpm install 安装依赖
│
├─ 构建四个子包
│ ├─ @blog/server(tsc)
│ ├─ @blog/server-storage(tsc)
│ ├─ @blog/web-ssr(nuxi build)
│ └─ @blog/admin(vite build)
│
└─ PM2 零停机重载
关键设计点
1. 敏感信息管理
.env 文件永远不进 Git,所有密钥(数据库连接串、JWT 密钥、GitHub Token 等)统一存储在 GitHub Secrets,CI/CD 运行时动态生成到服务器,本地开发手动维护 .env,.env.example 作为变量模板提交。
2. 环境变量安全传递
使用 appleboy/ssh-action 的 envs 参数将 Secrets 以环境变量形式注入 SSH 会话,避免直接在脚本中拼接明文密钥,防止日志泄露。
3. PM2 零停机重载
使用 pm2 reload 而非 pm2 restart,新进程启动完成后才关闭旧进程,部署期间服务不中断。ecosystem.config.cjs 使用 __dirname 动态计算路径,不依赖硬编码的服务器目录。
4. Monorepo 按需构建
通过 pnpm --filter 精确指定构建目标,只构建需要的子包,避免不必要的编译开销。
AI 协作方式
这个项目完整践行了"AI 辅助开发"的工作流:
- ChatGPT 5.5(Codex) 负责设计阶段:参考 优秀网站 的视觉风格,生成整体布局思路、组件拆分方案和设计语言定义(配色、间距、字体规范)
- Claude Code 负责实现阶段:根据设计方向逐步实现每个模块,包括组件编写、接口联调、移动端适配、CI/CD 配置、服务器部署全流程
两个 AI 各司其职,Codex 擅长创意与设计决策,Claude Code 擅长工程落地与代码实现,配合下来整体效率远超纯人工开发。
开发心得
整个项目从架构设计到上线历经多次迭代。Monorepo 让多个服务共享类型定义和配置,大幅减少重复代码。SSR 方案选择 Nuxt 3 而非传统 SPA,主要考虑 SEO 和首屏加载性能。后端认证采用 UUID + Redis 的方案,JWT 始终不暴露给前端,安全性更高。CI/CD 通过 GitHub Secrets 管理敏感信息,.env 文件永远不进版本库。
最大的收获是验证了 AI 协作开发的可行性——不是让 AI 替代开发者,而是让开发者借助 AI 以更快的速度、更低的心智负担完成复杂的全栈项目。