Skip to content

正式服务器干净重装 ​

本流程用于服务器混入旧 Web 服务、旧版目录、残留历史服务或积累大量发布备份的情况。它不是“格式化磁盘”:账号、角色、数据库、论坛附件、密钥和当前配置必须保留。只有在完整盘点、临时回滚快照和预演完成后才能清理。

当前生产目标 ​

  • 109 主机运行:109 BNetD、免费/VIP D2CS、D2DBS、109 免费 D2GS、109 API、109 后台和 109 入口。
  • 113/Web 主机运行:109 VIP D2GS、109 VIP Agent、113 API、113 后台、IIS、两套独立论坛 FastCGI 和文档。
  • 113 游戏的 BNetD、D2CS、D2DBS、免费 D2GS、VIP D2GS全部停止,不因更新 113 后台而启动。
  • Nginx、独立 PHP-CGI 服务、旧隧道、旧共享后台、历史 113 GS 副本和无效 Web 目录不存在。

绝对保留的数据 ​

主机数据示例路径
109PvPGN 账号、角色、锁、配置D:\pvpgn\var、D:\pvpgn\conf
109109 免费 GS 当前程序和配置D:\d2
两台MySQL 数据目录和配置D:\mysql
113/Web109 VIP GS 当前程序D:\d2-109-vip
113/Web113 PvPGN 数据(即使游戏停用)D:\pvpgn\var
113/Web论坛程序、附件、头像和配置D:\AH.DIABLO2.COM.CN
两台当前 runner 中的秘密run-*.cmd、secrets

任何脚本都不得递归删除上述路径。角色和数据库备份必须在另一块盘或另一台机器上验证后才算有效。

第一步:只读盘点 ​

powershell
# 进入开发机项目目录。
Set-Location C:\D2113server
# 校验正式拓扑和部署文件。
python .\scripts\d2ctl.py validate
# 显示当前正式放置关系。
python .\scripts\d2ctl.py list
# 只读检查两套后台、API、PHP 和监听端口。
python .\scripts\inspect-formal-web.py

在服务器管理员 PowerShell 中记录服务、端口和根目录。输出保存到维护工单,不要只依赖记忆。

powershell
# 导出服务清单到桌面文本文件。
Get-CimInstance Win32_Service | Sort-Object Name | Select-Object Name,State,StartMode,PathName | Out-File "$env:USERPROFILE\Desktop\services-before.txt" -Encoding utf8
# 导出 TCP 监听端口。
netstat -ano -p tcp | Out-File "$env:USERPROFILE\Desktop\ports-before.txt" -Encoding ascii
# 导出 C 盘根目录清单。
Get-ChildItem C:\ -Force | Select-Object FullName,LastWriteTime | Out-File "$env:USERPROFILE\Desktop\c-root-before.txt" -Encoding utf8
# 导出 D 盘根目录清单。
Get-ChildItem D:\ -Force | Select-Object FullName,LastWriteTime | Out-File "$env:USERPROFILE\Desktop\d-root-before.txt" -Encoding utf8

第二步:制作一次性回滚快照 ​

快照至少包含服务注册表、IIS 配置、runner、论坛配置、PvPGN 配置、数据库一致性备份和玩家数据。不要把正在变化的 MySQL 文件夹直接复制当成数据库备份,应使用数据库导出或停库冷备。

powershell
# 创建本次维护临时目录;日期按实际维护日修改。
New-Item -ItemType Directory -Path D:\maintenance-rollback-20260831 -Force
# 导出全部服务注册表,便于恢复启动参数。
reg.exe export HKLM\SYSTEM\CurrentControlSet\Services D:\maintenance-rollback-20260831\services.reg /y
# 复制 109 后台 runner;本行只在 109 主机执行。
Copy-Item D:\GM109.DIABLO2.COM.CN\run-admin.cmd D:\maintenance-rollback-20260831\ -ErrorAction SilentlyContinue
# 复制 109/113 论坛环境源和 113 后台 runner;本行只在 113/Web 主机执行。
Copy-Item D:\AH.DIABLO2.COM.CN\forum-services\d2109\run-php.cmd,D:\GM113.DIABLO2.COM.CN\run-admin.cmd,D:\AH.DIABLO2.COM.CN\forum-services\d2113\run-php.cmd D:\maintenance-rollback-20260831\ -ErrorAction SilentlyContinue
# 导出 IIS 全局配置;必须使用管理员 PowerShell。
& $env:windir\system32\inetsrv\appcmd.exe add backup "CNBN-manual-20260831"

正式维护中要使用项目备份脚本和数据库凭据执行完整备份,详见备份与恢复。验收结束后删除本次临时回滚目录,长期备份进入受控备份库。

第三步:清理旧 Web 服务并安装 IIS ​

按 IIS 安装与使用 操作。迁移脚本会先保留旧入口作回滚,IIS 验收成功后才禁用 Nginx 和独立 PHP-CGI 服务。若发现非本项目网站,先暂停并联系负责人。

第四步:清理残留 ​

只删除盘点中已经满足以下全部条件的对象:不在当前清单;没有运行服务指向;不包含唯一玩家/数据库/附件数据;已有本次快照;名称和绝对路径已人工核对。

典型可清理项:带时间戳的旧后台/文档/论坛发布备份、旧共享 admin-ui、旧隧道 runner、已经停用且不在当前清单的 113 GS 程序副本、根目录散落的 .bak/.codex-* 可执行文件。不要仅按文件扩展名批量删除。

Windows 删除前必须先解析绝对路径并确认它位于预期根目录。服务则先停止、禁用、核对 sc qc 与 srvany Parameters,最后 sc delete。

powershell
# 查看候选服务真实启动路径;把服务名替换为盘点出的候选项。
sc.exe qc <候选服务名>
# 查看 srvany 包装服务的真实 Application 和 AppParameters。
reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\<候选服务名>\Parameters"
# 停止确认废弃的服务。
Stop-Service <候选服务名> -Force
# 删除确认废弃的服务注册项。
sc.exe delete <候选服务名>

第五步:干净部署 ​

先构建、测试,再按组件发布。当前生产不得执行 113 game 或 113 gs。

powershell
# 重新校验工作区。
python .\scripts\d2ctl.py validate
# 构建并测试 109 后台。
npm.cmd --prefix .\d2109\admin-ui run build
# 构建并测试 113 后台。
npm.cmd --prefix .\d2113\admin-ui run build
# 构建在线文档。
npm.cmd --prefix .\docs-site run build
# 预演 109 API 与后台发布。
python .\scripts\d2ctl.py deploy 109b --component api --component admin
# 正式发布 109 API 与后台。
python .\scripts\d2ctl.py deploy 109b --component api --component admin --apply
# 预演 113 API 与后台发布;不包含游戏。
python .\scripts\d2ctl.py deploy 113c --component api --component admin
# 正式发布 113 API 与后台;113 游戏保持停止。
python .\scripts\d2ctl.py deploy 113c --component api --component admin --apply
# 正式发布两套独立论坛目录和 PHP runner。
python .\scripts\d2ctl.py deploy all --component forum --apply
# 正式发布 IIS 公网入口、论坛和在线文档。
python .\scripts\d2ctl.py deploy all --component docs --apply

游戏组件只有在二进制确实变化且维护窗口允许时才单独部署 109 免费/VIP实例。不要用“全量部署”掩盖组件选择。

第六步:验收和收尾 ​

  1. 核对所有预期 Windows 服务状态。
  2. 核对 80、4087、1890、21130、4139、4143 等端口的绑定地址;内部端口不得公网监听,49009/49013 不应再存在。
  3. 打开 AH.ZHIYESHI.CN、AH.ZHIYESHI.CN/docs/、GM109.ZHIYESHI.CN、GM113.ZHIYESHI.CN。
  4. 同一浏览器分别登录两个后台。
  5. 测试 109 免费与 VIP 真实客户端链路。
  6. 查询 113 游戏服务,确认全部停止。
  7. 检查 IIS、后台、API、PHP FastCGI 和游戏日志中没有持续新增错误。
  8. 删除本次部署器产生的多余历史备份,只保留当前版本和一个已验证回滚版本。
  9. 验收完成后删除一次性维护快照;长期玩家数据备份继续保留。

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