初始化游戏小组管理系统后端项目

- 基于 NestJS + TypeScript + MySQL + Redis 架构
- 完整的模块化设计(认证、用户、小组、游戏、预约等)
- JWT 认证和 RBAC 权限控制系统
- Docker 容器化部署支持
- 添加 CLAUDE.md 项目开发指南
- 配置 .gitignore 忽略文件

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
UGREEN USER
2026-01-28 10:42:06 +08:00
commit b25aa5b143
134 changed files with 30536 additions and 0 deletions

View File

@@ -0,0 +1,825 @@
# GameGroup 后端部署指导文档
## 目录
- [环境准备](#环境准备)
- [本地开发部署](#本地开发部署)
- [生产环境部署](#生产环境部署)
- [数据库配置](#数据库配置)
- [性能优化建议](#性能优化建议)
- [监控和维护](#监控和维护)
- [常见问题排查](#常见问题排查)
---
## 环境准备
### 系统要求
- **Node.js**: 18.x 或更高版本
- **MySQL**: 8.0 或更高版本
- **内存**: 最低 2GB RAM推荐 4GB+
- **存储**: 最低 10GB 可用空间
### 必需软件
```bash
# 检查 Node.js 版本
node --version # 应该 >= 18.0.0
# 检查 npm 版本
npm --version
# 检查 MySQL 版本
mysql --version # 应该 >= 8.0
```
---
## 本地开发部署
### 1. 克隆项目并安装依赖
```bash
# 进入项目目录
cd d:\vscProg\backend
# 安装依赖
npm install
```
### 2. 配置环境变量
复制环境变量示例文件:
```bash
cp .env.example .env.development
```
编辑 `.env.development` 文件:
```env
# 应用配置
NODE_ENV=development
PORT=3000
# 数据库配置
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=你的数据库密码
DB_DATABASE=gamegroup
DB_SYNCHRONIZE=true
DB_LOGGING=true
# JWT配置
JWT_SECRET=dev-secret-key-change-in-production
JWT_EXPIRES_IN=7d
# CORS配置
CORS_ORIGIN=http://localhost:8080
# 日志配置
LOG_LEVEL=debug
# 缓存配置
CACHE_TTL=300
CACHE_MAX=100
# 性能配置
ENABLE_COMPRESSION=true
QUERY_LIMIT=100
QUERY_TIMEOUT=30000
```
### 3. 创建数据库
```bash
# 登录 MySQL
mysql -u root -p
# 创建数据库
CREATE DATABASE gamegroup CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建用户(可选)
CREATE USER 'gamegroup'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON gamegroup.* TO 'gamegroup'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
### 4. 启动开发服务器
```bash
# 启动开发模式(支持热重载)
npm run start:dev
# 或者普通启动
npm run start
```
访问 http://localhost:3000 查看应用是否正常运行。
访问 http://localhost:3000/docs 查看 Swagger API 文档。
### 5. 运行测试
```bash
# 运行所有测试
npm test
# 运行测试并生成覆盖率报告
npm run test:cov
# 监听模式运行测试
npm run test:watch
```
---
## 生产环境部署
### 方式一Docker 部署(推荐)
#### 1. 准备配置文件
创建 `.env.production` 文件:
```env
NODE_ENV=production
PORT=3000
# 数据库配置(使用强密码!)
DB_HOST=mysql
DB_PORT=3306
DB_USERNAME=gamegroup
DB_PASSWORD=生产环境强密码
DB_DATABASE=gamegroup
DB_SYNCHRONIZE=false
DB_LOGGING=false
DB_ROOT_PASSWORD=MySQL_Root强密码
# JWT配置必须更换
JWT_SECRET=生产环境超长随机密钥_至少32位
JWT_EXPIRES_IN=7d
# CORS配置限制为实际前端域名
CORS_ORIGIN=https://your-frontend-domain.com
# 日志配置
LOG_LEVEL=info
# 缓存配置
CACHE_TTL=600
CACHE_MAX=1000
# 性能配置
ENABLE_COMPRESSION=true
QUERY_LIMIT=100
QUERY_TIMEOUT=30000
```
#### 2. 构建和启动
```bash
# 构建生产镜像
docker-compose -f docker-compose.prod.yml build
# 启动服务(后台运行)
docker-compose -f docker-compose.prod.yml up -d
# 查看运行状态
docker-compose -f docker-compose.prod.yml ps
# 查看日志
docker-compose -f docker-compose.prod.yml logs -f backend
```
#### 3. 健康检查
```bash
# 检查应用健康状态
curl http://localhost:3000/health
# 检查容器状态
docker ps
# 查看容器资源使用
docker stats
```
#### 4. 停止服务
```bash
# 停止服务
docker-compose -f docker-compose.prod.yml down
# 停止服务并删除数据卷(谨慎使用!)
docker-compose -f docker-compose.prod.yml down -v
```
### 方式二PM2 部署
#### 1. 安装 PM2
```bash
npm install -g pm2
```
#### 2. 构建应用
```bash
# 安装生产依赖
npm ci --only=production
# 构建项目
npm run build:prod
```
#### 3. 启动应用
```bash
# 使用 PM2 启动
pm2 start ecosystem.config.js --env production
# 查看运行状态
pm2 status
# 查看日志
pm2 logs gamegroup-backend
# 查看实时监控
pm2 monit
```
#### 4. 设置开机自启
```bash
# 保存当前 PM2 进程列表
pm2 save
# 设置开机自启
pm2 startup
# 根据提示执行相应命令(会因系统而异)
```
#### 5. 常用 PM2 命令
```bash
# 重启应用
pm2 restart gamegroup-backend
# 停止应用
pm2 stop gamegroup-backend
# 删除应用
pm2 delete gamegroup-backend
# 重载应用(零停机重启)
pm2 reload gamegroup-backend
# 查看详细信息
pm2 show gamegroup-backend
# 清空日志
pm2 flush
```
### 方式三:直接使用 Node.js
#### 1. 构建应用
```bash
npm run build:prod
```
#### 2. 启动应用
```bash
# 设置环境变量并启动
export NODE_ENV=production
node dist/main.js
# 或使用 npm 脚本
npm run start:prod
```
> ⚠️ **不推荐直接使用 Node.js**,因为没有进程管理和自动重启功能。
---
## 数据库配置
### 创建生产数据库
```sql
-- 创建数据库
CREATE DATABASE gamegroup
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 创建专用用户
CREATE USER 'gamegroup'@'%' IDENTIFIED BY '强密码';
-- 授予权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER
ON gamegroup.*
TO 'gamegroup'@'%';
FLUSH PRIVILEGES;
```
### 性能优化索引
```sql
USE gamegroup;
-- 用户表索引
CREATE INDEX idx_user_username ON user(username);
CREATE INDEX idx_user_email ON user(email);
CREATE INDEX idx_user_phone ON user(phone);
CREATE INDEX idx_user_is_member ON user(isMember);
-- 小组表索引
CREATE INDEX idx_group_owner ON `group`(ownerId);
CREATE INDEX idx_group_is_active ON `group`(isActive);
CREATE INDEX idx_group_is_public ON `group`(isPublic);
CREATE INDEX idx_group_created_at ON `group`(createdAt);
-- 小组成员表索引
CREATE INDEX idx_member_group_user ON group_member(groupId, userId);
CREATE INDEX idx_member_user ON group_member(userId);
CREATE INDEX idx_member_is_active ON group_member(isActive);
CREATE INDEX idx_member_role ON group_member(role);
-- 预约表索引
CREATE INDEX idx_appointment_group ON appointment(groupId);
CREATE INDEX idx_appointment_creator ON appointment(initiatorId);
CREATE INDEX idx_appointment_date ON appointment(eventDate);
CREATE INDEX idx_appointment_status ON appointment(status);
CREATE INDEX idx_appointment_created_at ON appointment(createdAt);
-- 预约参与者表索引
CREATE INDEX idx_participant_appointment ON appointment_participant(appointmentId);
CREATE INDEX idx_participant_user ON appointment_participant(userId);
-- 游戏表索引
CREATE INDEX idx_game_name ON game(name);
CREATE INDEX idx_game_category ON game(category);
-- 黑名单表索引
CREATE INDEX idx_blacklist_reporter ON blacklist(reporterId);
CREATE INDEX idx_blacklist_reported ON blacklist(reportedUserId);
CREATE INDEX idx_blacklist_status ON blacklist(status);
-- 荣誉墙表索引
CREATE INDEX idx_honors_group ON honors(groupId);
CREATE INDEX idx_honors_creator ON honors(creatorId);
CREATE INDEX idx_honors_year ON honors(year);
-- 积分表索引
CREATE INDEX idx_points_user ON points(userId);
CREATE INDEX idx_points_type ON points(type);
CREATE INDEX idx_points_created_at ON points(createdAt);
-- 打赌表索引
CREATE INDEX idx_bets_creator ON bets(creatorId);
CREATE INDEX idx_bets_status ON bets(status);
CREATE INDEX idx_bets_deadline ON bets(deadline);
```
### 数据库备份
```bash
# 手动备份
mysqldump -u root -p gamegroup > backup_$(date +%Y%m%d_%H%M%S).sql
# 恢复备份
mysql -u root -p gamegroup < backup_20240101_120000.sql
# 使用 Docker 备份
docker exec gamegroup-mysql-prod mysqldump -u root -p密码 gamegroup > backup.sql
# 定时备份(添加到 crontab
0 2 * * * mysqldump -u root -p密码 gamegroup > /backups/gamegroup_$(date +\%Y\%m\%d).sql
```
---
## 性能优化建议
### 1. 应用层优化
#### 启用 HTTP 压缩
已在 `main.ts` 中配置,确保 `.env` 中设置:
```env
ENABLE_COMPRESSION=true
```
#### 缓存配置优化
根据实际流量调整缓存参数:
```env
# 高流量场景
CACHE_TTL=600 # 10分钟
CACHE_MAX=5000 # 5000条缓存
# 中等流量
CACHE_TTL=300 # 5分钟
CACHE_MAX=1000 # 1000条缓存
# 低流量
CACHE_TTL=180 # 3分钟
CACHE_MAX=500 # 500条缓存
```
#### 连接池优化
`database.config.ts` 中已配置:
- 开发环境10个连接
- 生产环境20个连接
可根据服务器配置调整。
### 2. 数据库优化
#### 查询缓存
生产环境已启用数据库查询缓存1分钟
#### 慢查询日志
```sql
-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log';
-- 查看慢查询统计
SHOW STATUS LIKE 'Slow_queries';
```
#### 定期优化表
```sql
-- 优化所有表
OPTIMIZE TABLE user, `group`, group_member, appointment;
-- 分析表
ANALYZE TABLE user, `group`, group_member;
```
### 3. 服务器配置优化
#### Nginx 反向代理(推荐)
```nginx
upstream backend {
server localhost:3000;
# 如果有多个实例,添加更多服务器
# server localhost:3001;
# server localhost:3002;
}
server {
listen 80;
server_name your-domain.com;
# 请求体大小限制
client_max_body_size 10M;
# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# API 限流
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
}
# 限流配置(在 http 块中)
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
```
---
## 监控和维护
### 1. 健康检查端点
```bash
# 应用健康检查
curl http://localhost:3000/health
# 期望响应
{"status": "ok"}
```
### 2. 日志管理
#### 查看应用日志
```bash
# Docker 环境
docker-compose -f docker-compose.prod.yml logs -f backend
# PM2 环境
pm2 logs gamegroup-backend
# 查看错误日志
pm2 logs gamegroup-backend --err
# 查看输出日志
pm2 logs gamegroup-backend --out
```
#### 日志轮转配置
PM2 日志轮转:
```bash
# 安装 PM2 日志轮转模块
pm2 install pm2-logrotate
# 配置最大日志大小
pm2 set pm2-logrotate:max_size 10M
# 配置保留天数
pm2 set pm2-logrotate:retain 7
# 配置压缩
pm2 set pm2-logrotate:compress true
```
### 3. 性能监控
#### 内置监控
```bash
# PM2 监控
pm2 monit
# 查看详细指标
pm2 show gamegroup-backend
```
#### 推荐监控工具
- **New Relic**: 应用性能监控 (APM)
- **Datadog**: 全栈监控
- **Prometheus + Grafana**: 开源监控方案
- **ELK Stack**: 日志聚合和分析
### 4. 数据库监控
```sql
-- 查看连接数
SHOW STATUS LIKE 'Threads_connected';
-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 查看查询统计
SHOW STATUS LIKE 'Questions';
SHOW STATUS LIKE 'Queries';
-- 查看慢查询
SHOW STATUS LIKE 'Slow_queries';
-- 查看当前运行的查询
SHOW PROCESSLIST;
```
---
## 常见问题排查
### 1. 应用无法启动
#### 检查端口占用
```bash
# Windows
netstat -ano | findstr :3000
# Linux/Mac
lsof -i :3000
```
#### 检查环境变量
```bash
# 确认环境变量已加载
echo $NODE_ENV
# 检查配置文件
cat .env.production
```
#### 查看详细错误
```bash
# Docker
docker-compose -f docker-compose.prod.yml logs backend
# PM2
pm2 logs gamegroup-backend --lines 100
```
### 2. 数据库连接失败
#### 检查数据库服务
```bash
# 检查 MySQL 是否运行
# Windows
sc query MySQL80
# Linux
systemctl status mysql
# Docker
docker ps | grep mysql
```
#### 测试数据库连接
```bash
mysql -h localhost -u gamegroup -p -D gamegroup
```
#### 常见错误
- **ER_ACCESS_DENIED_ERROR**: 用户名或密码错误
- **ECONNREFUSED**: 数据库服务未启动或端口错误
- **ER_BAD_DB_ERROR**: 数据库不存在
### 3. 内存占用过高
#### 查看内存使用
```bash
# PM2
pm2 show gamegroup-backend
# Docker
docker stats gamegroup-backend-prod
```
#### 解决方案
```bash
# PM2 设置内存限制(在 ecosystem.config.js 中)
max_memory_restart: '500M'
# 重启应用释放内存
pm2 restart gamegroup-backend
```
### 4. 性能问题
#### 分析慢查询
```sql
-- 查看慢查询日志
SELECT * FROM mysql.slow_log;
-- 使用 EXPLAIN 分析查询
EXPLAIN SELECT * FROM user WHERE username = 'test';
```
#### 检查缓存命中率
查看应用日志,搜索 "Cache hit" 和 "Cache miss"。
#### 数据库优化
```sql
-- 检查表状态
SHOW TABLE STATUS LIKE 'user';
-- 优化表
OPTIMIZE TABLE user;
-- 更新统计信息
ANALYZE TABLE user;
```
### 5. Docker 相关问题
#### 容器无法启动
```bash
# 查看容器日志
docker logs gamegroup-backend-prod
# 检查容器状态
docker inspect gamegroup-backend-prod
# 重新构建
docker-compose -f docker-compose.prod.yml build --no-cache
```
#### 数据持久化问题
```bash
# 查看数据卷
docker volume ls
# 检查数据卷
docker volume inspect gamegroup_mysql-data
# 备份数据卷
docker run --rm -v gamegroup_mysql-data:/data -v $(pwd):/backup ubuntu tar czf /backup/mysql-backup.tar.gz /data
```
---
## 安全建议
### 1. 环境变量安全
- ✅ 不要将 `.env` 文件提交到 Git
- ✅ 使用强密码至少16位包含大小写字母、数字、特殊字符
- ✅ 定期更换 JWT_SECRET
- ✅ 限制 CORS_ORIGIN 为实际域名
### 2. 数据库安全
- ✅ 不使用 root 用户连接
- ✅ 限制数据库用户权限(不给 DROP、ALTER 等危险权限)
- ✅ 使用防火墙限制数据库端口访问
- ✅ 启用 SSL/TLS 连接
### 3. 应用安全
- ✅ 定期更新依赖包:`npm audit fix`
- ✅ 启用 HTTPS使用 Let's Encrypt 免费证书)
- ✅ 实施请求速率限制
- ✅ 设置 HTTP 安全头Helmet 中间件)
- ✅ 输入验证和 SQL 注入防护(已使用 TypeORM
### 4. 网络安全
```bash
# 配置防火墙Ubuntu/Debian
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw deny 3306/tcp # 拒绝外部访问数据库
sudo ufw enable
# 仅允许特定 IP 访问数据库
sudo ufw allow from 服务器IP to any port 3306
```
---
## 升级和回滚
### 应用升级
```bash
# 1. 拉取最新代码
git pull origin main
# 2. 安装依赖
npm ci
# 3. 运行测试
npm test
# 4. 构建应用
npm run build:prod
# 5. 备份数据库
mysqldump -u root -p gamegroup > backup_before_upgrade.sql
# 6. 使用 PM2 重载(零停机)
pm2 reload gamegroup-backend
# 或使用 Docker
docker-compose -f docker-compose.prod.yml up -d --build
```
### 应用回滚
```bash
# 1. 切换到上一个版本
git checkout 上一个稳定版本的commit
# 2. 重新构建和部署
npm ci
npm run build:prod
pm2 restart gamegroup-backend
# 3. 如需回滚数据库
mysql -u root -p gamegroup < backup_before_upgrade.sql
```
---
## 生产环境检查清单
部署前请确认以下项目:
- [ ] 已设置强 JWT_SECRET
- [ ] 已设置强数据库密码
- [ ] DB_SYNCHRONIZE 设置为 false
- [ ] DB_LOGGING 设置为 false
- [ ] CORS_ORIGIN 限制为实际域名
- [ ] 已创建数据库索引
- [ ] 已配置数据库备份
- [ ] 已设置日志轮转
- [ ] 已配置监控告警
- [ ] 已进行压力测试
- [ ] 已准备回滚方案
- [ ] 已配置 HTTPS
- [ ] 已设置防火墙规则
- [ ] 已配置健康检查
- [ ] 已测试备份恢复流程
---
## 技术支持
### 文档参考
- **NestJS 官方文档**: https://docs.nestjs.com/
- **TypeORM 文档**: https://typeorm.io/
- **PM2 文档**: https://pm2.keymetrics.io/
- **Docker 文档**: https://docs.docker.com/
### 问题反馈
如遇到部署问题,请提供:
1. 错误日志(完整堆栈跟踪)
2. 环境信息Node.js、MySQL 版本)
3. 配置文件(隐藏敏感信息)
4. 复现步骤
---
**祝部署顺利!** 🚀