Files
game_server/docs/部署指南.md

697 lines
13 KiB
Markdown
Raw Permalink 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.

# 游戏平台服务器部署指南
本文档提供游戏平台服务器Game Platform Server的完整部署指南包括环境准备、数据库配置、应用部署和运行维护等内容。
## 目录
- [系统要求](#系统要求)
- [环境准备](#环境准备)
- [数据库配置](#数据库配置)
- [应用配置](#应用配置)
- [构建和部署](#构建和部署)
- [启动和验证](#启动和验证)
- [监控和维护](#监控和维护)
- [故障排除](#故障排除)
- [安全注意事项](#安全注意事项)
## 系统要求
### 硬件要求
- **CPU**: 2核心以上推荐4核心
- **内存**: 4GB以上推荐8GB
- **存储**: 20GB以上可用空间
- **网络**: 稳定的网络连接
### 软件要求
- **操作系统**:
- Linux推荐 Ubuntu 20.04+ 或 CentOS 7+
- macOS 10.15+
- Windows 10+
- **Java**: JDK 17 或更高版本
- **Maven**: 3.9+ 版本
- **MySQL**: 8.0+ 版本
- **Git**: 用于代码拉取
## 环境准备
### 1. 安装 Java 17
#### Ubuntu/Debian
```bash
sudo apt update
sudo apt install openjdk-17-jdk
```
#### CentOS/RHEL
```bash
sudo yum install java-17-openjdk-devel
```
#### macOS
```bash
brew install openjdk@17
```
验证安装:
```bash
java -version
javac -version
```
### 2. 安装 Maven
#### Ubuntu/Debian
```bash
sudo apt install maven
```
#### CentOS/RHEL
```bash
sudo yum install maven
```
#### macOS
```bash
brew install maven
```
验证安装:
```bash
mvn -version
```
### 3. 安装 MySQL 8.0
#### Ubuntu/Debian
```bash
sudo apt update
sudo apt install mysql-server-8.0
sudo mysql_secure_installation
```
#### CentOS/RHEL
```bash
sudo yum install mysql-server
sudo systemctl enable mysqld
sudo systemctl start mysqld
sudo mysql_secure_installation
```
#### macOS
```bash
brew install mysql
brew services start mysql
```
## 数据库配置
### 1. 创建数据库和用户
登录 MySQL
```bash
sudo mysql -u root -p
```
创建数据库和用户:
```sql
-- 创建数据库
CREATE DATABASE login_task_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 创建用户(如果需要)
CREATE USER 'login_task_db'@'%' IDENTIFIED BY '3MaXfeWJ4d6cGMrL';
-- 授权
GRANT ALL PRIVILEGES ON login_task_db.* TO 'login_task_db'@'%';
FLUSH PRIVILEGES;
-- 退出
EXIT;
```
### 2. 初始化数据库表结构
```bash
# 切换到项目目录
cd /path/to/game_server
# 执行基础表结构
mysql -u login_task_db -p login_task_db < src/main/resources/schema.sql
# 执行迁移脚本(如果存在)
mysql -u login_task_db -p login_task_db < src/main/resources/db/migration/V20250915__create_device_status_transition.sql
mysql -u login_task_db -p login_task_db < src/main/resources/db/migration/V20250920__create_script_operation_log.sql
# 如果有其他初始化SQL文件也需要执行
# mysql -u login_task_db -p login_task_db < docs/game.sql
```
### 3. 验证数据库连接
```bash
mysql -u login_task_db -p -h localhost login_task_db -e "SHOW TABLES;"
```
## 应用配置
### 1. 克隆项目代码
```bash
# 克隆代码仓库
git clone <repository-url> game_server
cd game_server
```
### 2. 配置应用参数
复制并修改配置文件:
```bash
# 备份原配置
cp src/main/resources/application.yml src/main/resources/application.yml.backup
# 编辑配置文件
vim src/main/resources/application.yml
```
### 3. 关键配置项说明
#### 数据库配置
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/login_task_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&sessionVariables=innodb_lock_wait_timeout=30
username: login_task_db
password: 3MaXfeWJ4d6cGMrL # 请修改为实际密码
driver-class-name: com.mysql.cj.jdbc.Driver
```
#### 服务器配置
```yaml
server:
port: 18080 # 可根据需要修改端口
```
#### JWT 安全配置
```yaml
security:
jwt:
secret: "your-super-long-secret-key-here" # 生产环境必须修改
access-token-minutes: 1440
refresh-token-days: 7
```
#### 外部服务配置
```yaml
script:
base-url: "http://36.138.184.60:12345" # 根据实际环境修改
api-base-url: "http://36.138.184.60:1234" # 根据实际环境修改
connect-timeout-ms: 3000
read-timeout-ms: 5000
app:
base-url: "https://yourdomain.com" # 修改为实际域名
```
### 4. 环境变量配置(推荐)
为了安全起见,建议使用环境变量配置敏感信息:
```bash
# 创建环境变量文件
cat > .env << EOF
DB_HOST=localhost
DB_PORT=3306
DB_NAME=login_task_db
DB_USERNAME=login_task_db
DB_PASSWORD=3MaXfeWJ4d6cGMrL
JWT_SECRET=your-super-long-secret-key-here
SERVER_PORT=18080
SCRIPT_BASE_URL=http://36.138.184.60:12345
SCRIPT_API_BASE_URL=http://36.138.184.60:1234
APP_BASE_URL=https://yourdomain.com
EOF
# 加载环境变量
source .env
```
## 构建和部署
### 1. 构建应用
```bash
# 清理并编译
mvn clean compile
# 运行测试(可选)
mvn test
# 打包应用
mvn clean package -DskipTests
```
构建成功后JAR文件位于 `target/server-0.0.1-SNAPSHOT.jar`
### 2. 创建部署目录
```bash
# 创建部署目录
sudo mkdir -p /opt/gameplatform
sudo chown $USER:$USER /opt/gameplatform
# 复制文件
cp target/server-0.0.1-SNAPSHOT.jar /opt/gameplatform/
cp -r logs /opt/gameplatform/ 2>/dev/null || mkdir /opt/gameplatform/logs
cp .env /opt/gameplatform/ 2>/dev/null || true
```
### 3. 创建启动脚本
```bash
cat > /opt/gameplatform/start.sh << 'EOF'
#!/bin/bash
# 设置工作目录
cd /opt/gameplatform
# 加载环境变量
if [ -f .env ]; then
source .env
fi
# 设置JVM参数
JAVA_OPTS="-Xms1g -Xmx2g -server"
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
# 启动应用
java $JAVA_OPTS -jar server-0.0.1-SNAPSHOT.jar > logs/console.log 2>&1 &
# 保存进程ID
echo $! > app.pid
echo "应用已启动进程ID: $(cat app.pid)"
echo "日志文件: logs/console.log"
echo "应用端口: ${SERVER_PORT:-18080}"
EOF
chmod +x /opt/gameplatform/start.sh
```
### 4. 创建停止脚本
```bash
cat > /opt/gameplatform/stop.sh << 'EOF'
#!/bin/bash
cd /opt/gameplatform
if [ -f app.pid ]; then
PID=$(cat app.pid)
if ps -p $PID > /dev/null; then
echo "正在停止应用 (PID: $PID)..."
kill -TERM $PID
# 等待进程优雅退出
for i in {1..30}; do
if ! ps -p $PID > /dev/null; then
echo "应用已成功停止"
rm -f app.pid
exit 0
fi
sleep 1
done
# 强制终止
echo "强制终止应用..."
kill -KILL $PID
rm -f app.pid
else
echo "应用未运行"
rm -f app.pid
fi
else
echo "未找到PID文件"
fi
EOF
chmod +x /opt/gameplatform/stop.sh
```
### 5. 创建重启脚本
```bash
cat > /opt/gameplatform/restart.sh << 'EOF'
#!/bin/bash
cd /opt/gameplatform
echo "重启应用..."
./stop.sh
sleep 2
./start.sh
EOF
chmod +x /opt/gameplatform/restart.sh
```
## 启动和验证
### 1. 启动应用
```bash
cd /opt/gameplatform
./start.sh
```
### 2. 检查启动状态
```bash
# 检查进程
ps aux | grep java
# 检查端口
netstat -tlnp | grep 18080
# 查看启动日志
tail -f logs/console.log
```
### 3. 健康检查
```bash
# 基础健康检查
curl http://localhost:18080/actuator/health
# 预期返回
{"status":"UP"}
```
### 4. API测试
```bash
# 测试登录接口(需要先在数据库中创建用户)
curl -X POST http://localhost:18080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin7uqweh12"}'
# 访问Swagger文档
curl http://localhost:18080/swagger-ui.html
```
## 监控和维护
### 1. 创建系统服务(推荐)
```bash
sudo tee /etc/systemd/system/gameplatform.service > /dev/null << 'EOF'
[Unit]
Description=Game Platform Server
After=network.target mysql.service
[Service]
Type=forking
User=gameplatform
Group=gameplatform
WorkingDirectory=/opt/gameplatform
ExecStart=/opt/gameplatform/start.sh
ExecStop=/opt/gameplatform/stop.sh
ExecReload=/opt/gameplatform/restart.sh
PIDFile=/opt/gameplatform/app.pid
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 创建专用用户
sudo useradd -r -s /bin/false gameplatform
sudo chown -R gameplatform:gameplatform /opt/gameplatform
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable gameplatform
sudo systemctl start gameplatform
sudo systemctl status gameplatform
```
### 2. 日志轮转配置
```bash
sudo tee /etc/logrotate.d/gameplatform > /dev/null << 'EOF'
/opt/gameplatform/logs/*.log {
daily
missingok
rotate 30
compress
notifempty
create 644 gameplatform gameplatform
postrotate
systemctl reload gameplatform 2>/dev/null || true
endscript
}
EOF
```
### 3. 监控脚本
```bash
cat > /opt/gameplatform/monitor.sh << 'EOF'
#!/bin/bash
cd /opt/gameplatform
check_process() {
if [ -f app.pid ]; then
PID=$(cat app.pid)
if ps -p $PID > /dev/null; then
echo "✓ 应用正在运行 (PID: $PID)"
return 0
else
echo "✗ 应用未运行PID文件存在但进程不存在"
rm -f app.pid
return 1
fi
else
echo "✗ 应用未运行未找到PID文件"
return 1
fi
}
check_port() {
PORT=${SERVER_PORT:-18080}
if netstat -tlnp 2>/dev/null | grep ":$PORT " > /dev/null; then
echo "✓ 端口 $PORT 正在监听"
return 0
else
echo "✗ 端口 $PORT 未监听"
return 1
fi
}
check_health() {
PORT=${SERVER_PORT:-18080}
if curl -sf http://localhost:$PORT/actuator/health > /dev/null; then
echo "✓ 健康检查通过"
return 0
else
echo "✗ 健康检查失败"
return 1
fi
}
echo "=== 游戏平台服务器状态检查 ==="
echo "时间: $(date)"
echo
check_process && check_port && check_health
echo
echo "最近的日志:"
tail -5 logs/console.log 2>/dev/null || echo "无法读取日志文件"
EOF
chmod +x /opt/gameplatform/monitor.sh
```
## 故障排除
### 常见问题和解决方案
#### 1. 应用启动失败
**检查步骤:**
```bash
# 查看详细错误日志
tail -100 /opt/gameplatform/logs/console.log
# 检查Java版本
java -version
# 检查端口占用
netstat -tlnp | grep 18080
```
**常见原因:**
- Java版本不兼容需要Java 17+
- 端口被占用
- 数据库连接失败
- 配置文件错误
#### 2. 数据库连接问题
**检查步骤:**
```bash
# 测试数据库连接
mysql -u login_task_db -p -h localhost login_task_db
# 检查MySQL服务状态
sudo systemctl status mysql
```
**解决方案:**
- 确认MySQL服务正在运行
- 检查用户名密码是否正确
- 确认数据库名称是否存在
- 检查防火墙设置
#### 3. 内存不足
**症状:**
- 应用启动缓慢或失败
- 频繁的垃圾回收
**解决方案:**
```bash
# 调整JVM内存参数修改start.sh
JAVA_OPTS="-Xms512m -Xmx1g -server"
```
#### 4. 权限问题
```bash
# 修复文件权限
sudo chown -R gameplatform:gameplatform /opt/gameplatform
sudo chmod +x /opt/gameplatform/*.sh
```
### 日志查看命令
```bash
# 查看应用日志
tail -f /opt/gameplatform/logs/console.log
# 查看系统服务日志
sudo journalctl -u gameplatform -f
# 查看错误日志
grep -i error /opt/gameplatform/logs/console.log
# 查看最近100行日志
tail -100 /opt/gameplatform/logs/console.log
```
## 安全注意事项
### 1. 修改默认配置
**必须修改的配置项:**
- JWT密钥修改 `security.jwt.secret`
- 数据库密码:使用强密码
- 默认用户密码修改admin账户密码
### 2. 网络安全
```bash
# 配置防火墙示例Ubuntu UFW
sudo ufw allow 18080/tcp
sudo ufw allow 22/tcp
sudo ufw enable
# 限制数据库访问
sudo ufw allow from 127.0.0.1 to any port 3306
```
### 3. 文件权限
```bash
# 设置适当的文件权限
chmod 600 /opt/gameplatform/.env
chmod 750 /opt/gameplatform
chmod 644 /opt/gameplatform/*.jar
```
### 4. SSL/TLS配置
生产环境建议配置HTTPS
```yaml
server:
port: 443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: your-keystore-password
key-store-type: PKCS12
```
## 更新和维护
### 应用更新流程
```bash
# 1. 备份当前版本
cp /opt/gameplatform/server-0.0.1-SNAPSHOT.jar /opt/gameplatform/server-backup-$(date +%Y%m%d).jar
# 2. 停止应用
cd /opt/gameplatform
./stop.sh
# 3. 更新代码和构建
cd /path/to/source
git pull
mvn clean package -DskipTests
# 4. 替换JAR文件
cp target/server-0.0.1-SNAPSHOT.jar /opt/gameplatform/
# 5. 启动应用
cd /opt/gameplatform
./start.sh
# 6. 验证更新
./monitor.sh
```
### 数据库备份
```bash
# 创建备份脚本
cat > /opt/gameplatform/backup_db.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/gameplatform/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
mysqldump -u login_task_db -p3MaXfeWJ4d6cGMrL login_task_db > $BACKUP_DIR/login_task_db_$DATE.sql
# 压缩备份文件
gzip $BACKUP_DIR/login_task_db_$DATE.sql
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "数据库备份完成: $BACKUP_DIR/login_task_db_$DATE.sql.gz"
EOF
chmod +x /opt/gameplatform/backup_db.sh
# 设置定时备份每天凌晨2点
echo "0 2 * * * /opt/gameplatform/backup_db.sh" | sudo crontab -
```
---
本文档提供了游戏平台服务器的完整部署指南。如有问题,请参考项目的其他文档或联系开发团队。