laobinghu 37742571ae feat: 完成项目初始化并重构部署流程
主要变更:
- 添加完整的项目结构和模块(admin、articles、comments、users、session、oauth2、email、moderation、analytics、jobs 等)
- 实现系统初始化 API(/init/status 和 /init/run)
- 重写部署流程:迁移到 package.json scripts,删除 Makefile
- 优化部署脚本:deploy.sh、healthcheck.sh、backup.sh、restore.sh、verify-env.sh
- 更新 README.md:简化文档,整合部署指南
- 优化 AGENTS.md:精简到约 150 行,包含完整的代码规范和命令速查
- 配置 Docker Compose 自动化部署(prisma migrate deploy + seed)
- 生成 OAuth2 RSA 密钥对支持
- 添加环境变量验证和数据库备份恢复功能
2026-03-28 16:53:25 +08:00

672 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LinkShare Blog - 后端 API
基于 **NestJS + Bun + PostgreSQL + Redis** 的现代化博客后端系统。
[![NestJS](https://img.shields.io/badge/NestJS-11.x-red)](https://nestjs.com)
[![Bun](https://img.shields.io/badge/Bun-1.1+-blue)](https://bun.sh)
[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16+-blue)](https://www.postgresql.org)
[![Redis](https://img.shields.io/badge/Redis-7+-red)](https://redis.io)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
---
## 🚀 快速开始
### 一键部署(推荐)
```bash
# 1. 克隆代码
git clone <your-repo>
cd BingLogyBlog-Backend
# 2. 验证环境
pnpm run verify
# 3. 一键部署
pnpm run deploy
# 4. 验证服务
pnpm run health
# 5. 检查初始化状态(可选)
pnpm run init:status
```
### 开发环境快速启动
```bash
# 1. 安装依赖
pnpm install
# 2. 启动依赖服务PostgreSQL + Redis
docker-compose up -d postgres redis
# 3. 环境验证
cp .env.example .env
# 编辑 .env至少设置 DATABASE_URL 和 SESSION_COOKIE_SECRET
# 4. 数据库迁移与种子
pnpm run prisma:deploy
pnpm run prisma:seed
# 5. 启动开发服务器
pnpm run start:dev
```
---
## ✨ 功能特性
-**文章管理** - 完整的 CRUD + 分页 + 权限验证 + 查看计数 + 分析追踪
-**用户系统** - 用户增删改查(仅管理员)+ RBAC 角色权限 + 版主种子用户
-**评论系统** - 规则审核 + AI 智能审核 + 完整的审计日志
-**邮件服务** - Nodemailer + HTML 模板 + BullMQ 队列 + 重试机制
-**AI 审核** - OpenRouter 集成 + 自定义提示词 + 容错机制
-**访客分析** - 事件追踪 + 文章查看统计 + 管理员汇总接口
-**OAuth2** - 完整的 OAuth2 授权服务器实现
-**管理后台** - 评论管理 + 文章管理 + 用户管理
-**Swagger 文档** - 自动生成 API 文档(开发环境)
-**Docker 部署** - 生产就绪的容器化部署方案
---
## 🏗️ 技术架构
```
┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
│ Client App │────│ API (Nest) │────│ PostgreSQL │
│ (Web/Mobile) │ │ :3001 │ │ :5432 │
└─────────────────┘ └──────────────┘ └─────────────┘
├─────────► Redis :6379 (Cache + Queue)
┌──────────────┐
│ BullMQ │
│ Workers │
└──────────────┘
```
**核心技术栈:**
- **框架**: NestJS 11.x + TypeScript 5.x
- **运行时**: Bun 1.1+ (生产优化) / Node.js 20+
- **数据库**: PostgreSQL 16+ + Prisma ORM 6.x
- **缓存/队列**: Redis 7+ + BullMQ 11.x
- **文档**: Swagger/OpenAPI 3.0
- **安全**: Helmet, CORS, Rate Limiting, Session + OAuth2
- **邮件**: Nodemailer + HTML 模板
- **AI**: OpenRouter 集成 (BYOK)
---
## 📦 项目结构
```
.
├── src/ # 源代码
│ ├── app.module.ts # 根模块
│ ├── main.ts # 入口文件
│ ├── config/ # 配置模块
│ │ ├── config.module.ts
│ │ └── env.ts
│ ├── modules/ # 功能模块
│ │ ├── init/ # 系统初始化
│ │ ├── admin/ # 管理后台
│ │ │ ├── admin-articles/
│ │ │ └── admin-comments/
│ │ ├── articles/ # 文章模块
│ │ ├── users/ # 用户模块
│ │ ├── comments/ # 评论模块
│ │ ├── session/ # 会话管理
│ │ ├── oauth2/ # OAuth2 授权
│ │ ├── email/ # 邮件服务
│ │ ├── moderation/ # 内容审核
│ │ ├── analytics/ # 数据分析
│ │ ├── jobs/ # 任务队列
│ │ ├── prisma/ # 数据库服务
│ │ └── health/ # 健康检查
│ └── types/ # 类型声明
├── scripts/ # 部署脚本
│ ├── verify-env.sh # 环境验证
│ ├── deploy.sh # 一键部署
│ ├── backup.sh # 数据库备份
│ ├── restore.sh # 数据库恢复
│ ├── healthcheck.sh # 健康检查
│ └── init-db.sql # 数据库初始化
├── docker-compose.yml # Docker Compose 配置
├── Dockerfile.api # API 镜像构建
├── prisma/ # Prisma Schema
│ ├── schema.prisma
│ ├── seed.ts
│ └── migrations/
├── AGENTS.md # 开发规范
└── .env.example # 环境变量模板
```
---
## 🔧 快速命令
### 使用 Package.json Scripts (推荐)
```bash
# 查看所有可用命令
pnpm run --help
# 部署相关
pnpm run verify # 验证环境配置
pnpm run deploy # 完整生产部署
pnpm run deploy:dev # 开发环境部署
pnpm run deploy:quick # 快速部署(跳过构建)
pnpm run deploy:check # 部署并检查初始化状态
pnpm run migrate # 仅运行数据库迁移
pnpm run seed # 仅运行数据库种子
# 服务管理
pnpm run start:all # 启动所有服务
pnpm run stop # 停止所有服务
pnpm run restart # 重启所有服务
pnpm run recreate # 重新创建服务(会丢失数据!)
pnpm run status # 查看服务状态
pnpm run stats # 查看资源使用情况
# 日志查看
pnpm run logs # 查看所有服务日志
pnpm run logs:api # 查看 API 日志
pnpm run logs:db # 查看数据库日志
pnpm run logs:redis # 查看 Redis 日志
# 健康与初始化
pnpm run health # 运行健康检查
pnpm run health:init # 完整健康检查(含初始化)
pnpm run init:status # 检查初始化状态(需要管理员 Token
pnpm run init:run # 手动触发初始化检查
pnpm run init:generate-keys # 生成 OAuth2 RSA 密钥对
# 数据库管理
pnpm run prisma:generate # 生成 Prisma Client
pnpm run prisma:deploy # 部署迁移到数据库
pnpm run prisma:seed # 运行数据库种子
pnpm run prisma:studio # 打开 Prisma Studio
pnpm run backup # 备份数据库
pnpm run restore # 恢复数据库(需要 BACKUP_FILE 参数)
# 开发相关
pnpm run start:dev # 开发模式(热重载)
pnpm run start:debug # 调试模式
pnpm run dev # 同 start:dev
pnpm run debug # 同 start:debug
# 代码质量
pnpm run build # 构建应用
pnpm run lint # 代码检查
pnpm run format # 代码格式化
pnpm run test # 运行测试
pnpm run test:watch # 测试watch 模式)
pnpm run test:cov # 测试(覆盖率)
# 安全与配置
pnpm run secrets # 生成随机密钥
pnpm run cert # 生成自签名证书(仅开发)
# 容器访问
pnpm run shell # 进入 API 容器
pnpm run shell:db # 进入数据库容器
pnpm run shell:redis # 进入 Redis 容器
# 清理
pnpm run clean # 清理(停止服务并删除未使用的资源)
pnpm run clean:all # 彻底清理(包括镜像)
# 文档
pnpm run docs # 显示文档链接
```
### 使用脚本(底层)
```bash
# 环境验证
./scripts/verify-env.sh
# 一键部署(内部调用 deploy.sh
./scripts/deploy.sh --production
./scripts/deploy.sh --development
# 健康检查(包含初始化检查)
./scripts/healthcheck.sh
./scripts/healthcheck.sh --admin-token <your-token>
# 数据库操作
./scripts/backup.sh [name]
./scripts/restore.sh <backup_file>
```
### Docker Compose直接操作
```bash
# 构建镜像
docker-compose build
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f api
# 重启服务
docker-compose restart
# 停止服务
docker-compose down
# 查看状态
docker-compose ps
# 进入容器
docker-compose exec api sh
```
---
## 📊 默认账户
首次部署后,种子脚本自动创建:
| 角色 | 邮箱 | 密码 | 权限 |
| ------ | --------------------- | ------------ | -------- |
| 管理员 | admin@example.com | password123 | 完全权限 |
| 版主 | moderator@example.com | moderator123 | 评论审核 |
**⚠️ 重要**: 首次登录后请立即修改密码!
---
## 🔐 安全配置
### 1. 生成随机密钥
```bash
pnpm run secrets
# 或手动
openssl rand -base64 32 # SESSION_COOKIE_SECRET
openssl rand -hex 32 # OAUTH2_CLIENT_SECRET
```
### 2. 生成 OAuth2 RSA 密钥对
```bash
pnpm run init:generate-keys
# 或手动
openssl genrsa -out oauth2-private.pem 2048
openssl rsa -pubout -in oauth2-private.pem -out oauth2-public.pem
```
将 PEM 内容复制到 `.env` 文件。
### 3. 生产环境必需配置
```env
NODE_ENV=production
SESSION_COOKIE_SECURE=true
APP_BASE_URL=https://api.yourdomain.com
OAUTH2_TOKEN_SIGNING_PRIVATE_KEY=<your-private-key>
OAUTH2_TOKEN_SIGNING_PUBLIC_KEY=<your-public-key>
```
---
## 🌐 API 端点概览
### 认证
- `POST /login` - JSON 登录
- `POST /logout` - 登出
- `GET /oauth2/authorize` - OAuth2 授权
- `POST /oauth2/token` - 获取 Token
- `GET /me` - 当前用户信息
### 文章
- `GET /articles` - 列表(支持分页、筛选)
- `POST /articles` - 创建(需登录)
- `GET /articles/:id` - 详情
- `GET /articles/slug/:slug` - 根据 slug 获取
- `PUT /articles/:id` - 更新(作者/管理员)
- `DELETE /articles/:id` - 删除(作者/管理员)
### 评论
- `POST /articles/:id/comments` - 提交评论
- `GET /articles/:id/comments` - 获取评论
### 管理后台 (需管理员)
- `GET /admin/articles` - 文章管理(强制操作)
- `GET /admin/comments` - 评论管理
- `PUT /admin/comments/:id/status` - 更新评论状态
- `DELETE /admin/comments/:id` - 删除评论
- `GET /admin/comments/:id/audits` - 查看审核日志
### 系统
- `GET /health` - 健康检查
- `GET /init/status` - 初始化状态(管理员)
- `POST /init/run` - 运行初始化检查(管理员)
完整 API 文档访问 `/api-docs` (开发环境)。
---
## 🧪 测试
```bash
# 所有测试
pnpm test
# 覆盖率
pnpm run test:cov
# Watch 模式
pnpm run test:watch
# E2E 测试
pnpm run test:e2e
```
---
## 📝 开发指南
### 环境要求
- Node.js 20+ 或 Bun 1.1+
- PostgreSQL 16+
- Redis 7+
- pnpm 8+
### 开发流程
```bash
# 1. 安装依赖
pnpm install
# 2. 复制环境配置
cp .env.example .env
# 编辑 .env 文件
# 3. 启动依赖服务
pnpm run start:all
# 4. 运行迁移
pnpm run prisma:deploy
# 5. 启动开发服务器
pnpm run start:dev
```
### 常用命令速查
```bash
pnpm run build # 构建
pnpm run lint # 代码检查
pnpm run format # 格式化
pnpm run test # 测试
pnpm run verify # 环境验证
pnpm run health # 健康检查
pnpm run logs:api # 查看 API 日志
pnpm run shell # 进入容器
```
---
## 🐳 Docker 部署
### 构建和启动
```bash
# 构建镜像
docker-compose build
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f api
# 停止服务
docker-compose down
```
### 资源限制
Docker Compose 已配置:
- CPU: 限制 2 核心,预留 0.5 核心
- 内存: 限制 2GB预留 512MB
- 日志: 最大 10MB × 3 文件,自动压缩
---
## 📈 监控和维护
### 健康检查
```bash
# API 健康检查
curl http://localhost:3001/health
# 综合健康检查脚本
./scripts/healthcheck.sh
```
### 日志管理
```bash
# 实时日志
pnpm run logs:api
# 导出日志 (自动归档)
docker-compose logs api > logs/$(date +%Y%m%d_%H%M%S).log
# 清理旧日志
find logs/ -name "*.log" -mtime +30 -delete
```
### 备份数据库
```bash
# 手动备份
pnpm run backup
# 自动备份 (添加到 crontab)
0 2 * * * cd /path/to/project && pnpm run backup
```
### 恢复数据库
```bash
# 查看备份列表
ls -lh backups/
# 恢复指定备份
BACKUP_FILE=backups/daily_20260328.sql.gz pnpm run restore
# 或
./scripts/restore.sh backups/daily_20260328.sql.gz
```
---
## 🚨 故障排查
### 常见问题
1. **容器无法启动**
```bash
docker-compose logs api # 查看错误日志
docker-compose down && docker-compose up -d # 重启
```
2. **数据库连接失败**
```bash
docker-compose ps postgres # 检查数据库状态
docker-compose logs postgres # 查看数据库日志
```
3. **Redis 连接超时**
```bash
docker-compose restart redis
docker-compose logs redis
```
4. **邮件发送失败**
```bash
# 检查 SMTP 配置
docker-compose exec api env | grep SMTP
# 查看邮件队列
docker-compose exec api pnpm prisma emailMessage.findMany()
```
5. **AI 审核不工作**
```bash
# 检查 API Key
docker-compose exec api env | grep AI_API_KEY
# 测试 OpenRouter
curl -H "Authorization: Bearer $AI_API_KEY" https://openrouter.ai/api/v1/models
```
详细故障排查见 README 的"监控和维护"部分。
---
## 🔒 安全建议
1. ✅ **修改所有默认密码** (admin/moderator)
2. ✅ **使用强随机密钥** (至少 32 位): `pnpm run secrets`
3. ✅ **启用 HTTPS** (Nginx/Traefik + SSL)
4. ✅ **配置防火墙** (仅开放 80, 443, 3001)
5. ✅ **定期更新依赖** (`pnpm update`)
6. ✅ **设置自动备份** (每日备份 + 异地存储)
7. ✅ **启用审计日志** (监控 CommentAudit 表)
8. ✅ **限制数据库访问** (仅允许 API 容器访问)
---
## 📚 相关文档
- **部署指南**: 见本文档的"快速开始"和"快速命令"部分
- [AGENTS.md](./AGENTS.md) - 开发规范
- [prisma/schema.prisma](./prisma/schema.prisma) - 数据库 Schema
- [.env.example](./.env.example) - 环境变量说明
- [scripts/](./scripts/) - 部署脚本集
---
## 🤝 贡献
欢迎提交 Issue 和 Pull Request
请确保:
- 代码通过 `pnpm run lint`
- 添加了适当的测试
- 更新了相关文档
---
## 📄 License
MIT
---
**最后更新**: 2026-03-28
**版本**: 1.0.0
**维护者**: [Your Team]
---
## 🚀 完整部署指南
本文档的"快速开始"部分提供了基本的部署流程。如需详细的环境配置说明、故障排查、性能优化建议等,请参考以下扩展内容。
### 环境要求
| 组件 | 版本要求 | 说明 |
| ----------------------- | ---------- | ---------------------------------- |
| Node.js | ≥ 20.0.0 | 建议使用 Bun 1.0+ 作为替代(更快) |
| pnpm | ≥ 8.0.0 | 包管理 |
| PostgreSQL | ≥ 15.0 | 数据库 |
| Redis | ≥ 7.0 | 队列与缓存 |
| Docker & Docker Compose | 最新稳定版 | 可选,用于容器化部署 |
| OpenSSL | 任意 | 生成 RSA 密钥对OAuth2 |
### 环境变量配置详解
核心变量(`.env` 文件):
| 变量名 | 必填 | 默认值 | 说明 |
| ---------------------------------- | ------------ | --------------------- | ----------------------------------------------------- |
| `NODE_ENV` | 否 | production | 运行环境 |
| `PORT` | 否 | 3001 | API 监听端口 |
| `DATABASE_URL` | **是** | - | PostgreSQL 连接字符串 |
| `REDIS_HOST` | 否 | redis | Redis 主机名 |
| `REDIS_PORT` | 否 | 6379 | Redis 端口 |
| `SESSION_COOKIE_SECRET` | **是** | change_me | Session cookie 签名密钥,生产环境必须改为随机长字符串 |
| `SESSION_COOKIE_NAME` | 否 | linkshare_session | Cookie 名称 |
| `SESSION_COOKIE_SECURE` | 否 | false | HTTPS 时设为 true |
| `SESSION_COOKIE_HTTPONLY` | 否 | true | HttpOnly 防止 XSS |
| `OAUTH2_ISSUER` | 否 | http://localhost:3001 | OAuth2 签发者 |
| `OAUTH2_ACCESS_TOKEN_TTL_SECONDS` | 否 | 3600 | Access token 有效期(秒) |
| `OAUTH2_REFRESH_TOKEN_TTL_SECONDS` | 否 | 2592000 | Refresh token 有效期(秒) |
| `OAUTH2_TOKEN_SIGNING_PRIVATE_KEY` | **生产必填** | - | RSA 私钥PEM 格式) |
| `OAUTH2_TOKEN_SIGNING_PUBLIC_KEY` | **生产必填** | - | RSA 公钥PEM 格式) |
| `AI_PROVIDER` | 否 | openrouter | AI 提供商 |
| `AI_API_KEY` | 否 | - | AI API 密钥BYOK |
| `SMTP_HOST` | 否 | - | SMTP 服务器 |
| `SMTP_PORT` | 否 | 587 | SMTP 端口 |
| `SMTP_USER` | 否 | - | SMTP 用户名 |
| `SMTP_PASS` | 否 | - | SMTP 密码 |
完整列表见 [.env.example](./.env.example)。
### 生产环境注意事项
1. **修改所有默认密码** (admin/moderator)
2. **使用强随机密钥** (至少 32 位): `pnpm run secrets`
3. **启用 HTTPS** (Nginx/Traefik + SSL)
4. **配置防火墙** (仅开放 80, 443, 3001)
5. **定期更新依赖** (`pnpm update`)
6. **设置自动备份** (每日备份 + 异地存储)
7. **启用审计日志** (监控 CommentAudit 表)
8. **限制数据库访问** (仅允许 API 容器访问)
### 故障排查
**API 无法启动**
```bash
docker-compose logs api # 查看错误日志
docker-compose down && docker-compose up -d # 重启
```
**数据库连接失败**
```bash
docker-compose ps postgres # 检查数据库状态
docker-compose logs postgres # 查看数据库日志
```
**初始化检查失败**
```bash
# 获取管理员 token 后运行
pnpm run init:status
# 或
./scripts/healthcheck.sh --admin-token <token>
```