Skip to content

手工部署与多 GS ​

手工部署用于自动脚本不可用、需要精确控制单一组件或进行灾备恢复的场景。管理员仍应先运行只读校验,并以 deploy/realms/catalog.json 为唯一正式主机与实例清单。109 配置只在 d2109/deploy/runtime.json,113 配置只在 d2113/deploy/runtime.json。Windows 正式主机在 hosts,停用但保留迁移能力的 Linux 主机在 legacyHosts;不得从本文抄写 IP、端口或目录到新脚本。

发布前基线 ​

powershell
# 进入项目根目录,后续命令均以此目录为基准。
Set-Location C:\D2113server
# 检查当前代码和未提交变更,避免漏发运营人员已完成的修改。
git status --short
# 校验主机、论坛入口、GS 实例、API 环境和必需部署文件。
python .\scripts\d2ctl.py validate
# 打印当前正式 Web 地址以及 109/113 免费、VIP GS 放置关系。
python .\scripts\d2ctl.py list

每次手工发布都必须先备份目标文件和服务配置,记录备份路径,上传到临时目录,校验哈希后再原子替换。不要在服务运行目录中直接覆盖正在执行的 EXE、DLL 或角色存档。

手工部署论坛 ​

论坛源目录为 forum/phpwind/phpwind_GBK_8.7/upload。109 只能发布到 d2109/,113 只能发布到 d2113/;入口和通知文件不得跨目录共用。PHP 文件可重命名,但必须同步修改清单中的 forumEntry 和 API 环境中的论坛入口变量,再执行校验。

推荐先用论坛专用发布器完成备份、增量上传、旧入口清理、数据库地址更新和哈希验收:

powershell
# 只打印论坛部署计划,确认不会夹带游戏核心变更。
python .\scripts\d2ctl.py deploy all --component forum
# 正式发布两版独立论坛目录,不构建或重启 API 与后台。
python .\scripts\d2ctl.py deploy all --component forum --apply

脚本不可用时,手工步骤依次为:停止论坛写入口;备份 D:\AH.DIABLO2.COM.CN、D:\AH.DIABLO2.COM.CN\forum-services\d2109\run-php.cmd 和 D:\AH.DIABLO2.COM.CN\forum-services\d2113\run-php.cmd;上传到临时目录;分别覆盖 d2109/ 和 d2113/;核对 GBK 编码;用各自的 PHP 运行时执行语法检查;备份并更新 IIS;恢复写入口;验证两个页面及内部商品接口。数据库迁移只能执行仓库内受版本控制的 SQL,不可在生产库临时手写字段。

手工部署管理后台 ​

powershell
# 安装锁定版本依赖;不会连接正式服务器。
# 安装并测试 109 后台依赖;不访问正式服务器。
npm.cmd --prefix .\d2109\admin-ui ci
# 构建 109 后台;产物只写入 d2109\admin-ui\dist。
npm.cmd --prefix .\d2109\admin-ui run build
# 运行 109 后台单元测试。
npm.cmd --prefix .\d2109\admin-ui test
# 安装并测试 113 后台依赖;不访问正式服务器。
npm.cmd --prefix .\d2113\admin-ui ci
# 构建 113 后台;产物只写入 d2113\admin-ui\dist。
npm.cmd --prefix .\d2113\admin-ui run build
# 运行 113 后台单元测试。
npm.cmd --prefix .\d2113\admin-ui test
# 只预演 109 后台部署,不影响 113 后台。
python .\scripts\d2ctl.py deploy 109b --component admin
# 只发布 109 后台;服务为 D2Admin109,入口为 GM109.ZHIYESHI.CN 根路径。
python .\scripts\d2ctl.py deploy 109b --component admin --apply
# 只发布 113 后台;服务为 D2Admin113,入口为 GM113.ZHIYESHI.CN 根路径。
python .\scripts\d2ctl.py deploy 113c --component admin --apply

纯手工替换时分别备份 D:\GM109.DIABLO2.COM.CN\admin 与 D:\GM113.DIABLO2.COM.CN\admin,只上传对应项目的 server.js、前端构建、运行时依赖和受控配置。两边 runner 都名为本项目根目录内的 run-admin.cmd,密钥和令牌只能保留或轮换,不能写回 Git。任一后台缺少论坛地址、本版本 API 地址或凭据时必须拒绝启动。

手工部署 Realm API ​

API 的非敏感环境保存在各项目自己的 deploy/runtime.json,密码、签名密钥、写令牌和 D2GS 管理密码继续由受限的服务启动文件保存。109 runner 位于 C:\D2109server,113 runner 位于 C:\D2113server。

powershell
# 使用 Win7 x86 工具链构建两版共用的 Realm API 可执行文件。
cmd.exe /d /c .\scripts\build-api-win7-x86.cmd
# 只打印 113 API 更新计划,不启动部署。
python .\scripts\d2ctl.py deploy 113c --component api
# 正式发布 113 API,并保留 109 API 不变。
python .\scripts\d2ctl.py deploy 113c --component api --apply
# 仅在明确需要同时更新两个非游戏 API 时使用;当前 109-only 日常发布不要使用 all。
python .\scripts\d2ctl.py deploy all --component api --apply

手工生成启动文件时禁止在 Python、JavaScript、PHP 或批处理模板中写死论坛地址。先修改对应版本的 deploy/runtime.json,通过 d2ctl validate 后再由部署器生成启动文件。109 使用 D2109_FORUM_*,113 使用 D2113_FORUM_*。

109 多 GS ​

109 当前登记两个实例:免费 D2GS 和 VIP D2GS109Vip。它们位于不同主机,拥有独立目录、注册表键、D2CS 端口和管理口,但共享 109 的 D2DBS/角色数据契约。不能复制 D:\d2 后直接双击第二个 D2GS.exe,否则会争用注册表、TCP 4000 和进程级标识。

由于两个 GS 位于不同主机,后台不能只连接核心 D2109Api。VIP 主机必须运行系统专用 D2109VipAgent,端口和服务名来自 catalog.json 的 109b.gsInstances.vip.managementAgent。该 Agent 使用 109 API 二进制和独占系统拓扑,只允许 /health、/api/system/*,不得用它处理账号、角色、论坛订单或交易。

powershell
# 只预演 109 免费 GS 更新。
python .\scripts\d2ctl.py deploy 109b --component gs --instance free
# 正式更新并验收 109 免费 GS,VIP GS 保持不变。
python .\scripts\d2ctl.py deploy 109b --component gs --instance free --apply
# 只预演 109 VIP GS 更新。
python .\scripts\d2ctl.py deploy 109b --component gs --instance vip
# 正式更新并验收 109 VIP GS,免费 GS 保持不变。
python .\scripts\d2ctl.py deploy 109b --component gs --instance vip --apply
# 正式依次更新 109 免费与 VIP GS。
python .\scripts\d2ctl.py deploy 109b --component gs --instance all --apply

113 多 GS ​

113 当前登记两个实例:免费 D2GS 和 VIP D2GS113Vip。VIP 实例使用独立控制器、服务名、注册表键和目录;两个实例的部署器不同,统一 GS 调度器会按清单选择正确实现。

powershell
# 只预演 113 免费 GS 更新。
python .\scripts\d2ctl.py deploy 113c --component gs --instance free
# 正式更新并验收 113 免费 GS,VIP GS 保持不变。
python .\scripts\d2ctl.py deploy 113c --component gs --instance free --apply
# 只预演 113 VIP GS 更新。
python .\scripts\d2ctl.py deploy 113c --component gs --instance vip
# 正式更新并验收 113 VIP GS,免费 GS 保持不变。
python .\scripts\d2ctl.py deploy 113c --component gs --instance vip --apply
# 正式依次更新 113 免费与 VIP GS。
python .\scripts\d2ctl.py deploy 113c --component gs --instance all --apply

新增第三个 GS 前,先在清单登记唯一主机、服务名、目录、注册表键、监听口、管理口、D2CS/D2DBS 端口和部署命令,再扩展对应版本控制器的实例隔离能力。清单校验通过不代表二进制天然支持同主机多实例;必须在测试机验证注册表、端口钩子、窗口消息和 D2GS 管理口均已隔离。

文档与完整 Web ​

powershell
# 构建并只发布在线文档,不重启论坛、后台、API 或游戏服务。
python .\scripts\d2ctl.py deploy all --component docs --apply
# 分别发布 109 API 与后台;该命令不会更新 113。
python .\scripts\d2ctl.py deploy 109b --component api --component admin --apply
# 单独发布论坛中的两套版本目录和独立 PHP runner。
python .\scripts\d2ctl.py deploy all --component forum --apply

Linux 手工部署 ​

Linux/Docker 仅使用 deploy/.env 和 Compose 配置提供环境值,不把正式地址写进镜像或源代码。109 与 113 必须使用不同卷、容器名、角色目录、数据库和 API 索引。

bash
# 从示例生成本机配置;随后只在服务器上填写密钥和环境差异。
cp deploy/.env.example deploy/.env
# 展开 Compose 最终配置并检查变量是否全部解析,不启动容器。
docker compose --env-file deploy/.env -f deploy/docker-compose.prod.yml config
# 构建镜像,不启动服务。
docker compose --env-file deploy/.env -f deploy/docker-compose.prod.yml build
# 启动配置中明确选择的服务;执行前确认卷与版本隔离。
docker compose --env-file deploy/.env -f deploy/docker-compose.prod.yml up -d
# 查看服务状态和健康信息,不修改容器。
docker compose --env-file deploy/.env -f deploy/docker-compose.prod.yml ps

回滚 ​

论坛或后台可回滚上一份目录备份;API 回滚二进制时必须同时恢复匹配的启动文件;GS 回滚必须同时恢复 EXE、DLL、d2server.ini、注册表导出和服务环境。角色或订单已经产生写入时,不能只回滚程序,应先关闭写入口并按订单、角色 revision 和备份时间点对账。

仅供 CNBN D2 服务管理与开发人员使用