|
@@ -0,0 +1,394 @@
|
|
|
|
|
+# 简炉远镇 游戏服务端
|
|
|
|
|
+
|
|
|
|
|
+## 项目结构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+jianyuyuanzhen/
|
|
|
|
|
+├── houduan/
|
|
|
|
|
+│ ├── cccz/
|
|
|
|
|
+│ │ ├── server/ # 主服务端
|
|
|
|
|
+│ │ │ ├── Workspace.sln # VS2019 解决方案入口
|
|
|
|
|
+│ │ │ ├── src/
|
|
|
|
|
+│ │ │ │ ├── core/ # 核心库(OpenCards.Core 等)
|
|
|
|
|
+│ │ │ │ ├── server/ # 业务服务端源码(29 个工程)
|
|
|
|
|
+│ │ │ │ ├── library/ # 预编译框架依赖(DeepCore / DeepFrozen)
|
|
|
|
|
+│ │ │ │ ├── data/
|
|
|
|
|
+│ │ │ │ │ ├── ServerData/ # 游戏配置/模板数据
|
|
|
|
|
+│ │ │ │ │ └── ClientScript/ # Lua 业务逻辑脚本(4361 个文件)
|
|
|
|
|
+│ │ │ │ ├── _output.server/ # 编译产物输出目录
|
|
|
|
|
+│ │ │ │ │ └── dev/ # 启动配置与脚本
|
|
|
|
|
+│ │ │ │ ├── afk.sql # 主库建库脚本(orm / dbpay)
|
|
|
|
|
+│ │ │ │ └── afk_gm.sql # GM 后台库脚本(afk_gm)
|
|
|
|
|
+│ │ │ └── DeepMMO/ # 底层框架源码
|
|
|
|
|
+│ │ └── data/ClientScript/ # 协议文件
|
|
|
|
|
+│ └── phpstudy_pro/WWW/apollo_60000/ # Nginx 静态文件(服务器列表等)
|
|
|
|
|
+└── server_battle/ # 战斗服(独立工程,.NET Framework 4.6)
|
|
|
|
|
+ ├── server_battle.sln
|
|
|
|
|
+ ├── GameLogic/
|
|
|
|
|
+ ├── ServerLib/
|
|
|
|
|
+ └── _output.battle.server/
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 节点架构
|
|
|
|
|
+
|
|
|
|
|
+| 启动顺序 | 节点 | 说明 | 端口 |
|
|
|
|
|
+|:---:|---|---|---|
|
|
|
|
|
+| 1 | `NameServer` | 根节点,节点注册中心 | RPC 17000 |
|
|
|
|
|
+| 2 | `PublicNode` | 公会 / 支付 / 聊天 / GM 后台 | RPC 17060,HTTP 18082 / 18088 / 18089 |
|
|
|
|
|
+| 3 | `GameNode1` | 游戏逻辑,客户端 TCP 连接入口 | RPC 17020,TCP 19821 |
|
|
|
|
|
+| 4 | `AccountNode1` | 账号 / 登录服务 | RPC 17010,HTTP 18081 |
|
|
|
|
|
+| 独立 | `BattleServer` | 战斗结算(独立进程) | HTTP 8088 |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+# Mac 本地开发环境
|
|
|
|
|
+
|
|
|
|
|
+## 依赖安装
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# .NET 5.0 SDK
|
|
|
|
|
+brew install --cask dotnet-sdk
|
|
|
|
|
+
|
|
|
|
|
+# 验证版本(需要 5.x)
|
|
|
|
|
+dotnet --version
|
|
|
|
|
+
|
|
|
|
|
+# MySQL、Redis、Nginx
|
|
|
|
|
+brew install mysql@5.7 redis nginx
|
|
|
|
|
+
|
|
|
|
|
+# libuv(服务端网络层依赖)
|
|
|
|
|
+brew install libuv
|
|
|
|
|
+
|
|
|
|
|
+# 启动服务并设置开机自启
|
|
|
|
|
+brew services start mysql@5.7
|
|
|
|
|
+brew services start redis
|
|
|
|
|
+brew services start nginx
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 初始化数据库
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 设置 MySQL root 密码为 123456(与配置文件一致)
|
|
|
|
|
+mysql_secure_installation
|
|
|
|
|
+
|
|
|
|
|
+mysql -u root -p < houduan/cccz/server/src/afk.sql
|
|
|
|
|
+mysql -u root -p < houduan/cccz/server/src/afk_gm.sql
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 配置 Nginx(服务器列表)
|
|
|
|
|
+
|
|
|
|
|
+编辑 Nginx 配置(`/opt/homebrew/etc/nginx/nginx.conf` 或新增 conf.d 文件):
|
|
|
|
|
+
|
|
|
|
|
+```nginx
|
|
|
|
|
+server {
|
|
|
|
|
+ listen 80;
|
|
|
|
|
+ server_name localhost;
|
|
|
|
|
+ root /path/to/jianyuyuanzhen/houduan/phpstudy_pro/WWW;
|
|
|
|
|
+ location /apollo_60000/ {
|
|
|
|
|
+ add_header Content-Type application/json;
|
|
|
|
|
+ try_files $uri =404;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+nginx -t && brew services restart nginx
|
|
|
|
|
+# 验证:curl http://localhost/apollo_60000/serverlist.json
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 编译主服务端
|
|
|
|
|
+
|
|
|
|
|
+Mac 下使用 `dotnet build` 命令行编译,无需 Visual Studio。
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+cd houduan/cccz/server/src/server/OpenCards.Server.DotNetCore
|
|
|
|
|
+
|
|
|
|
|
+dotnet build OpenCards.Server.DotNetCore.csproj -c Debug
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> **注意**:编译完成后 PostBuild 阶段会调用 `copydll.bat`,在 Mac 上会报错,这是正常的——
|
|
|
|
|
+> 实际 DLL 已通过 `<OutputPath>` 配置直接输出到 `_output.server/`,忽略该报错即可。
|
|
|
|
|
+
|
|
|
|
|
+## 配置启动参数
|
|
|
|
|
+
|
|
|
|
|
+编辑 `houduan/cccz/server/src/_output.server/dev/_launch_server.xml`,
|
|
|
|
|
+将 `ServerListUrl`、`client_storage_url` 等地址改为本机 Nginx 地址:
|
|
|
|
|
+
|
|
|
|
|
+```xml
|
|
|
|
|
+<ServerListUrl>http://127.0.0.1/apollo_60000/serverlist.json</ServerListUrl>
|
|
|
|
|
+<client_storage_url>http://127.0.0.1/apollo_60000/</client_storage_url>
|
|
|
|
|
+<StopServerDataURL>http://127.0.0.1/apollo_60000/stop_server_list.json</StopServerDataURL>
|
|
|
|
|
+<UpdateServerConfig>http://127.0.0.1/apollo_60000/update_server_config.json</UpdateServerConfig>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+MySQL 密码确认与配置文件一致(默认 `123456`):
|
|
|
|
|
+
|
|
|
|
|
+```xml
|
|
|
|
|
+<Mysql>server=127.0.0.1;User ID=root;Password=123456;database=orm</Mysql>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 启动主服务端
|
|
|
|
|
+
|
|
|
|
|
+**开 4 个终端窗口,按顺序执行**:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 公共变量
|
|
|
|
|
+export DEV=houduan/cccz/server/src/_output.server/dev
|
|
|
|
|
+export DLL=houduan/cccz/server/src/_output.server/OpenCards.Server.DotNetCore.dll
|
|
|
|
|
+
|
|
|
|
|
+# 终端 1 — NameServer(先启动)
|
|
|
|
|
+cd $DEV && dotnet ../$DLL ./_launch_server.xml NameServer
|
|
|
|
|
+
|
|
|
|
|
+# 终端 2 — PublicNode
|
|
|
|
|
+cd $DEV && dotnet ../$DLL ./_launch_server.xml PublicNode
|
|
|
|
|
+
|
|
|
|
|
+# 终端 3 — GameNode
|
|
|
|
|
+cd $DEV && dotnet ../$DLL ./_launch_server.xml GameNode1 global.RealmID=1 global.ServerID=1
|
|
|
|
|
+
|
|
|
|
|
+# 终端 4 — AccountNode(最后启动)
|
|
|
|
|
+cd $DEV && dotnet ../$DLL ./_launch_server.xml AccountNode1
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 启动战斗服(Mac 需要 Mono)
|
|
|
|
|
+
|
|
|
|
|
+战斗服基于 .NET Framework 4.6,Mac 下用 Mono 运行:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+brew install mono
|
|
|
|
|
+
|
|
|
|
|
+# 修改 Config.json,luaRoot 改为本机路径
|
|
|
|
|
+cat > server_battle/_output.battle.server/Config.json << 'EOF'
|
|
|
|
|
+{
|
|
|
|
|
+ "ip": "127.0.0.1",
|
|
|
|
|
+ "port": 8088,
|
|
|
|
|
+ "luaRoot": "/absolute/path/to/houduan/cccz/server/src/data/ClientScript/"
|
|
|
|
|
+}
|
|
|
|
|
+EOF
|
|
|
|
|
+
|
|
|
|
|
+cd server_battle/_output.battle.server
|
|
|
|
|
+mono GameLogic.exe
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+# Linux 部署
|
|
|
|
|
+
|
|
|
|
|
+## 1. 安装系统依赖
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# Ubuntu / Debian
|
|
|
|
|
+apt update
|
|
|
|
|
+apt install -y mysql-server redis-server nginx libuv1 mono-complete
|
|
|
|
|
+
|
|
|
|
|
+# CentOS / RHEL
|
|
|
|
|
+yum install -y mysql-server redis nginx libuv mono-complete
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 2. 安装 .NET 5.0
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+wget https://download.visualstudio.microsoft.com/download/pr/820db713-c9a5-466e-b72a-16f2f5ed00e2/628aa2a75f6aa270e77f4a83b3742fb8/dotnet-sdk-5.0.100-linux-x64.tar.gz
|
|
|
|
|
+
|
|
|
|
|
+mkdir -p $HOME/dotnet
|
|
|
|
|
+tar zxf dotnet-sdk-5.0.100-linux-x64.tar.gz -C $HOME/dotnet
|
|
|
|
|
+
|
|
|
|
|
+echo 'export DOTNET_ROOT=$HOME/dotnet' >> ~/.bashrc
|
|
|
|
|
+echo 'export PATH=$PATH:$HOME/dotnet' >> ~/.bashrc
|
|
|
|
|
+source ~/.bashrc
|
|
|
|
|
+
|
|
|
|
|
+dotnet --version # 确认输出 5.0.x
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 3. 初始化数据库
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+mysql -u root -p < houduan/cccz/server/src/afk.sql
|
|
|
|
|
+mysql -u root -p < houduan/cccz/server/src/afk_gm.sql
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 4. 上传服务端文件
|
|
|
|
|
+
|
|
|
|
|
+在本机(Windows/Mac)完成编译后上传到服务器:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 编译产物
|
|
|
|
|
+scp -r houduan/cccz/server/src/_output.server/ user@server:/opt/gameserver/_output.server/
|
|
|
|
|
+
|
|
|
|
|
+# Lua 脚本和游戏数据
|
|
|
|
|
+scp -r houduan/cccz/server/src/data/ user@server:/opt/gameserver/data/
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+目标服务器目录结构:
|
|
|
|
|
+```
|
|
|
|
|
+/opt/gameserver/
|
|
|
|
|
+├── _output.server/
|
|
|
|
|
+│ ├── OpenCards.Server.DotNetCore.dll
|
|
|
|
|
+│ ├── dev/
|
|
|
|
|
+│ │ └── _launch_server.xml
|
|
|
|
|
+│ └── logfile/
|
|
|
|
|
+└── data/
|
|
|
|
|
+ ├── ServerData/
|
|
|
|
|
+ └── ClientScript/
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 5. 修改启动配置
|
|
|
|
|
+
|
|
|
|
|
+编辑 `/opt/gameserver/_output.server/dev/_launch_server.xml`:
|
|
|
|
|
+
|
|
|
|
|
+```xml
|
|
|
|
|
+<!-- 服务器列表地址改为服务器公网 IP -->
|
|
|
|
|
+<ServerListUrl>http://<公网IP>/apollo_60000/serverlist.json</ServerListUrl>
|
|
|
|
|
+<client_storage_url>http://<公网IP>/apollo_60000/</client_storage_url>
|
|
|
|
|
+<StopServerDataURL>http://<公网IP>/apollo_60000/stop_server_list.json</StopServerDataURL>
|
|
|
|
|
+<UpdateServerConfig>http://<公网IP>/apollo_60000/update_server_config.json</UpdateServerConfig>
|
|
|
|
|
+
|
|
|
|
|
+<!-- MySQL 密码 -->
|
|
|
|
|
+<Mysql>server=127.0.0.1;User ID=root;Password=YOUR_PASSWORD;database=orm</Mysql>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+`TemplateRoot` 使用相对路径 `../../data/ServerData/`,
|
|
|
|
|
+确保 `_output.server/dev/` 和 `data/` 在同一父目录下即可,无需修改。
|
|
|
|
|
+
|
|
|
|
|
+## 6. 配置 Nginx
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+mkdir -p /var/www/html/apollo_60000
|
|
|
|
|
+cp houduan/phpstudy_pro/WWW/apollo_60000/* /var/www/html/apollo_60000/
|
|
|
|
|
+
|
|
|
|
|
+cat > /etc/nginx/conf.d/gameserver.conf << 'EOF'
|
|
|
|
|
+server {
|
|
|
|
|
+ listen 80;
|
|
|
|
|
+ server_name _;
|
|
|
|
|
+ root /var/www/html;
|
|
|
|
|
+ location /apollo_60000/ {
|
|
|
|
|
+ add_header Content-Type application/json;
|
|
|
|
|
+ try_files $uri =404;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+EOF
|
|
|
|
|
+
|
|
|
|
|
+nginx -t && systemctl reload nginx
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 7. 启动主服务端
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+BASE=/opt/gameserver/_output.server
|
|
|
|
|
+DLL=$BASE/OpenCards.Server.DotNetCore.dll
|
|
|
|
|
+CFG=$BASE/dev/_launch_server.xml
|
|
|
|
|
+
|
|
|
|
|
+# 按顺序后台启动(建议使用 screen 或 systemd 管理)
|
|
|
|
|
+cd $BASE/dev
|
|
|
|
|
+
|
|
|
|
|
+nohup dotnet $DLL $CFG NameServer > $BASE/logfile/nameserver.log 2>&1 &
|
|
|
|
|
+sleep 3
|
|
|
|
|
+
|
|
|
|
|
+nohup dotnet $DLL $CFG PublicNode > $BASE/logfile/publicnode.log 2>&1 &
|
|
|
|
|
+sleep 3
|
|
|
|
|
+
|
|
|
|
|
+nohup dotnet $DLL $CFG GameNode1 global.RealmID=1 global.ServerID=1 > $BASE/logfile/gamenode1.log 2>&1 &
|
|
|
|
|
+sleep 3
|
|
|
|
|
+
|
|
|
|
|
+nohup dotnet $DLL $CFG AccountNode1 > $BASE/logfile/accountnode.log 2>&1 &
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 各节点日志也会自动写入 `_output.server/logfile/` 目录(log4net 配置)。
|
|
|
|
|
+
|
|
|
|
|
+## 8. 启动战斗服
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 修改 luaRoot 为 Linux 路径
|
|
|
|
|
+cat > server_battle/_output.battle.server/Config.json << 'EOF'
|
|
|
|
|
+{
|
|
|
|
|
+ "ip": "0.0.0.0",
|
|
|
|
|
+ "port": 8088,
|
|
|
|
|
+ "luaRoot": "/opt/gameserver/data/ClientScript/"
|
|
|
|
|
+}
|
|
|
|
|
+EOF
|
|
|
|
|
+
|
|
|
|
|
+cd server_battle/_output.battle.server
|
|
|
|
|
+nohup mono GameLogic.exe > /var/log/battleserver.log 2>&1 &
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 9. 用 systemd 管理进程(推荐)
|
|
|
|
|
+
|
|
|
|
|
+以 NameServer 为例,创建 `/etc/systemd/system/gameserver-name.service`:
|
|
|
|
|
+
|
|
|
|
|
+```ini
|
|
|
|
|
+[Unit]
|
|
|
|
|
+Description=Game NameServer
|
|
|
|
|
+After=network.target
|
|
|
|
|
+
|
|
|
|
|
+[Service]
|
|
|
|
|
+WorkingDirectory=/opt/gameserver/_output.server/dev
|
|
|
|
|
+ExecStart=/root/dotnet/dotnet /opt/gameserver/_output.server/OpenCards.Server.DotNetCore.dll ./_launch_server.xml NameServer
|
|
|
|
|
+Restart=on-failure
|
|
|
|
|
+RestartSec=5
|
|
|
|
|
+
|
|
|
|
|
+[Install]
|
|
|
|
|
+WantedBy=multi-user.target
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+systemctl daemon-reload
|
|
|
|
|
+systemctl enable gameserver-name
|
|
|
|
|
+systemctl start gameserver-name
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+其余节点(PublicNode / GameNode1 / AccountNode1)按同样方式创建对应 service 文件。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 端口规划
|
|
|
|
|
+
|
|
|
|
|
+| 服务 | 端口 | 协议 |
|
|
|
|
|
+|---|---|---|
|
|
|
|
|
+| NameServer | 17000 | RPC |
|
|
|
|
|
+| AccountNode RPC | 17010 | RPC |
|
|
|
|
|
+| GameNode1 RPC | 17020 | RPC |
|
|
|
|
|
+| PublicNode RPC | 17060 | RPC |
|
|
|
|
|
+| AccountServer(登录) | 18081 | HTTP |
|
|
|
|
|
+| PayServer(支付) | 18082 | HTTP |
|
|
|
|
|
+| AdminService(GM 接口) | 18088 | HTTP |
|
|
|
|
|
+| ChatService | 18089 | HTTP |
|
|
|
|
|
+| ConnectorService(客户端) | 19821 | TCP |
|
|
|
|
|
+| BattleServer(战斗结算) | 8088 | HTTP |
|
|
|
|
|
+| Nginx(服务器列表) | 80 | HTTP |
|
|
|
|
|
+| MySQL | 3306 | TCP |
|
|
|
|
|
+| Redis | 6379 | TCP |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 前端调试连接速查
|
|
|
|
|
+
|
|
|
|
|
+前端/客户端只需关心以下几个对外暴露的地址,其余 RPC 端口是服务端内部通信,不需要配置。
|
|
|
|
|
+
|
|
|
|
|
+### 本机调试(服务端跑在本地)
|
|
|
|
|
+
|
|
|
|
|
+| 用途 | 地址 | 备注 |
|
|
|
|
|
+|---|---|---|
|
|
|
|
|
+| 服务器列表 | `http://43.226.57.217/apollo_60000/serverlist.json` | Nginx 静态文件,客户端启动时拉取 |
|
|
|
|
|
+| 登录 / 账号接口 | `http://43.226.57.217:18081` | AccountNode HTTP,登录、注册等接口 |
|
|
|
|
|
+| 游戏逻辑连接 | `43.226.57.217:19821` | TCP 长连接,游戏主逻辑入口 |
|
|
|
|
|
+| 战斗结算 | `http://43.226.57.217:8088` | BattleServer HTTP,战斗结果上报 |
|
|
|
|
|
+| GM 后台 | `http://43.226.57.217:18088` | AdminService,仅调试用 |
|
|
|
|
|
+
|
|
|
|
|
+### 连接远程服务器
|
|
|
|
|
+
|
|
|
|
|
+将上表中的 `127.0.0.1` 替换为服务器公网 IP 即可。例如服务器 IP 为 `1.2.3.4`:
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+服务器列表:http://1.2.3.4/apollo_60000/serverlist.json
|
|
|
|
|
+登录接口: http://1.2.3.4:18081
|
|
|
|
|
+游戏连接: 1.2.3.4:19821 (TCP)
|
|
|
|
|
+战斗服: http://1.2.3.4:8088
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> **防火墙注意**:远程服务器需要开放 `80`、`18081`、`19821`、`8088` 端口,其余端口(17000~17060)是内网 RPC,不需要对外暴露。
|
|
|
|
|
+
|
|
|
|
|
+## 注意事项
|
|
|
|
|
+
|
|
|
|
|
+- 4 个主节点**必须按顺序启动**,NameServer 最先、AccountNode 最后,否则节点注册会失败
|
|
|
|
|
+- `TemplateRoot` 使用相对路径,工作目录必须在 `_output.server/dev/` 下执行 dotnet 命令
|
|
|
|
|
+- 战斗服 `Config.json` 中的 `luaRoot` 不同系统路径格式不同:Windows 用 `\\`,Mac/Linux 用 `/`
|
|
|
|
|
+- `serverlist.json` 中的 `address` 字段需与 `ConnectorService` 实际监听的 `IP:Port`(默认 19821)一致
|
|
|
|
|
+- `update_server_config.json` 中的 `loginServerUrl` 需指向 AccountNode 的 HTTP 地址(默认端口 18081)
|