Skip to content

Ubuntu 后台、论坛与游戏 API 部署记录 ​

2026-09-07 当前状态 ​

生产主机 8.137.127.175 的 109 Free1、VIP1、VIP2 及 GameAgent 已部署。现有两个后台、论坛镜像和程序保留;本轮只更新 109 API 连接环境并重建 admin109 / forum 容器使配置生效。113 游戏服务和 API 尚未部署。OpenResty 反代、域名与证书未改动。

服务公开地址宿主机端口
109 后台https://gm109.diablo2.com.cn/3011
113 后台https://gm113.diablo2.com.cn/3012
论坛https://ah.diablo2.com.cn/3013
在线文档https://ah.diablo2.com.cn/docs/deployment/gateway通过论坛静态路径
109 GameAgent内部 api109:21130127.0.0.1:3014

论坛、后台程序和所有附件、缓存、配置、会话、日志仍在 /opt/cnbn-web。API 在 /opt/cnbn-api-109b,游戏与存档在 /opt/cnbn-game。第二块磁盘以 UUID 7A12C86F12C83245 持久挂载到 /WEB;原客户端文件保留,未重复上传。

实际连接配置 ​

  • admin109 的 D2_API_BASE 和论坛 D2109_API_BASE 为 http://api109:21130;通过现有 cnbn-web_web 网络访问。
  • 两个后台到论坛使用各自 D2_FORUM_INTERNAL_BASE、D2_FORUM_ENTRY_PATH、D2_FORUM_INTERNAL_TOKEN;109 / 113 令牌隔离。
  • 109 API 使用 D2113_FORUM_INTERNAL_BASE=http://forum、D2113_FORUM_ENTRY_PATH=/d2109/d2109.php、D2109_FORUM_CHAT_PATH=/d2109/d2chat.php。
  • 每个 GS 的 /opt/cnbn-game/config/109b/gs-business.env 配置 D2109_FORUM_HOST=forum、D2109_FORUM_PORT=80、D2109_FORUM_PATH=/d2109/d2109.php 及独立内部令牌;三个 GS 已加入论坛网络。
  • API 和后台的写入令牌、签名密钥、key ID 已对齐;配置文件权限 600,文档和源码不保存其值。
  • 数据库在既有 MySQL 容器,宿主机连接 127.0.0.1:1890,容器使用 1Panel-mysql-UCSb:3306。账户 pvpgn_109、API 业务 d2109_core、论坛 test_bbs 三库独立。
  • 113 API 地址仍为未部署占位值,这是本轮只部署 109 游戏的边界;113 后台与论坛业务读取不依赖 113 API。

通过环境变量可以把后台和论坛拆到其他主机;届时将内部 Docker DNS 名改成目标私网地址,并同步对应令牌。GameAgent 仍需贴近权威存档运行,避免跨主机文件锁问题。

验收与维护 ​

两个后台均通过登录、Secure Cookie、论坛业务接口读取、CSRF 写入回读及错误版本令牌拒绝检查。109 后台到 GameAgent 鉴权健康检查、三 GS 到论坛内部鉴权通过。三国度完成建房、进入游戏与 v92 存档验证;VIP1、VIP2 无权益账号均被拒绝。GS 运行状态通过私网管理端口读取,容器启停仍使用 Compose。

部署过程在生产监测内存、swap、PSI 和容器资源,未在生产执行编译。每 GS 256 MiB 内存上限,每国度设 30 个房间;详细压力记录、镜像版本和限制见网关部署文档。所有在线文档均在本地构建后上传静态文件,无需重新构建网站。

检查入口:deploy/linux/web-verify-local-interaction.sh、production-business-verify.sh、production-stage-status.sh。私钥通过 D2113_LINUX_WEB_SSH_KEY 环境变量传入 scripts/linux_web_remote.py;不得写入源码或发布包。

以下为重装前历史,不代表上述当前状态。

历史部署记录(2026-09-06,重装前) ​

更新:2026-09-06。本次只在 8.137.127.175 部署 109 后台、113 后台和全新 PHPWind 8.7 论坛。未部署 GameAgent API、游戏服务或网关,未导入旧论坛备份。两个后台自身不需要 MySQL;当前只使用一个论坛库 test_bbs。

入口与验收 ​

服务地址容器服务名
109 后台https://gm109.diablo2.com.cn/admin109
113 后台https://gm113.diablo2.com.cn/admin113
论坛https://ah.diablo2.com.cn/forum
论坛管理https://ah.diablo2.com.cn/admin.phpforum
本次在线运维文档https://ah.diablo2.com.cn/docs/forum 提供静态文档

管理员账户名均为 admin,初始密码按部署时的用户要求设置;SSH、数据库密码及随机密钥不写入文档或源码包。两个后台有独立会话密钥及版本范围,论坛有独立的创始人账户。运行环境为 Ubuntu 22.04 amd64、Docker 29.8.0、Compose v5.5.1;后台使用 Node 22,论坛为兼容现有源码使用 PHP 5.6。

服务器本机已验证三个服务的 HTTP 响应、两个后台登录及会话版本、论坛用户登录和管理登录。论坛初始化前确认 test_bbs 为空,使用原生安装器完成建表、缓存、导航和安装锁;关闭了安装器的外部云注册步骤,公开安装入口返回 403。

论坛公网入口现为 https://ah.diablo2.com.cn/:OpenResty 终止 TLS(443),内部转发到 127.0.0.1:3013。已通过真实浏览器验证首页 8 张图片加载成功,CSS、JavaScript 正常,控制台无错误。两个后台现分别通过 gm109、gm113 的 HTTPS 域名访问,内部仍转发到 3011、3012。原有 3010、1Panel、OpenResty 与 MySQL 服务未变更。

HTTPS 域名接入 ​

2026-09-06 修复:数据库 pw_config.db_bbsurl 原为 http://8.137.127.175:3013,PHPWind 生成的 HTML base 地址保留 HTTP 和 3013,导致 HTTPS 页面资源加载失败。现已改成 https://ah.diablo2.com.cn,并调用原生 updatecache_c() 重建配置缓存。只在 OpenResty 配置 443 转发并不会自动修改论坛数据库中的站点地址。

OpenResty 已正确设置 Host 与 X-Forwarded-Proto,无需修改其端口映射。论坛 Apache 使用 SetEnvIfExpr,仅信任实际宿主机 Docker 网关 172.18.0.1/32 传入的 X-Forwarded-Proto: https,使 PHPWind 正确识别 HTTPS。换网络后应重新核对网关地址。不要无条件信任公网请求自行携带的代理头。

修复脚本为 deploy/linux/forum-fix-https.sh 和 forum-set-public-url.php。前者备份 Apache、环境和原缓存,再验证并平滑加载 Apache;后者仅允许 CLI 执行,通过原生数据库接口更新公开地址及缓存。服务器备份位于 /opt/cnbn-web/forum/config/before-https-20260906-203302。论坛环境中的 D2_FORUM_PUBLIC_HOST 同步为域名。之后恢复旧论坛数据库时,须在管理设置中重新核对 HTTPS 站点地址并重建缓存。

宿主机目录 ​

部署根目录为 /opt/cnbn-web,编排文件为 /opt/cnbn-web/compose.json。应用使用 bind mount,无应用匿名数据卷。

宿主机路径(相对部署根)内容与容器位置
admin109/programs/app、admin113/programs/app完整后台程序及依赖,只读映射到 /opt/app
admin109/config/service.env、admin113/config/service.env独立账户、API 地址和密钥,文件权限 600
admin109/data、admin113/data后台持久状态,映射到 /state
admin109/logs、admin113/logs应用滚动日志,映射到 /logs
forum/programs/app整个论坛网站目录,包括 PHP、模板、插件、附件、缓存、论坛日志及 data/sessions
forum/programs/forum-entrypoint.sh容器启动脚本
forum/config/service.env数据库及双版本 GameAgent 连接配置,权限 600
forum/config/sql-base.php创始人和兼容配置;数据库连接最终由环境变量覆盖
forum/config/apache、forum/config/phpApache 与 PHP 配置,映射到各自配置目录
forum/logsApache、PHP 和安装日志
forum/tools非公开安装工具与原安装文件备份
docs/programs/site在线文档静态文件,只读映射到 /opt/docs,不随论坛文件替换
releases、build-logs源码归档、发布脚本与构建日志

现有 MySQL 属于 1Panel;其数据、配置、日志分别映射在 /opt/1panel/apps/mysql/mysql/{data,conf,log},本次没有迁移或重建该数据库容器。新论坛库与其他库共用这个现有 MySQL 实例。

数据库与分离部署配置 ​

宿主机连接是 127.0.0.1:1890,论坛容器通过现有 1panel-network 连接 1Panel-mysql-jkwP:3306。容器中的 127.0.0.1 指向容器自己,不能照抄宿主机地址。数据库名、用户均为 test_bbs,密码只存于受保护的运行环境文件。

换到独立数据库主机时,修改论坛环境中的 D2_FORUM_DB_HOST、D2_FORUM_DB_PORT、D2_FORUM_DB_NAME、D2_FORUM_DB_USER、D2_FORUM_DB_PASSWORD,并按实际网络调整 Compose 的外部 database 网络。保留 GBK 字符集及原有表前缀;导入备份要与对应文件备份配套。

后台分别在自己的 service.env 中配置 D2_API_BASE、D2_API_WRITE_TOKEN、D2_API_SIGNING_KEY、D2_API_SIGNING_KEY_ID;论坛使用 D2109_API_* 和 D2113_API_*。当前地址明确预留为 http://unconfigured-109b.invalid、http://unconfigured-113c.invalid,因此角色、交易、VIP 等游戏功能暂不可用。网页登录正常不代表这些业务已联调。

后台连接论坛使用 D2_FORUM_INTERNAL_BASE 和 D2_FORUM_INTERNAL_TOKEN;同机默认为 http://forum。论坛接收端分别使用 D2109_FORUM_INTERNAL_TOKEN、D2113_FORUM_INTERNAL_TOKEN。分机部署时改成后台可访问的论坛地址,并保持相应版本内部 token 一致。GameAgent 必须部署在对应版本权威存档主机,不能让后台挂载并直接编辑远程存档。

修改环境文件后必须重建对应容器,单纯 restart 不会载入新的环境变量:

sh
# 应用新环境配置,只重建本次三个 Web 服务。
docker compose -f /opt/cnbn-web/compose.json up -d --force-recreate admin109 admin113 forum
# 检查容器及健康状态。
docker compose -f /opt/cnbn-web/compose.json ps

当前三个公网入口均使用 HTTPS,两个后台已设置 D2_ADMIN_COOKIE_SECURE=1 并重建容器,实测会话和 CSRF Cookie 均带 Secure。初始简短密码仍按用户要求保留,使用 D2_ADMIN_ALLOW_INSECURE_DEV=1;以后修改为正常长度密码后关闭此例外。不要公开 service.env、sql-base.php 或数据库备份。

三个 HTTPS 域名的交互验收 ​

2026-09-06 已通过实际域名验证:109 后台 https://gm109.diablo2.com.cn/、113 后台 https://gm113.diablo2.com.cn/、论坛 https://ah.diablo2.com.cn/。

配置109 后台113 后台
D2_FORUM_INTERNAL_BASEhttp://forumhttp://forum
D2_FORUM_ENTRY_PATH/d2109/d2109.php/d2113/d2113.php
D2_ADMIN_COOKIE_SECURE11
内部 token 配对D2109_FORUM_INTERNAL_TOKEN,已核对一致D2113_FORUM_INTERNAL_TOKEN,已核对一致
GameAgent 地址http://unconfigured-109b.invalid,待部署http://unconfigured-113c.invalid,待部署

后台容器通过 Docker 网络中的 http://forum 调用论坛,这是服务间连接地址;浏览器使用公网 HTTPS 域名。论坛数据库仍通过 1Panel-mysql-jkwP:3306 连接现有 test_bbs。宿主机 service.env 与实际运行容器的环境变量已核对一致。论坛域名环境 D2_FORUM_PUBLIC_HOST=ah.diablo2.com.cn 已通过重建容器生效。

这次联调发现 PHPWind 核心安装后未初始化 D2 业务表,币种/交易设置接口因此返回 500。已备份数据库,再使用仓库 d2trade_install.sql 新增 25 张业务表并记录 schema_version=20260816。没有删除旧业务表或清空订单。原始备份为 /opt/cnbn-web/backups/web-interaction-20260906-222928/test_bbs.sql。首次部署脚本现已补上业务初始化;forum-init-business.php 只允许在完全没有 D2 业务表的数据库上执行,不能当作旧站升级脚本。

两版本代码均使用 pw_d2113_* 业务表命名,并通过 game_profile 和版本设置键区分版本,不能把 109 的表前缀自行改为 pw_d2109_*。论坛保留一个数据库;部分论坛全局配置仍共用,不等于两个完全独立的论坛实例。

验收覆盖 HTTPS 登录、会话与 Secure Cookie,币种、交易设置、维护、保留策略、封存、商城购买记录及订单读取;以当前维护设置原值进行 POST 保存,再读取核对未改变任何有效设置,同时验证 CSRF。跨版本后台请求返回 400,论坛无 token 或使用另一版本 token 返回 401。

服务套餐目录依赖 GameAgent 的能力目录,目前返回明确的 503。角色、物品、账号绑定校验、VIP 发放和游戏交易执行等仍须等待两个 GameAgent 部署。占位地址与预留签名密钥一致不代表游戏 API 已可用。后续部署 API 时替换地址,并再次核对两端 token、签名 key 和 key ID。

复核脚本:deploy/linux/web-audit-interaction.sh(只读接口与登录)、web-verify-write-auth.sh(原值保存、回读与鉴权)。后者会持久化当前维护设置的默认值,请在维护配置稳定时运行。

用备份替换论坛 ​

  1. 停止 forum 容器,备份整个 /opt/cnbn-web/forum,并通过 1Panel 导出当前 test_bbs。不要在论坛写入期间制作文件与数据库不一致的备份。
  2. 将当前 forum/programs/app 改名留作回滚,把备份的网站根目录还原到同一路径;确认该目录直接包含 index.php、global.php 和 data,不要多套一层 upload。
  3. 将配套数据库恢复到专门指定的数据库,修改 forum/config/service.env 指向该库。文件备份不能替代数据库恢复,不要直接覆盖 MySQL 原始数据目录。
  4. 如备份含原始 data/sql_config.php,启动脚本会把其配置保存为 forum/config/sql-base.php,旧配置保存在 sql-base.previous.php;数据库连接仍由环境变量覆盖。如备份含本部署的包装文件,则需同时恢复对应 forum/config/sql-base.php。
  5. 保留当前启动脚本与 Apache/PHP 配置。启动时会修复附件、缓存、日志权限并禁用安装器。不要重新运行 forum-install-host.py,它仅用于最初空库安装。
  6. 重建论坛并验证首页、管理登录、附件和配套版本插件。旧备份可能缺少本项目环境变量接入逻辑,需把 d2109、d2113 插件和相关集成修改合并后再验证游戏业务。
sh
# 替换文件和数据库前停止论坛写入。
docker compose -f /opt/cnbn-web/compose.json stop forum
# 完成上面的备份恢复及环境配置后,重建论坛容器。
docker compose -f /opt/cnbn-web/compose.json up -d --force-recreate forum

回滚时同样先停论坛,再恢复成套文件、配置与数据库。后台两个服务无需停机,独立文档目录不受论坛网站根目录替换影响。

部署脚本与发布包 ​

scripts/linux_web_remote.py 必须显式提供 --host,密码从 D2113_LINUX_WEB_PASSWORD 环境读取。脚本支持上传和执行部署脚本;不是旧正式机部署脚本的别名。deploy/linux/web-*.sh、web-provision.py 记录本次目标的准备、构建、挂载、安装和验收步骤;默认目录和镜像标签为本次发布值,换服务器须先检查配置。

首次构建前给上传脚本传入 D2_WEB_ARCHIVE(服务器归档绝对路径)和 D2_WEB_SHA256(本地校验值);web-extract-build.sh 校验后才解压,并拒绝覆盖已有发布目录。后续补丁需作为显式更新处理,不能重新执行首次安装。

前端由各自 admin-ui 的 npm run build 生成;scripts/package_linux_web.py --output <新归档路径> 打包预构建前端、PHPWind、Dockerfile、部署脚本和本文。该历史步骤已废止;目前所有镜像必须在独立构建机生成,生产只加载。归档不含数据库密码、SSH 密码、运行时密钥或旧论坛数据。镜像内的初始程序导出到宿主机后,容器运行使用宿主机程序目录;更新镜像不会自动覆盖这些目录。

原生论坛初始化通过 forum-install-host.py 执行:首次必须验证空库;分阶段写入进度标记,拒绝在已安装站点重新建表。Compose 的带引号 env 文件必须先解析,不能直接传给原始 docker run --env-file,否则数据库字段会带入字面引号。

运行状态保存在 /opt/cnbn-web/deployment-status.json。本次发布不覆盖历史在线文档主机,新的在线文档入口见上表;完整游戏栈的迁移说明见《Ubuntu / Docker 多版本多国度网关》。

2026-09-07 后台与房间上限复核 ​

浏览器登录 109 后台后,运行总览显示 Agent 正常并加载角色列表;服务运维显示 Free1、VIP1、VIP2 三个服务均运行中。HTTPS 域名入口的 realm-api 健康、角色列表、索引和聊天接口均返回 200。截图中的代理错误在本轮复核时已未再出现。

三个国度通过原生管理命令 maxgame 30 在线调整,保存到 Wine 注册表和 Compose。每 GS 的宿主机 data/109b/gs/<实例>/max-games 文件优先于旧容器环境变量,保证容器重启后仍为 30。修改该文件需配合管理命令在线生效,或维护窗口重启 GS。当前内存限制保持不变,未执行房间满载压测。

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