fix: 修正服务器反复传送刷屏日志、识别外站账号绑定流程、重连指数退避
部署到 Debian 服务器时暴露的三个真实缺陷: 1. 「被服务器传送」日志洪水 账号未完成服务器验证时服务端每 tick 强推一次位置,实测 3 分钟刷出 748 行日志, 几十分钟就会冲光 2000 条的日志环形缓冲并把 WebSocket 打满。 现改为首次立即记录、其余按 30 秒窗口聚合成一条,断开连接时刷出未汇总计数。 2. 外站账号绑定流程无法识别 原先只认 /login 与 /register,遇到简幻通这类要求 /auth <UID> <验证码> 或扫码绑定的 服务器时,表现只是「连上→被传送→120 秒后被踢→重连」的静默死循环。 现新增 NEED_AUTH_PATTERN 识别并输出可操作的中文告警(每连接一次), 新增 server.authCommand 模板供有固定验证码的服务器自动过验证。 3. 重连无退避 连续被踢时每 10 秒硬撞服务器。现按指数退避拉长(server.reconnectMaxDelayMs, 默认上限 120 秒),成功进入世界后清零;抽出 computeReconnectDelay 便于测试。 顺带补充 README 的「部署到服务器」章节(Node ≥ 22 要求、私有运行时、pm2、日志分文件、排障表)。 测试从 242 增至 252,全部通过。
这个提交包含在:
@@ -166,6 +166,9 @@ squaremap 前端用 `L.CRS.Simple` + `tileSize: 512`,瓦片路径为
|
||||
- **登录确认兜底**:部分离线服登录成功后不回明确提示,`server.loginConfirmTimeoutMs`
|
||||
(默认 10 秒)内既没收到成功也没收到失败提示时按「已登录」放行,避免机器人永远卡死;
|
||||
收到「密码错误 / 登录失败」则标记 `loginFailed` 且不放行。设为 `0` 可禁用兜底
|
||||
- **外站账号绑定(如简幻通)**:服务器要求 `/auth <UID> <验证码>` 或扫码绑定时,
|
||||
密码无法自动完成,程序会输出明确的中文告警(每个连接只提示一次)而不是静默死循环。
|
||||
若该服务器提供固定验证码,可在配置的「账号绑定 / 二次验证模板」(`server.authCommand`)里填写
|
||||
|
||||
**控制台侧**(`src/web/server.js`)
|
||||
|
||||
@@ -176,6 +179,61 @@ squaremap 前端用 `L.CRS.Simple` + `tileSize: 512`,瓦片路径为
|
||||
|
||||
---
|
||||
|
||||
## 部署到服务器
|
||||
|
||||
本项目已在 Debian 12 上以 pm2 常驻运行验证过,关键点:
|
||||
|
||||
### 1. Node.js 版本要求 ≥ 22
|
||||
|
||||
`mineflayer 4.39` 的 `engines` 声明为 `>=22`,用 Node 18 会在运行时出问题。
|
||||
若服务器上已有别的服务依赖旧版 Node,**不要升级系统 Node**,装一份项目私有运行时即可:
|
||||
|
||||
```bash
|
||||
mkdir -p /opt/autostore-bot/runtime && cd /opt/autostore-bot/runtime
|
||||
curl -fsSL -o node.tar.xz https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.xz
|
||||
tar -xJf node.tar.xz && rm node.tar.xz
|
||||
ln -sfn /opt/autostore-bot/runtime/node-v24.16.0-linux-x64 /opt/autostore-bot/runtime/current
|
||||
```
|
||||
|
||||
### 2. 环境变量
|
||||
|
||||
对外提供控制台时,`WEB_HOST` 必须是 `0.0.0.0`,并且**必须**设置 `WEB_PASSWORD`
|
||||
(否则任何人访问该端口都能操作你的游戏账号):
|
||||
|
||||
```bash
|
||||
WEB_HOST=0.0.0.0
|
||||
WEB_PORT=78
|
||||
WEB_PASSWORD=<强密码>
|
||||
```
|
||||
|
||||
### 3. pm2 常驻
|
||||
|
||||
```bash
|
||||
export PATH=/opt/autostore-bot/runtime/current/bin:$PATH
|
||||
npm install --omit=dev
|
||||
pm2 start ecosystem.config.js # interpreter 指向项目私有 Node
|
||||
pm2 save
|
||||
pm2 startup systemd -u root --hp /root # 开机自启
|
||||
```
|
||||
|
||||
`ecosystem.config.js` 里把 `interpreter` 显式指向私有运行时,避免 pm2 用系统 Node 启动。
|
||||
|
||||
### 4. 日志分两个文件
|
||||
|
||||
`data/pm2-out.log` 是 stdout(info 级),`data/pm2-error.log` 是 stderr
|
||||
(**warn 与 error 级都在这里**)。排查问题时两个都要看;
|
||||
控制台页面上的运行日志是内存环形缓冲,包含全部级别,不受这个拆分影响。
|
||||
|
||||
### 5. 排障经验
|
||||
|
||||
| 现象 | 原因 | 处理 |
|
||||
| --- | --- | --- |
|
||||
| 日志被「被服务器传送」刷屏 | 账号未完成服务器验证,服务端每 tick 强推位置 | 已按 30 秒窗口聚合;看是否有「账号绑定」告警 |
|
||||
| 连上 120 秒后被踢,反复循环 | 服务器要求外站账号绑定(如简幻通 `/auth`) | 人工完成一次绑定;绑定后同账号即可自动登录 |
|
||||
| `mineflayer` 加载报错 / 语法不支持 | 系统 Node < 22 | 用项目私有运行时启动 |
|
||||
|
||||
---
|
||||
|
||||
## Grim 反作弊适配
|
||||
|
||||
这是本次重构最核心的工程问题。mineflayer 是第三方协议实现,**它的物理引擎(prismarine-physics)
|
||||
|
||||
在新工单中引用
屏蔽一个用户