Skip to content

BlockNexus v0.6.0

Choose a tag to compare

@live-ling live-ling released this 15 Oct 13:21
· 79 commits to main since this release

Minecraft 服务器管理面板:本地 Web 面板 + SSH 部署远程 Agent,token 加密通道,浏览器即开即用,面板无需公网地址。

⚠️ 升级须知:本版起面板支持应用内自更新。从 0.5.0 升上来仍按老办法:下载 BlockNexus-0.6.0-portable.zip 覆盖程序文件(保留 data/ 目录),或源码方式 git pull && npm install && npm run build:web。从下一版开始,设置页「版本与更新」点「立即更新」即可就地升级。Agent 版本与协议未变,无需重装。

新功能:面板应用内自更新

设置页「版本与更新」不再只是"检查更新 + 跳 GitHub",可以直接把面板升掉:点「立即更新」→ 看升级预览 → 面板替换程序文件并自动重启。

判定与执行分离:所有"能不能升、怎么升、要迁移什么、失败要不要回滚"的判定都收在 panel/update.js(纯函数,97 个单测钉住),执行交给 detached 进程 scripts/panel-updater.js——面板必须先真正退出,它才能替换 node 正在使用的程序文件。顺序是:等端口释放 → 备份将被替换的文件 → 替换 → 拉起 → 健康检查(GET /api/version 期望新版本)→ 失败则回滚程序与数据快照。

跨版本升级:Release 可声明"可直跳的最低来源版本"与"逐跳桥接路径"。源版本差距过大时,面板不会硬升,而是提示"先升到 vX"并把这一跳限制在桥接版本上;没有桥接路径时给手动路径(下载便携包 + 保留 data/)。迁移链覆盖不到的旧数据同样会被这条规则挡住。

数据自迁移:data/config.json 现在带 schemaVersion,新版启动时执行迁移——迁移代码属于新版,所以便携包替换、应用包更新、手动覆盖、git 检出四条路径都自动生效。迁移前备份原文件,失败即拒绝启动,不会带着半成品数据跑起来。

更新推荐分级:security(红色横幅,安全更新)/ critical / recommended / optional,带一句话摘要与更新说明链接,可「跳过此版本」;本地版本高于线上时不提示。

自动更新:设置页三选一 off / notify / auto(默认 notify 只提示)。auto 也必须发布方显式声明该版本可安全自动安装才会真的自动装,且要求:非破坏性、不需要重装 Agent、迁移可逆、面板空闲(没有实例启停/备份在跑)、未连续失败 3 次、24 小时冷却。本项目 v1.0 之前 semver 不严格,所以不按"minor 就安全"猜——一切以发布方声明为准。

完整性与安全边界:

  • 校验值只认 GitHub 的 SHA256SUMS.txt(下载可走自建镜像,但镜像不在信任链上),拿不到校验值就拒绝更新;
  • 解压与写入按白名单(panel/、web/dist/、agent/agent.js、scripts/、images/、package.json 等),data/、root.txt、.git/、web/src/、agent/src/、docs/ 一律拒绝;
  • 面板对外且未开启登录保护时禁止触发更新;有实例启停 / 备份 / 安装在跑时拒绝;
  • 源码工作区有未提交改动时禁用应用内更新(避免覆盖你的工作区);
  • 过程与结果都落在 data/update/(日志、last-result.json、最近 3 份备份),可追溯、可一键回滚;声明为不可逆的迁移在升级后拒绝程序回滚(备份仍保留)。

Linux 面板:同样的网页入口。git 干净检出走 git fetch --tags + 切 Release 标签 + 重建前端;解压目录走应用包替换;systemd 托管时优先让它自己重启,等不到再由更新器补拉起。

新功能:实例总览页(默认落地页)

所有服务器的所有实例按服务器分组展示,一眼看到"哪些实例在跑、各有多少人",点卡片直接进详情。保持只读——在大视野列表里放启停按钮容易误操作,控制仍在实例详情页与服务器设置页。分组统计、Agent 不可达与"实例名在不同服务器重名"等坑都有单测覆盖。

新功能:玩家在线时长统计与聊天记录

  • 在线时长:Agent 侧解析控制台日志的加入/离开,累计每个玩家的在线时长、会话数与最近在线时间;面板离线期间由服务器上的 Agent 继续记录;
  • 聊天记录:玩家聊天 / 表情 / 私聊以明文追加写入实例目录 .blocknexus-data/chat.ndjson(目录 0700、文件 0600,随备份保留),支持按玩家与关键词过滤、清空;
  • 入口都在实例详情页(聊天页签、玩家统计对话框)。聊天正文只作为 React 文本节点渲染、绝不拼 HTML,防玩家名/发言注入。

界面:实例详情页重构

指挥条(主操作位不随状态漂移)+ 5 张等高指标卡 + 三栏(实例与工具 | 终端 | 玩家)。整页不再滚动——终端填满剩余高度,需要滚动的只有日志、玩家名单这些内部区域;终端支持关键字过滤;停止态的空数据一律显式写「—」或原因,不留白。

界面:服务器设置页

Agent 卡与系统信息卡重排:连接方式那行只说方向、地址单独一行(同一串地址不再在一张卡里说两遍);Agent 安装目录与实例目录并进连接卡(它们讲的是"Agent 落在哪",与连接信息本就是一回事);系统信息卡不再重复实例目录;Java 版本列表默认收起(装过五六个版本时原来能占掉半屏)。

修复

  • 版本比较:semverGreater 把缺段当空串比较,于是 0.6.0 > 0.6 判为真——遇到两段版本号的 Release 标签会误报"有新版本";同时预发布段现在正确地低于正式段;
  • 通知去重:离线 / 恢复提醒不再重复发送(含 24 小时补发规则与"同一故障只发一封"),SMTP 失败会退回"未通知"并保留重试机会;
  • 启动单飞:同一实例的并发启动只执行一次;
  • 文件管理:归档解压/压缩超时放宽到 180 秒,Linux 上 zip 优先 unzip、缺失退 bsdtar。

安装与升级

  • 便携版(推荐,无需 Node.js):下载 BlockNexus-0.6.0-portable.zip,解压到任意目录双击 BlockNexus.exe;数据保存在解压目录的 data/ 下,删除目录即完全卸载;
  • 源码运行:git pull && npm install && npm run build:web && npm start(前端为构建产物,更新后需要重新构建);
  • 从 0.5.0 升级:保留 data/ 即可,配置按 schema 自动迁移,无需手工处理。