Appearance
正式服务器干净重装
本流程用于服务器混入旧 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 目录不存在。
绝对保留的数据
| 主机 | 数据 | 示例路径 |
|---|---|---|
| 109 | PvPGN 账号、角色、锁、配置 | D:\pvpgn\var、D:\pvpgn\conf |
| 109 | 109 免费 GS 当前程序和配置 | D:\d2 |
| 两台 | MySQL 数据目录和配置 | D:\mysql |
| 113/Web | 109 VIP GS 当前程序 | D:\d2-109-vip |
| 113/Web | 113 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实例。不要用“全量部署”掩盖组件选择。
第六步:验收和收尾
- 核对所有预期 Windows 服务状态。
- 核对 80、4087、1890、21130、4139、4143 等端口的绑定地址;内部端口不得公网监听,49009/49013 不应再存在。
- 打开
AH.ZHIYESHI.CN、AH.ZHIYESHI.CN/docs/、GM109.ZHIYESHI.CN、GM113.ZHIYESHI.CN。 - 同一浏览器分别登录两个后台。
- 测试 109 免费与 VIP 真实客户端链路。
- 查询 113 游戏服务,确认全部停止。
- 检查 IIS、后台、API、PHP FastCGI 和游戏日志中没有持续新增错误。
- 删除本次部署器产生的多余历史备份,只保留当前版本和一个已验证回滚版本。
- 验收完成后删除一次性维护快照;长期玩家数据备份继续保留。