Files
whale-town-end/DEPLOYMENT.md
moyin d80d2c5cb8 docs:更新README、贡献者文档和部署指南
- 更新README.md:添加管理员后台系统介绍,更新测试统计为154个用例
- 更新CONTRIBUTORS.md:补充jianuo的管理员后台开发贡献,更新项目里程碑
- 更新DEPLOYMENT.md:完善前后端分离部署方案,添加管理员后台配置说明
- 反映最新管理员后台功能的部署要求和配置变更
2025-12-22 15:13:04 +08:00

418 lines
8.9 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.
# 🚀 Whale Town 部署指南
本文档详细说明如何部署 Whale Town 像素游戏后端服务到生产环境。
## 📋 前置要求
### 基础环境
- **Node.js** 18+ (推荐 20.x LTS)
- **pnpm** 包管理器
- **MySQL** 8.0+
- **Redis** 6.0+ (可选,支持文件存储模式)
- **PM2** 进程管理器(推荐)
- **Nginx** 反向代理(推荐)
### 新增要求 (管理员后台)
- **Web服务器** (Nginx/Apache) - 用于前端管理界面
- **SSL证书** (推荐) - 保护管理后台安全
## 部署步骤
### 1. 服务器环境准备
```bash
# 安装 Node.js (使用 NodeSource 仓库)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# 安装 pnpm
curl -fsSL https://get.pnpm.io/install.sh | sh
source ~/.bashrc
# 安装 PM2
npm install -g pm2
# 安装 MySQL
sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation
```
### 2. 克隆项目
```bash
# 创建项目目录
sudo mkdir -p /var/www
cd /var/www
# 克隆项目(替换为你的实际仓库地址)
git clone https://gitea.xinghangee.icu/datawhale/whale-town-end.git
cd whale-town-end
```
### 3. 配置环境
```bash
# 复制环境配置文件
cp .env.production.example .env.production
# 编辑环境配置(填入实际的数据库信息)
nano .env.production
# 复制部署脚本
cp deploy.sh.example deploy.sh
chmod +x deploy.sh
# 编辑部署脚本(修改路径配置)
nano deploy.sh
# 复制 webhook 处理器
cp webhook-handler.js.example webhook-handler.js
# 编辑 webhook 处理器(修改密钥和路径)
nano webhook-handler.js
```
### 4. 数据库设置
```bash
# 登录 MySQL
sudo mysql -u root -p
# 创建数据库和用户
CREATE DATABASE pixel_game_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pixel_game'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON pixel_game_db.* TO 'pixel_game'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
### 5. 安装依赖和构建
```bash
# 安装后端依赖
pnpm install --frozen-lockfile
# 安装前端依赖 (新增)
cd client
pnpm install --frozen-lockfile
cd ..
# 构建后端
pnpm run build
# 构建前端管理界面 (新增)
cd client
pnpm run build
cd ..
```
### 6. 启动服务
```bash
# 使用 PM2 启动应用
pm2 start ecosystem.config.js --env production
# 保存 PM2 配置
pm2 save
# 设置开机自启
pm2 startup
# 按照提示执行显示的命令
```
### 7. 配置 Nginx
#### 方案一: 分离部署 (推荐)
创建后端API配置
```bash
sudo nano /etc/nginx/sites-available/whale-town-api
```
```nginx
server {
listen 80;
server_name api.whaletown.com;
location / {
proxy_pass http://localhost:3000;
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;
}
}
```
创建前端管理界面配置:
```bash
sudo nano /etc/nginx/sites-available/whale-town-admin
```
```nginx
server {
listen 80;
server_name admin.whaletown.com;
root /var/www/whale-town-end/client/dist;
index index.html;
# SPA路由支持
location / {
try_files $uri $uri/ /index.html;
}
# API代理
location /api/ {
proxy_pass http://api.whaletown.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
```
#### 方案二: 单域名部署
创建统一配置:
```bash
sudo nano /etc/nginx/sites-available/whale-town-unified
```
```nginx
server {
listen 80;
server_name whaletown.com;
# API接口
location /api/ {
proxy_pass http://localhost:3000/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 管理后台
location /admin/ {
alias /var/www/whale-town-end/client/dist/;
try_files $uri $uri/ /admin/index.html;
}
# 主站点 (可选)
location / {
proxy_pass http://localhost:3000;
}
}
```
启用配置:
```bash
# 启用站点
sudo ln -s /etc/nginx/sites-available/whale-town-* /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重载配置
sudo systemctl reload nginx
```
## 🔒 SSL证书配置 (推荐)
### 使用 Let's Encrypt
```bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 为API域名申请证书
sudo certbot --nginx -d api.whaletown.com
# 为管理后台申请证书
sudo certbot --nginx -d admin.whaletown.com
# 设置自动续期
sudo crontab -e
# 添加: 0 12 * * * /usr/bin/certbot renew --quiet
```
## 🎛️ 管理员后台配置
### 环境变量配置
`.env.production` 中添加:
```bash
# 管理员Token配置 (必须)
ADMIN_TOKEN_SECRET=your_super_strong_random_secret_at_least_32_chars
ADMIN_TOKEN_TTL_SECONDS=28800
# 首次部署启用管理员引导
ADMIN_BOOTSTRAP_ENABLED=true
ADMIN_USERNAME=admin
ADMIN_PASSWORD=YourStrongPassword123!
ADMIN_NICKNAME=系统管理员
# CORS配置 (如果前后端分离)
CORS_ORIGIN=https://admin.whaletown.com
```
### 访问管理后台
- **地址**: https://admin.whaletown.com
- **默认账号**: admin / YourStrongPassword123!
**⚠️ 重要**: 首次登录后立即修改密码并关闭引导功能 (`ADMIN_BOOTSTRAP_ENABLED=false`)
## 📡 Gitea Webhook 配置
1. 在 Gitea 仓库中进入 **Settings****Webhooks**
3. 配置:
- **Target URL**: `http://your-server.com:9000/webhook``http://your-domain.com/webhook`
- **HTTP Method**: `POST`
- **POST Content Type**: `application/json`
- **Secret**: 与 `webhook-handler.js` 中的 `SECRET` 一致
- **Trigger On**: 选择 `Push events`
- **Branch filter**: `main`
## ✅ 验证部署
### 基础服务检查
```bash
# 检查PM2服务状态
pm2 status
# 检查后端API
curl http://localhost:3000/
curl http://localhost:3000/api-docs
# 检查前端管理界面
curl -I https://admin.whaletown.com
```
### 管理员后台测试
```bash
# 测试管理员登录API
curl -X POST https://api.whaletown.com/admin/auth/login \
-H "Content-Type: application/json" \
-d '{"identifier":"admin","password":"YourStrongPassword123!"}'
# 访问管理界面
# 浏览器打开: https://admin.whaletown.com
```
### 功能验证清单
- [ ] 后端API服务正常响应
- [ ] API文档可访问
- [ ] 前端管理界面加载正常
- [ ] 管理员登录功能正常
- [ ] 用户管理功能正常
- [ ] 日志查看功能正常
- [ ] SSL证书配置正确
## 🔧 常用命令
### 服务管理
```bash
# 重启后端服务
pm2 restart whale-town-end
# 重启前端服务 (如果使用PM2托管)
pm2 restart whale-town-admin
# 查看服务日志
pm2 logs whale-town-end --lines 100
pm2 logs whale-town-admin --lines 100
# 手动部署
bash deploy.sh
```
### 更新部署
```bash
# 更新后端
git pull origin main
pnpm install
pnpm run build
pm2 reload whale-town-end
# 更新前端管理界面
cd client
git pull origin main
pnpm install
pnpm run build
sudo systemctl reload nginx
cd ..
```
### 日志管理
```bash
# 查看应用日志
tail -f logs/app.log
# 查看管理员操作日志
tail -f logs/admin.log
# 查看Nginx日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
```
## 🚨 故障排除
### 后端服务问题
**服务无法启动**
- 检查环境变量配置 (`cat .env.production`)
- 检查数据库连接 (`mysql -u pixel_game -p`)
- 查看PM2日志 (`pm2 logs whale-town-end`)
- 检查端口占用 (`netstat -tlnp | grep 3000`)
**管理员登录失败**
- 验证 `ADMIN_TOKEN_SECRET` 配置
- 检查管理员账号是否创建
- 查看后端错误日志
- 确认密码复杂度要求
### 前端管理界面问题
**界面无法访问**
- 检查前端构建是否成功 (`ls -la client/dist/`)
- 验证Nginx配置 (`sudo nginx -t`)
- 检查域名解析
- 查看Nginx错误日志
**API请求失败**
- 检查CORS配置
- 验证API代理设置
- 确认后端服务状态
- 检查防火墙规则
### 数据库连接问题
**连接失败**
- 检查MySQL服务状态 (`sudo systemctl status mysql`)
- 验证数据库用户权限
- 检查网络连接
- 确认数据库配置
### SSL证书问题
**证书验证失败**
- 检查证书有效期 (`sudo certbot certificates`)
- 验证域名解析
- 重新申请证书 (`sudo certbot --nginx -d your-domain.com`)
### 性能问题
**响应缓慢**
- 检查系统资源使用 (`htop`, `df -h`)
- 优化数据库查询
- 配置Redis缓存
- 启用Nginx压缩
### 日志文件过大
**磁盘空间不足**
- 配置日志轮转 (`sudo nano /etc/logrotate.d/whale-town`)
- 清理旧日志文件
- 监控磁盘使用情况