255 lines
5.3 KiB
Markdown
255 lines
5.3 KiB
Markdown
|
|
# 部署指南
|
|||
|
|
|
|||
|
|
## 环境准备
|
|||
|
|
|
|||
|
|
### 开发环境
|
|||
|
|
```bash
|
|||
|
|
# 安装依赖
|
|||
|
|
npm install
|
|||
|
|
|
|||
|
|
# 配置环境变量
|
|||
|
|
cp .env.example .env.development
|
|||
|
|
|
|||
|
|
# 启动开发服务器
|
|||
|
|
npm run start:dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 生产环境
|
|||
|
|
|
|||
|
|
#### 方式一:Docker部署(推荐)
|
|||
|
|
|
|||
|
|
1. **配置环境变量**
|
|||
|
|
```bash
|
|||
|
|
# 创建生产环境配置
|
|||
|
|
cp .env.example .env.production
|
|||
|
|
|
|||
|
|
# 编辑 .env.production,设置以下关键参数:
|
|||
|
|
# - DB_PASSWORD: 数据库密码
|
|||
|
|
# - JWT_SECRET: JWT密钥(使用强密码)
|
|||
|
|
# - CORS_ORIGIN: 允许的前端域名
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
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 logs -f backend
|
|||
|
|
|
|||
|
|
# 停止服务
|
|||
|
|
docker-compose -f docker-compose.prod.yml down
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **数据库迁移**
|
|||
|
|
```bash
|
|||
|
|
# 进入容器
|
|||
|
|
docker exec -it gamegroup-backend-prod sh
|
|||
|
|
|
|||
|
|
# 运行迁移(如果需要)
|
|||
|
|
npm run migration:run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 方式二:传统部署
|
|||
|
|
|
|||
|
|
1. **构建应用**
|
|||
|
|
```bash
|
|||
|
|
# 安装依赖
|
|||
|
|
npm ci --only=production
|
|||
|
|
|
|||
|
|
# 构建
|
|||
|
|
npm run build:prod
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **配置PM2**
|
|||
|
|
```bash
|
|||
|
|
# 安装PM2
|
|||
|
|
npm install -g pm2
|
|||
|
|
|
|||
|
|
# 启动应用
|
|||
|
|
pm2 start ecosystem.config.js --env production
|
|||
|
|
|
|||
|
|
# 查看状态
|
|||
|
|
pm2 status
|
|||
|
|
|
|||
|
|
# 查看日志
|
|||
|
|
pm2 logs gamegroup-backend
|
|||
|
|
|
|||
|
|
# 重启
|
|||
|
|
pm2 restart gamegroup-backend
|
|||
|
|
|
|||
|
|
# 设置开机自启
|
|||
|
|
pm2 startup
|
|||
|
|
pm2 save
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 性能优化配置
|
|||
|
|
|
|||
|
|
### 数据库优化
|
|||
|
|
|
|||
|
|
1. **创建索引**
|
|||
|
|
```sql
|
|||
|
|
-- 用户表索引
|
|||
|
|
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_group_creator ON `group`(creatorId);
|
|||
|
|
CREATE INDEX idx_group_active ON `group`(isActive);
|
|||
|
|
|
|||
|
|
-- 预约表索引
|
|||
|
|
CREATE INDEX idx_appointment_group ON appointment(groupId);
|
|||
|
|
CREATE INDEX idx_appointment_date ON appointment(eventDate);
|
|||
|
|
CREATE INDEX idx_appointment_status ON appointment(status);
|
|||
|
|
|
|||
|
|
-- 小组成员表索引
|
|||
|
|
CREATE INDEX idx_member_group_user ON group_member(groupId, userId);
|
|||
|
|
CREATE INDEX idx_member_active ON group_member(isActive);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **查询结果缓存**
|
|||
|
|
生产环境已自动启用数据库查询缓存(1分钟)
|
|||
|
|
|
|||
|
|
### 应用层缓存
|
|||
|
|
|
|||
|
|
应用已集成内存缓存,支持以下功能:
|
|||
|
|
- 用户信息缓存(5分钟)
|
|||
|
|
- 小组信息缓存(5分钟)
|
|||
|
|
- 预约信息缓存(5分钟)
|
|||
|
|
|
|||
|
|
缓存会在数据更新时自动失效。
|
|||
|
|
|
|||
|
|
### 压缩
|
|||
|
|
|
|||
|
|
已启用HTTP响应压缩(gzip),自动压缩所有响应。
|
|||
|
|
|
|||
|
|
## 监控和日志
|
|||
|
|
|
|||
|
|
### 应用日志
|
|||
|
|
```bash
|
|||
|
|
# Docker环境
|
|||
|
|
docker-compose -f docker-compose.prod.yml logs -f backend
|
|||
|
|
|
|||
|
|
# PM2环境
|
|||
|
|
pm2 logs gamegroup-backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 健康检查
|
|||
|
|
```bash
|
|||
|
|
# 检查应用状态
|
|||
|
|
curl http://localhost:3000/health
|
|||
|
|
|
|||
|
|
# 检查数据库连接
|
|||
|
|
curl http://localhost:3000/health/db
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能监控
|
|||
|
|
|
|||
|
|
建议集成以下监控工具:
|
|||
|
|
- **APM**: New Relic、Datadog、AppDynamics
|
|||
|
|
- **日志**: ELK Stack(Elasticsearch + Logstash + Kibana)
|
|||
|
|
- **指标**: Prometheus + Grafana
|
|||
|
|
|
|||
|
|
## 备份策略
|
|||
|
|
|
|||
|
|
### 数据库备份
|
|||
|
|
```bash
|
|||
|
|
# 手动备份
|
|||
|
|
docker exec gamegroup-mysql-prod mysqldump -u root -p gamegroup > backup_$(date +%Y%m%d_%H%M%S).sql
|
|||
|
|
|
|||
|
|
# 设置定时备份(crontab)
|
|||
|
|
0 2 * * * docker exec gamegroup-mysql-prod mysqldump -u root -p${DB_PASSWORD} gamegroup > /backups/backup_$(date +\%Y\%m\%d_\%H\%M\%S).sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 应用备份
|
|||
|
|
- 代码仓库定期推送
|
|||
|
|
- 配置文件加密存储
|
|||
|
|
- 定期测试恢复流程
|
|||
|
|
|
|||
|
|
## 安全建议
|
|||
|
|
|
|||
|
|
1. **环境变量**
|
|||
|
|
- 不要将 .env 文件提交到版本控制
|
|||
|
|
- 使用强密码(JWT_SECRET、数据库密码)
|
|||
|
|
- 定期轮换密钥
|
|||
|
|
|
|||
|
|
2. **网络安全**
|
|||
|
|
- 使用HTTPS(配置SSL证书)
|
|||
|
|
- 限制CORS来源
|
|||
|
|
- 启用请求速率限制
|
|||
|
|
|
|||
|
|
3. **数据库安全**
|
|||
|
|
- 使用非root用户连接
|
|||
|
|
- 限制远程访问
|
|||
|
|
- 定期更新密码
|
|||
|
|
|
|||
|
|
4. **应用安全**
|
|||
|
|
- 及时更新依赖包
|
|||
|
|
- 定期运行安全扫描(npm audit)
|
|||
|
|
- 配置防火墙规则
|
|||
|
|
|
|||
|
|
## 扩展性
|
|||
|
|
|
|||
|
|
### 水平扩展
|
|||
|
|
```bash
|
|||
|
|
# 启动多个后端实例
|
|||
|
|
docker-compose -f docker-compose.prod.yml up -d --scale backend=3
|
|||
|
|
|
|||
|
|
# 配置Nginx负载均衡
|
|||
|
|
# 编辑 nginx.conf,添加upstream配置
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Redis缓存(可选)
|
|||
|
|
如果需要在多实例间共享缓存:
|
|||
|
|
```bash
|
|||
|
|
# 添加Redis服务到docker-compose.prod.yml
|
|||
|
|
# 修改CacheService使用Redis替代内存存储
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 故障排查
|
|||
|
|
|
|||
|
|
### 常见问题
|
|||
|
|
|
|||
|
|
1. **数据库连接失败**
|
|||
|
|
- 检查环境变量配置
|
|||
|
|
- 确认MySQL服务已启动
|
|||
|
|
- 验证网络连接
|
|||
|
|
|
|||
|
|
2. **应用无法启动**
|
|||
|
|
- 查看日志 `docker logs gamegroup-backend-prod`
|
|||
|
|
- 检查端口占用 `lsof -i :3000`
|
|||
|
|
- 验证环境变量
|
|||
|
|
|
|||
|
|
3. **性能问题**
|
|||
|
|
- 检查数据库慢查询日志
|
|||
|
|
- 监控缓存命中率
|
|||
|
|
- 分析API响应时间
|
|||
|
|
|
|||
|
|
## 更新部署
|
|||
|
|
|
|||
|
|
### 零停机更新
|
|||
|
|
```bash
|
|||
|
|
# 构建新镜像
|
|||
|
|
docker-compose -f docker-compose.prod.yml build backend
|
|||
|
|
|
|||
|
|
# 滚动更新
|
|||
|
|
docker-compose -f docker-compose.prod.yml up -d --no-deps backend
|
|||
|
|
|
|||
|
|
# 验证新版本
|
|||
|
|
curl http://localhost:3000/health
|
|||
|
|
|
|||
|
|
# 如果有问题,回滚
|
|||
|
|
docker-compose -f docker-compose.prod.yml restart backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 联系支持
|
|||
|
|
|
|||
|
|
如有部署问题,请参考:
|
|||
|
|
- 项目文档: README.md
|
|||
|
|
- 问题追踪: GitHub Issues
|
|||
|
|
- 技术支持: [邮箱/联系方式]
|