Appearance
图形化离线部署工具
本工具没有预设运营域名、服务器 IP、邮箱或固定盘符。所有相对路径均以完整部署包的解压根目录为基准;保存的实例 JSON 是该实例唯一的环境配置来源。
可搬迁路径和自定义域名
- 默认安装目录为
instances/<实例ID>,默认组件目录为.。 .表示CNBN-D2-Deployment-GUI.exe所在的完整解压目录,不表示命令提示符当前目录。- PHP 和 Node.js 默认分别使用
runtime-dependencies/php/php-cgi.exe与runtime-dependencies/node/node.exe。 - 论坛、管理后台和在线文档的公网域名都在“网络”页单独填写,不带
http://、https://或路径。 - 证书域名在“HTTPS 证书”页填写,可与任意自有域名配合;申请邮箱默认为空,必须由当前运营方填写。
- 需要私有 ACME 服务时填写完整“ACME 服务地址”;留空则使用 ACME 客户端默认服务。
- 多个客户、多个版本或多个国度必须分别保存实例 JSON,不能复用密码、令牌、端口或证书状态目录。
实例安装完成后,API、后台及证书脚本通过自身目录定位 runtime、runtime-dependencies、日志和备份目录。移动整个实例目录后不需要搜索替换旧盘符;Windows 服务或计划任务若已安装,需要在新位置重新执行一次部署以刷新系统登记的可执行文件路径。
本页面向第一次接触服务器的管理员。准备 CNBN-D2-deploy-...zip 离线部署包;如果 D2GS 组件未带齐游戏运行资源,还需准备对应版本的 DLL、MPQ 资源目录(也可以选择完整客户端目录)。D2GS 不需要 Game.exe。目标服务器不需要预装 Python、Node.js 或 PHP。
一、压缩包里有什么
解压后请保持整个目录不变,不要只复制 EXE。
| 文件或目录 | 用途 | 能否删除 |
|---|---|---|
CNBN-D2-Deployment-GUI.exe | 图形化部署工具 | 不能 |
components/realm/109b | 1.09 PvPGN、D2CS、D2DBS、D2GS | 部署 109 时不能 |
components/realm/113c | 1.13c PvPGN、D2CS、D2DBS、D2GS | 部署 113c 时不能 |
components/api | 109 与 113 各自独立的 API | 部署 API 时不能 |
components/admin | 109 与 113 各自独立的管理后台 | 部署后台时不能 |
components/forum | PHPWind 与分版本论坛服务文件 | 部署论坛时不能 |
components/docs-site | 已编译的在线文档 | 部署文档站时不能 |
runtime-dependencies/php | 已展开的 PHP 5.6 运行环境 | 部署论坛时不能 |
runtime-dependencies/node | 已展开的 Node.js 12 运行环境 | 部署后台时不能 |
runtime-dependencies/*.zip | PHP、Node 原始离线包,便于校验和恢复 | 建议保留 |
SHA256SUMS.txt | 包内文件完整性清单 | 不能 |
GUI 会从自身所在目录自动发现 components、php-cgi.exe 和 node.exe。如果这三处仍是空白,最常见原因是压缩包没有完整解压,或 EXE 被单独移到了别处。
二、部署前只做三件事
- 使用管理员账号登录目标 Windows Server。
- 把完整离线包解压到短路径,例如
D:\CNBN-Deploy。 - 如果部署 D2GS 且组件未带齐运行资源,把对应版本的 DLL、MPQ 目录放到服务器本地磁盘,例如
D:\D2-109-assets。所选目录中应直接包含资源文件;组件已完整时,“游戏资源目录(可选)”可留空。
不要把客户端的 Save、截图、私人密钥或玩家存档放进部署包。GUI 只读取客户端程序文件,正式角色存档由 PvPGN/D2DBS 管理。
三、第一次打开
右键 CNBN-D2-Deployment-GUI.exe,选择“以管理员身份运行”。首次运行时 Windows 可能显示安全提示,请核对文件名和随包 SHA-256 后再允许。
打开后,以下三项应已经自动填写:
组件包根目录:当前解压目录。php-cgi 路径:runtime-dependencies\php\php-cgi.exe。node 路径:runtime-dependencies\node\node.exe。
管理员通常只需要修改:游戏版本、实例 ID、国度名称、免费或 VIP、安装根目录、游戏资源目录(按需),以及准备安装的组件。
四、最简单的单机部署
- 在“实例”页选择游戏版本。
- 实例 ID 使用容易识别的英文小写名称,例如
109-free或109-vip。 - 安装根目录建议使用
D:\CNBN\realms\109-free这类独立目录。 - 若 D2GS 组件未带齐资源,选择对应版本的游戏资源目录;组件完整时留空。
- 在“组件”页选择需要的组件。第一次建立完整国度可选择 BNetD、D2CS、D2DBS、D2GS 和 API。
- 打开“网络”页检查端口。相同主机上的实例不能监听同一个端口。
- 点击“预检”。只有错误数量为零才可以正式部署。
- 点击“正式部署”。部署工具先备份旧目录,再复制组件并写入本实例配置。
- 在“计划与日志”页确认每项均完成,并保存配置 JSON,方便以后更新同一个实例。
选择论坛时,PHP 会复制到当前实例的 runtime-dependencies\php;选择后台时,Node.js 会复制到当前实例的 runtime-dependencies\node。因此两个实例不会共用运行中的 PHP 或 Node 文件。
五、多国度和多主机
每台主机都运行一份 GUI,只选择本机实际承载的组件。不要在 A 主机的工具里填写 B 主机的磁盘路径。
中心主机
中心主机通常部署 BNetD、D2CS、D2DBS 和 API。允许连接 D2CS/D2DBS 的 GS 地址 填写所有 GS 主机地址;多个地址按现有 PvPGN 配置约定分隔。
GS 主机
每台 GS 主机只选择 D2GS,并把 D2CS 主机地址、D2DBS 主机地址 填成中心主机的内网地址。如果填写游戏资源目录,该目录必须位于当前 GS 主机本地。
多个免费或 VIP 国度
每个国度使用不同实例 ID、安装目录和监听端口。连接到同一个中心服务时,要保证 realmName、D2CS 地址和端口组合与中心主机的国度配置一致。部署前先导出计划,逐台核对后再执行。
六、版本范围
GUI 可配置 1.09b、1.09d、1.10、1.11、1.11b、1.12a、1.13c、1.13d、1.14a、1.14b、1.14c 和 1.14d。当前完整离线包内置经过本项目验证的 109b 与 113c 成品。
其他版本可以使用 GUI,但必须另行提供与所选版本完全一致、包含 bundle.json 的组件包。GUI 会拒绝把 113d D2GS 部署到 114d 实例,也不会通过删除版本检查来强行混用存档格式。
七、常见提示
找不到组件包
确认 EXE 旁边仍有 components 目录;不要只把 EXE 拖到桌面。重新解压完整 ZIP 通常即可恢复。
D2GS 缺少核心运行文件
GUI 对内置 1.09/1.13c 按 D2GS 源码的核心文件清单检查 DLL 和 MPQ,包括 d2server.dll、D2Game.dll、D2Data.mpq、D2Exp.mpq、Patch_D2.mpq 等。文件可分布在组件目录和游戏资源目录中,部署时优先保留组件文件,再补齐资源目录中的缺项。按提示补全对应版本文件,不需要上传 Game.exe;仅有 Game.exe 也不能证明服务端资源完整。其他版本继续校验外部包的 bundle.json 版本,不套用内置版本的文件清单。
如果仍出现“组件包内必须包含 Game.exe”的旧提示,请更新 GUI 可执行文件。
缺少 php-cgi.exe 或 node.exe
runtime-dependencies 没有完整解压。不要从网上临时下载不同版本替换,重新解压随包运行时。
端口已被占用
更新已有实例时可能是旧服务仍在运行;新建实例时必须改用空闲端口。不要直接结束不认识的系统进程。
Windows 服务安装失败
关闭 GUI,右键选择“以管理员身份运行”,再次预检并部署。GUI 会检查提权状态;已通过该检查仍失败时,需要查看退出码,不能只归因于权限。
0xC0000135:程序缺少依赖 DLL。随包 PvPGN 是 x86 程序,需要对应版本的 Visual C++ v14 x86 运行库、Universal CRT 和随包zlib.dll;仅安装 x64 运行库不够。0xC000007B:程序或 DLL 架构不匹配,例如混用 x86、x64 文件。0xC0000139:DLL 入口点不兼容,检查运行库和操作系统版本。- 退出码
5或740:检查管理员提权、服务管理权限及目录权限。
运行库版本不得早于服务端编译工具链版本。当前本地 PvPGN 成品的链接器版本为 14.51;微软最新 v14 运行库支持 Windows Server 2016/2019/2022/2025。GUI 使用 Python 3.8 打包并不表示包内所有服务端程序都兼容旧 Windows。Server 2008 R2、2012/R2 应使用另行验证的旧系统兼容服务端构建,不能简单替换成更旧的运行库。参见微软运行库版本及系统要求。
BNetD 的实际 Windows 服务名为 bnetd,D2CS、D2DBS 分别为 d2cs、d2dbs。GUI 仅在服务不存在(1060)时执行注册,并在注册后验证服务存在。仍失败时,从“计划与日志”复制命令、退出码和输出,并核对 Windows 事件查看器的应用程序日志。
八、更新与回滚
更新时打开上次保存的配置,不要重新建立一个默认配置。保持“部署前备份”勾选,预检通过后再部署。备份位于实例目录的 backups 下;回滚前先停止对应实例服务,只恢复本实例目录,不要拿 109 的备份覆盖 113。
九、HTTPS 证书与自动续期
部署包已经附带 lego.exe、PHP 证书有效期检查器和续期脚本,不需要管理员另行下载 ACME 客户端。打开“组件”页勾选“HTTPS 证书与续期”,再到“HTTPS 证书”页填写参数。
| 参数 | 填写方法 |
|---|---|
| 申请邮箱 | 用于 Let's Encrypt 注册和到期通知,必须是可用邮箱 |
| 证书域名 | 填写已经解析到当前主机的域名,多个域名用英文逗号分隔 |
| HTTPS 端口 | 通常为 443;防火墙和云安全组都必须放行 |
| 提前续期天数 | 默认 30,表示剩余不足 30 天时续期 |
| 每日检查时间 | 24 小时制 HH:MM,例如 03:37 |
| 计划任务名称前缀 | 同一主机部署多个实例时必须不同 |
| HTTPS 绑定地址 | 默认 0.0.0.0;多 IP 主机可填写该实例实际绑定的 IPv4 地址 |
| ACME 服务地址 | 通常留空;使用企业或自建 ACME 时填写完整 https://... 地址 |
| 部署后立即申请 | 首次部署应勾选;只准备文件时可以暂时取消 |
| 开机绑定修复 | 建议保持勾选,服务器启动时重新确认 HTTP.sys 证书绑定 |
首次申请使用 TLS-ALPN-01 验证。域名必须先解析到当前服务器,公网 443 端口必须可达;申请期间 IIS 会短暂停止。证书仍有足够有效期时,每日任务只检查证书和绑定,不会停止网站。组件的证书、ACME 账号、密码、日志和计划任务都保存在当前实例目录,两个实例不会共用状态。
部署完成后,任务计划程序中应存在 <任务前缀>-Certificate-Renewal 每日续期任务,以及勾选开机修复时创建的 <任务前缀>-Certificate-Binding-Repair。续期日志位于 <安装根目录>\https\renew.log。不要删除 state、pfx-password.txt 或 current-thumbprint.txt。