Skip to content

Releases: Lanscarlos/HyperCraft

v0.5.2

Choose a tag to compare

@github-actions github-actions released this 29 Sep 00:16
22d51a0

修复

  • 文件编辑器里粘贴重复内容后,改动标记不再错位。 复制 JSON 列表里的一项贴在它下面,新增行的
    标记会从粘贴块的第四五行开始、一直伸进下一项里(#6):这几行和相邻内容一模一样,差异算法总是挑
    最靠下的那种画法。现在同样成立的几种画法里,挑首尾两行缩进最浅的那种——也就是贴合 { … },
    这类结构边界的那种;已改行数不变,只是标记落在你刚贴的那几行上。

安装

下载对应平台的压缩包,解压后直接运行:

tar -xzf hypercraft-0.5.2-linux-amd64.tar.gz
cd hypercraft-0.5.2-linux-amd64
./hypercraft -data ./data

前端已经嵌在二进制里,不需要另外部署。开机自启参考包内的
hypercraft.service。

校验

sha256sum -c SHA256SUMS.txt --ignore-missing

快照 snapshot-507

快照 snapshot-507 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 29 Sep 00:16
22d51a0

这是 main 分支的自动构建,不是正式发布版本。

它通过了 CI,但没有经过发布前的人工验证,可能包含未完成的功能。
生产环境请使用最新正式版。

本次构建

  • 提交:22d51a0
  • 说明:合并: 发布 0.5.2

版本号

快照没有语义化版本号,snapshot- 后面是 main 的提交数,数字越大越新。
快照始终排在所有正式版之前——它就是 main 的最新构建,而正式版是从 main 上切出去的。

安装

面板里「设置 → 面板更新 → 更新通道」选择「快照」后即可直接更新到这一版;
之后切回「正式版」,面板会提示装回最新正式版。

手动安装则下载对应平台的压缩包,解压后运行 ./hypercraft -data ./data。

校验

sha256sum -c SHA256SUMS.txt --ignore-missing

快照 snapshot-505

快照 snapshot-505 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Sep 23:48
8f9eeed

这是 main 分支的自动构建,不是正式发布版本。

它通过了 CI,但没有经过发布前的人工验证,可能包含未完成的功能。
生产环境请使用最新正式版。

本次构建

  • 提交:8f9eeed
  • 说明:合并: 文件编辑器粘贴后改动标记错位 (#6)

版本号

快照没有语义化版本号,snapshot- 后面是 main 的提交数,数字越大越新。
快照始终排在所有正式版之前——它就是 main 的最新构建,而正式版是从 main 上切出去的。

安装

面板里「设置 → 面板更新 → 更新通道」选择「快照」后即可直接更新到这一版;
之后切回「正式版」,面板会提示装回最新正式版。

手动安装则下载对应平台的压缩包,解压后运行 ./hypercraft -data ./data。

校验

sha256sum -c SHA256SUMS.txt --ignore-missing

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 23 Sep 00:48
a6285f1

新增

  • 「新建实例」和「导入现有目录」并成一个「添加实例」。 概览、侧栏、所有实例三处的入口原先都按
    「新建实例」排位,要导入必须先进「所有实例」页——装面板的机器往往已经跑了很久,那个排位是反的。
    现在点「添加实例」弹一个岔路口,两条路平级,导入排在前面。代理连线页的「新建代理端」和命令面板
    里的两条直达没跟着改:它们说的不是「添加一个实例」,而是一件具体的事。

  • 添加本机 Java 可以浏览目录选文件。 不用再手抄 java 可执行文件的绝对路径;目录选择器多了
    「选文件」模式,进 JDK 的 bin 目录点 java 就行(Windows 上是 java.exe)。

  • 目录选择器的快捷位置可以自己加、自己改名。 服务端集中放在哪一两个目录下只有机主知道,原先
    四个内置位置覆盖不到的话,每次添加实例都要沿同一棵树点三四层。现在在选择器里「收藏这个目录」,
    chip 行末尾的「改名」能改展示名,最多 12 个,记在 panel.json 里。收藏一个目录不多给任何权限
    ——目录字段本来就接受任意绝对路径——所以它归「浏览主机目录」权限管。

  • 新增「苔石」配色,并接任出厂默认。 冷灰的页面底、纯白的卡片、比原来硬一档的描边——取自面板的
    界面设计稿。原来四套配色的页面底都压在 98% 亮度上下,和纯白卡片差不到两个百分点,卡片因此立不
    起来,空页面尤其糊成一片。樱花、松绿、杏黄、碧蓝四套取值一个没动,在「面板设置 → 外观」里照常
    可选,从前用樱花的人手动选回去就是。

  • 服务端核心页重做成「列表是页面,添加是动作」。 核心库现在占满整页,右上角的「添加核心」唤起
    一个 1040px 的弹层;类型、版本、构建三段同屏,版本在左、该版本的构建列表在右,构建行能看到变更
    摘要、发布时间和体积。原先常驻在页面下半部分的「下载核心」向导和顶部那两段说明文字都不在了。

  • 选中构建后立刻检查本机 Java 够不够。 不够的时候在确认条上方出一条警告,写清这个核心要哪个
    版本、本机最高是哪个,按钮直接跳到「Java 运行时」并且预选好要装的那一版。检查不通过不挡下载,
    只是按钮改成「仍然下载」。

  • 「添加核心 → 上传自定义 jar」。 Forge、Fabric、整合包自带的服务端从这里进库,同时补上版本、
    需要的 Java 版本和支持的 MC 版本——这三项没有上游可问,留空就在列表里标「信息不全」,面板不猜。

  • 核心列表多了「运行要求」和「支持 MC」两列。 Java 版本不匹配是启动失败最常见的原因,以前要等
    启动报错才知道。下载时记进核心库,断网也看得到。

  • 行操作收进 ⋯ 菜单,删除做了依赖检查。 不悬停的行上看不到任何操作图标;正在被实例使用的核心
    删不掉,弹窗会列出是谁在用。列表下方多了一张「清理未使用」卡片,只动没有实例在用的那几项。

  • 侧栏底部多了一张「资源库占用」卡片。 核心、Java、插件、建筑各占多少,合计多少。

  • ⌘/Ctrl + P 转到文件。 输入路径的片段就能跳过去,vulp con 命中
    plugins/Vulpecula/config.yml。匹配在守护进程里做——一个实例可以有几万条路径,而浮层只显示五十条——
    最近打开过的排在前面。默认跳过 region / entities / poi / libraries / cache / versions
    这些机器生成的批量目录。

  • 侧边栏多了「搜索」和「最近」两个面板。 搜索同时搜文件名和文本内容,结果按文件分组,点命中行直接
    跳到那一行;最近记着这台浏览器在这个实例里最后打开过的 20 个文件。⌘/Ctrl + Shift + F 直接打开搜索。

  • 文件页支持上下分屏。 对比两份 YAML 时上下排列让行号和缩进天然对齐,比左右好读,而且不吃宽度。
    分屏按钮现在是「左右 / 上下」两项菜单,标签可以拖到另一组。⌘/Ctrl + \ 左右分屏当前文件,
    ⌘/Ctrl + 1 / 2 聚焦某一组。

变更

  • 像素字体改成默认关闭。 它是个标题字在干正文字的活:整句散文用等宽点阵排,每个字都按同一个
    格子前进,词形没了也就没法扫读;面板里绝大多数正文还是汉字,本来就落在缝合字体上。开关仍在
    「面板设置 → 外观」,想要的随时开回来,控制台和 shell 一如既往不跟着变。

  • 服务端核心页在没有核心时也保留表格框和表头,不再整块换成一个占满宽度的空盒子。表头就是这一页
    的承诺——这些是判断一个核心的列——所以留着,提示和按钮放进行本该在的位置。「添加核心」的实心
    按钮也跟着移到了空状态里。

  • 服务端核心页的标题不再和顶栏面包屑重复说一遍,页头收成一行:左边这一页的事实,右边这一页的
    动作。

  • 「添加核心」对话框收了收口。 版本筛选框和构建表头移进各自的卡片内部,两栏顶边不再错开;
    「选择核心 / 版本 / 构建」三步加上了可见的序号标签。

  • 「添加核心」对话框用满可用高度。 它此前按内容收缩,1080 屏上只长到 731px,而两栏列表被钉死在
    320px——构建列表一次只露出全部内容的 7%。现在两栏吃掉剩余高度,窗口越高露出的行越多;上传那一屏
    没有列表要填,仍然按内容收缩。宽度从 1040 放到 1180,变更摘要不再动不动就截断。

  • 版本列表去掉「旧」标记,只留「最新」。 上游停止支持的版本几乎是列表里的全部,一个几乎每行都
    有的标记等于什么都没说,而它是一列安静数字里最吵的东西。列表本来就是新的在上,哪头旧看得见。
    「预览」保留——快照不是「更旧」,是另一种构建,而且要打开开关才会出现。

  • 版本列表里的分组标题不再像可点的行。 「26.1.x」「1.21.x」这类版本族的小标题,原先和它下面
    那些可点的版本行只差 1px 字号和一档灰,左边缘还完全对齐,容易让人反复去点。现在换成和
    「1 · 选择核心」同一族的标签样式,并带一条贯穿到行尾的细线——那是任何一个版本行都不会有的。

  • 修掉构建号列的溢出。 一个构建同时带「最新」和频道标签(如 ALPHA)时,内容会压到「变更摘要」
    上,两段文字叠在一起。

  • 核心列表的列宽重新分配。 富余宽度原本给了「使用中」,可它装的是一句短话或两个标签;现在给了
    「名称」——底下那行文件名才是整行里唯一会被截断的东西。「体积」右对齐、紧挨着左对齐的「使用中」,
    中间只有列间距,读起来像一串「160 B 未使用」,现在隔开了。

  • 进核心库只留一个入口。 原先「添加核心」在页头和空态各一个、「上传 jar」在页头、空态和弹窗磁贴
    上各一个,五个按钮两个去处。现在页头只有「添加核心」,空态在场时它让位给空态那个,核心从哪来
    (Paper / Velocity / 上传自定义 jar)是弹窗里磁贴行的事。

  • 资源库五个页面的命名统一了。 去掉「库」和「环境」两个后缀:Java 环境 → Java 运行时,
    数据库环境 → 数据库,插件库 → 插件,建筑库 → 建筑与地图。顺序也改了,服务端核心排第一——它是
    真正天天打开的那一个。每一行后面带上条目数。

  • 一级导航改成常驻的 56px 图标栏。 任何宽度下它都在——手机上换 section 不用再先拉开抽屉——底部的
    按钮把它展开成 220px 的文字版,选择记在本机。产品图标和账户按钮成了导航栏自己的家具,在每个页面都在
    同一个位置;账户按钮因此从顶栏右上角搬了下来。

  • 每个页面脚下多了一条状态条,显示当前位置、光标行列和未保存计数。

  • 版本号改成悬浮查看:侧栏顶部只剩 48px 的一行,放不下产品名加一行版本号;鼠标移到产品名上,
    它会让位给当前版本号,移开再换回来。完整版本号在 主机 · 面板版本 里照旧。

  • 文件页重做成「侧边栏 + 主区」。 没打开文件时主区是当前目录的详情列表,打开任意文件后自动变成
    编辑器,关掉最后一个标签又变回去,中间没有任何开关。侧边栏 300px、可拖、⌘/Ctrl + B 收成一条竖条,
    底部显示这个实例占了多少磁盘。目录树里现在同时有文件夹和文件,当前打开的那个会标出来。

  • 文件列表的「修改时间」不再被截断,紧凑 / 详情两种密度合并成一种——列表搬进主区之后宽度不再稀缺,
    没有密度可选了。窄屏按「逐级丢列」处理,先丢修改时间,手机上再丢大小。

  • 资源库列表的列宽改成按比例分配。 原先只有「名称」一列是弹性的,宽屏上它把多出来的空间全吃掉了:
    1920 的屏幕上,名称和「版本 · 构建」之间空着 284px,剩下七列挤在最右边。现在这些空间分给真正装内容
    的列,同样是 1920,那段空白剩 145px;1200 宽度下名称列反而从 198px 涨到 278px。

  • 核心行的 jar 文件名和页头的核心库路径不再画成方框。 前者是名称下面的副标题,被画成框之后每一行
    都读作两个叠起来的标签;后者本来就在一颗药丸里,里面再套一个框是两层边框说同一件事。两处都只留等宽
    字体。

  • 「清理未使用」卡片只在真的有东西可清时出现。 以前它常驻在列表下面写着「0 个核心没有被任何实例
    使用,合计 0 B」,旁边一个点不动的按钮。没东西可清的时候,剩下的那条说明按正文宽度排,不再被拉到
    1440px。

  • 资源库工具行右端补上了「筛出几条 / 共几条」。 排序下拉原先独自吊在一千七百像素宽的行尾,跟任何
    东西都不对齐。

修复

  • 手机上的文件列表不会再把文件名挤成零宽。

  • 手机上核心列表的名称不会再被状态徽章挤掉:390 宽度下「Velocity 4.1.0-SNAPSHOT」曾经只剩「Vel…」,
    现在徽章换到名称下一行。

  • 目录选择器的「收藏这个目录 / 改名」不会再独自吊在第二行的最右端。快捷位置一多,chip 就占满整行,
    这两个链接被挤下去之后左边留出一整行空白;现在它们跟着 chip 换行,左对齐落在下一行,位置够时
    仍然停在行尾。

安装

下载对应平台的压缩包,解压后直接运行:

tar -xzf hypercraft-0.5.1-linux-amd64.tar.gz
cd hypercraft-0.5.1-linux-amd64
./hypercraft -data ./data

前端已经嵌在二进制里,不需要另外部署。开机自启参考包内的
hypercraft.service。

校验

sha256sum -c SHA256SUMS.txt --ignore-missing

快照 snapshot-503

快照 snapshot-503 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Sep 00:48
a6285f1

这是 main 分支的自动构建,不是正式发布版本。

它通过了 CI,但没有经过发布前的人工验证,可能包含未完成的功能。
生产环境请使用最新正式版。

本次构建

  • 提交:a6285f1
  • 说明:合并: 发布 0.5.1

版本号

快照没有语义化版本号,snapshot- 后面是 main 的提交数,数字越大越新。
快照始终排在所有正式版之前——它就是 main 的最新构建,而正式版是从 main 上切出去的。

安装

面板里「设置 → 面板更新 → 更新通道」选择「快照」后即可直接更新到这一版;
之后切回「正式版」,面板会提示装回最新正式版。

手动安装则下载对应平台的压缩包,解压后运行 ./hypercraft -data ./data。

校验

sha256sum -c SHA256SUMS.txt --ignore-missing

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 14 Sep 06:51
d3b779a

新增

  • 「启动方式」从「实例设置」里分出来,成为实例下的独立页面。 那一页原本一个表单装了六段,其中
    「启动方式」自己占掉三分之二——而它也是唯一一段你会反复打开的:挑一次核心,之后每次调堆内存和 GC
    参数都要再来。现在它在侧栏有自己的入口,地址是 /i/<id>/startup。旧书签 /settings 照常打得开,
    只是里面不再有启动设置;实例起不来时那一页顶部会出现一条横幅,一句话说明原因并指过来。

  • 页面右侧常驻「实际执行的命令」。 左边改任何一项,右边那条命令立刻跟着变,启动时执行的就是它。

    命令由守护进程算出来再发给浏览器,而不是前端自己拼——因为面板会往命令行里加东西:控制台的编码参数
    (-Dfile.encoding=UTF-8 那一组)、以及管道模式下强制彩色的两个 -Dterminal.*。它们来自「实例设置
    → 控制台」的开关,前端拼不出来,硬拼出来的命令就是假的。现在它们压暗显示、在图例里标成「面板注入」,
    该看见的时候看得见。

    拼装逻辑因此在后端只留了一份:启动走它压平的结果,预览走它分段的结果,两边不可能长出对方没有的参数。

  • 新增「启动前检查」,并且能自动改好一部分。 检查跑在你正在编辑的草稿上而不是已保存的配置上,所以
    改一半就能看到结论。能自动修的直接给按钮——比如选了 Aikar's Flags 但最小内存和最大内存不一样时,
    会出现「把 Xms 改成 4096」,按一下左边就变了。

    新增四项:Java 版本是否配得上这个游戏版本、内存上下限是否符合所用预设的要求、实例目录下有几个 jar、
    端口是否和其他实例撞。

    Java 那条两个方向都查:版本太低会在加载类时直接退出,太高则是 1.16.5 之前那一代服务端的老问题——能
    启动,然后在加载世界时死于反射。登记表里已经有合适的 Java 时,直接给一个「改用 Java 21」的按钮;没有
    就说明要装哪个。它只对已发布的版本说话,因为那些版本的 Java 要求是不会再变的事实;遇到面板没见过
    的新版本它保持沉默,而不是猜一个出来。

    端口那条是只读的跨页核对——字段在「服务器配置」,这里只负责说出撞了,不给修改入口。

  • 内存一栏加了「锁定 Xms = Xmx」开关和宿主机内存分配条。 分配条按「其他实例 / 本实例 / 剩余」分段,
    填上限时终于有个参考系。它数的是各实例配置的上限,不是实时占用,所以写的是「已分配」;加起来超过物理
    内存时那一段会变色。用参数文件启动的实例上限在它们自己的文件里,面板不知道,会单独说明有几个没算进来。

变化

  • 服务端参数改成和 JVM 参数一致的卡片编辑,卡片与文本两种视图互斥。 此前 --nogui 胶囊和下面的
    文本框同时显示同一份数据,改哪个都生效,于是没人知道该改哪个。

  • JVM 参数的三个预设现在看得出选了哪个。 选中项是从参数本身认出来的,所以刷新之后、以及参数是从
    别人的启动脚本读进来的时候,它都还是对的。

  • 新增「下载」页和右上角的下载入口。 面板正在下的东西——服务端核心、Java 环境、数据库引擎、插件——
    以前分散在四个页面上各看各的,其中三个还只记得最后一次:核心下载凌晨失败了,下一个一开始,那条记录
    就没了。现在它们是同一个队列,右上角随时能瞟一眼还剩多久,/downloads 上能读到失败原因和历史。

    顺带解决一个看不见的浪费:此前四个页面各自每 800 毫秒拉一遍自己那份完整清单,装一个 Java 就要把整个
    运行时列表重新取八十次,只为读一个字节数。现在是一个只带任务的请求,空闲时完全停掉。

    插件库的「下载队列」页移到了面板级的 /downloads,旧链接会自动跳转。

  • 服务端核心的下载多了一条镜像线路。 核心此前是面板里唯一连加速选项都没有的下载,而一个 Paper jar
    有 50MB,每建一个实例就要下一次。新增的 FastMirror 是加入前逐字节比对过的:Paper 1.21.4 build232
    从它取回的文件与官方同 SHA-256、同 51437498 字节。校验用的始终是 PaperMC 官方元数据里的那个
    SHA-256——镜像自己发布的 SHA-1 不采信——所以走镜像拿到的一定是官方那份,否则下载直接失败。

    一并查过但没有采用的:清华和南大都不提供 papermc 镜像;华为云看似有,实际是它的镜像门户对任意
    路径都回 200,并不存在那棵树。

  • 服务端核心、Java 环境、数据库引擎的下载改为排队。 此前这三处各自只有一个槽位,上一个没下完,
    下一个直接被拒。现在排队等,同时装两个 Java 大版本这种事不再需要守着。插件库本来就是队列,不变。

  • 实例的 Java 环境改为只能从面板登记过的里面选。「资源库 → Java 环境」现在除了下载安装,还能登记
    本机已有的 Java:填 java 可执行文件的路径,面板跑一次 java -version 问出版本再记下来 —— 问不出来的
    不会被登记,因为一条没有版本号的记录,面板没法拿它讲任何道理。PATH 上探到的 Java 会单独列出来问要不要
    登记,确认之后才进列表:探测是面板在猜,而这张表里的每一条都该是人为决定过的。

    升级时面板会把各实例正在使用的 Java 路径自动登记进来,不问 —— 那些路径不是猜的,是这台机器上的
    服务器此刻正在用的东西,比任何探测都确凿。所以现有实例不受影响,照常启动。探不出版本的也照样记下来,
    标成「路径已失效」并原样保留路径,好过编一个版本号。java(跟随 PATH)保留成一条合法记录,不会被钉死
    成某个绝对路径。

    实例设置和创建向导里的「自定义路径」输入框随之移除。全新安装时如果 PATH 上有 Java,创建向导里一键即可
    「登记并选中」,不用先跳去 Java 环境页再走回来。

  • 文件页多了一个编辑模式,专门用来读和改一个文件。 标题右上角点「编辑模式」(或 Esc 退出):左侧导航
    折成图标条,中间那栏文件列表让位,目录树带上文件顶上来,编辑器铺满剩下的整屏。三栏排版是为「管文件」
    设计的 —— 上传、批量勾选、按大小和时间排序 —— 但改一个配置时,它把编辑器压到六百多像素宽,一行中文
    注释就要横向滚动。两件事,两种排法。

    编辑模式下目录树自己带上传、新建文件、新建文件夹、刷新,每一行悬停出现「⋯」,里面是重命名、复制路径、
    下载、删除;改名和删除会跟着落到已经打开的标签页上,不会留下一个指向不存在文件的编辑器。上面还有一个
    筛选框,只筛已经展开过的目录 —— 为一次按键去遍历没展开的目录是请求风暴,不是搜索。

    顶栏的面包屑、状态灯和「启动」按钮不藏:改完配置要能立刻重启。1024 以下不提供这个模式,那里本来就是
    一次只显示一栏;1200 以下目录树默认收起,需要时盖在编辑器上滑出。

  • 编辑器认得配置文件的语法了。 YAML / JSON / TOML / Properties / INI / Markdown / Shell 会按注释、
    键、字符串、数字、布尔上色,明暗两种模式和四套配色各有一组。四十万字符以上的文件自动关掉高亮并在
    状态栏说明原因 —— 打开一个半兆的日志仍然要跟以前一样快(能打开的上限还是 1 MiB,没有变)。

  • JVM 参数可以一个一个地调,不用再对着一整块文本改。 实例设置的「JVM 参数」多了一个「卡片」视图:
    一个参数一张小卡,一行放两张。卡片从上到下是参数名、一句中文说明、以及这个参数该用的控件 ——
    -XX:+UseG1GC 这种开关给一个 switch,-XX:MaxGCPauseMillis=200 这种给数字框并在后面标出单位,
    -XX:G1HeapRegionSize=8M 还多一个 K / M / G 下拉,-Dfile.encoding=UTF-8 给文本框。右上角的 ✕
    删掉这个参数,末尾的虚线卡片加一个。

    开关关掉不等于删掉:参数仍然在命令行上,写成 -XX:-Name,用来明确关掉某个默认或前面的参数打开的
    东西 —— 要整个去掉得点 ✕,卡片上也这么写着。

    加参数时下面会浮出候选,一条一个参数名加一句说明,方向键选、回车确认。候选能用中文搜:打「停顿」
    找得到 MaxGCPauseMillis,打「线程」找得到 ParallelGCThreads。

    类型是从参数本身的写法推出来的,不是查表查出来的,所以面板没听说过的参数照样能加、能编辑、能原样
    保存 —— 这种参数占满一整行,点参数名也能把任何一张卡片变回纯文本改。右上角可以随时切回「文本」
    视图,两边是同一份数据,预设按钮和「从启动脚本读…」也还是照常用。没动过的参数保存时逐字不变。

  • 文件页改成目录树 / 列表 / 编辑器三栏,而且能同时开几个文件。 点一个文件在右边直接打开,列表还在
    旁边,不用退出去再进来;上面一排标签管着所有打开的文件,改过没保存的标签带一个小圆点,关它会先问。
    左边是目录树,展开过的目录会记住,点「刷新」才重新读。

    编辑器底下多了一条状态栏:文件类型、编码、换行符、光标在第几行第几列,以及大小、行数和有没有未保存的
    改动 —— 把人送到这个框里的,通常就是控制台里一行「at line 42」。

    窄屏(1024 以下)一次只显示一栏:开着文件就是编辑器,没开就是列表,编辑器上面有一个「← 文件列表」
    回去。目录树在窄屏下不出现 —— 列表自己的面包屑和「返回上一级」本来就能走目录树,树是增益不是替代。

    三栏下列表那一栏比整页窄得多,所以「修改时间」这一列在三栏布局里也跟着收掉了(窄屏本来就会收),
    具体时间还在每一行的 tooltip 上。

  • 插件页收成三个标签:已安装 / 可更新 / 市场。「可更新」原来是一枚筛选 chip,用得够多,给了它自己
    的位置;「市场」是插件市场直接嵌在这一页,兼容性徽章按当前这台服的核心和版本算,不用先跳出去再回来。

    下载和安装仍然是两件事,页面上把这句话写在了市场标签的最上面:插件库是这台机器上所有服务器共用的
    一份收藏,从市场下载的东西进的是插件库,装到某一台服要回「已安装」里用「从插件库安装」挑版本。这条
    分层没有被合并 —— 运维面板最常见的困惑就是分不清改的是哪一层。

    加载失败的横幅提到了标签栏上面:插件没加载成功是这一页上唯一「现在就是错的」那件事,切到市场不
    应该成为看不见它的办法。横幅上有一个按钮直接跳回已安装并筛出异常的行。

  • 监控页先给结论,再给过程。 曲线上面多了一排读数卡:CPU、内存、进程数,每张卡上是当前值 +
    一句结论(正常 / 偏忙 / 偏高 / 接近上限)+ 一行脚注写明它是拿什么比出来的。判据只有一处,写在
    instanceEvents.ts 里,连同为什么是这个阈值 —— CPU 看的是所选时间范围的平均而不是最新一个点
    (一次尖峰不是结论),内存拿的是真正会生效的那个 -Xmx,没设置就不给结论。

    右边多了一栏「这段时间」,把这页已有的数据归成几条可读的判断:异常退出(带退出码)、CPU 持续跑满
    (附一句「先看视距和模拟距离,加核心对单线程没有帮助」)、内存贴近上限、服务器没在运行、以及什么都
    没发生。1280 以下它落到曲线下面 —— 和控制台右栏用的是同一档断点。

    服务器没在运行时不再显示 0% 和「正常」:停机的实例没有 CPU 读数,不是读数为零,卡上显示「—」。

    这一栏没有做成事件时间线,也没有「点告警跳回对应时刻的控制台」:守护进程没有按实例存事件日志,
    控制台也没有按时间寻址的接口,两样都只能编。插件加载失败仍然在「插件」页 —— 那页本来就是先把失败
    摆在最上面的。

  • 服务器配置页现在说得清你改了什么。 server.properties 那一页重排成三段:左边是分组锚点
    (基础 / 世界与生成 / 玩家与权限 / 网络与端口 / 性能 / 未分类,各带条数)加一个「仅看已修改」开关;
    中间每一项旁边多了真正的键名,改过的行左侧有色条、挂「已修改」徽章、下面把原值划掉写出来;底下是一条
    常驻保存条,写着「N 项更改待保存 · 重启服务器后生效」,右边是放弃更改和保存。

    高风险项现在写后果,不只是一个开关:关掉正版验证会让任何人冒用他人 ID 进入、极限模式对已有存档
    不可逆、改存档名会直接生成新世界 —— 这三项都用红字写在控件下面。

    没有做成逐行「需重启」徽章:服务端是启动时把这个文件读一遍,所以这页每一项都要重启,逐行挂等于
    每行都挂、也就等于没挂。改成反过来说 —— 白名单、难度、默认游戏模式这三项有等效的控制台指令,改了之后
    那一行会告诉你敲哪条可以立即生效。

    bukkit.yml / spigot.yml / paper-global.yml / paper-world-defaults.yml 也是同一套:分组锚点、
    「仅看已修改」、逐项键名和原值、常驻保存条,五个文件一模一样。之前只有 server.properties 改了,
    其余几个还是一摞面板加底下一个按钮 —— 同一页两种做法,看你点的是哪个文件。

    代理转发那两项现在写明后果:settings.bungeecord 和 proxies.velocity.enabled 打开之后,
    这台服会无条件相信连接里带的玩家身份,端口必须只对代理端开放,否则谁都能绕过代理直连冒用 UUID。

    保存的行为没有变:仍然只写你改动过的键,文件里的注释、顺序和面板不认识的键原样保留。往一个还没
    生成的文件里保存会创建它,只写你改的那几项 —— 保存之后卡片上的「未创建」也会跟着消失。

  • 配置文件的选择器从一排小胶囊改成了卡片。 每张卡上是文件名 + 一句话「这个文件管什么」
    (生物上限与自动保存 / 代理转发与实体优化 / Velocity 转发与踢出提示 / 性能调优与反矿透),
    服务端还没生成的文件标「未创建」。五个文件名挤成一排同样的胶囊时,看起来像一个长词,而且没有
    任何一处回答「我要改的东西在哪个文件里」。

  • 顶栏常驻服务器状态和启停。 进了某台实例之后,顶栏一直显示它在不在跑、已经跑了多久、CPU 和内存
    吃了多少,旁边就是启动/停止 —— 在「文件」「插件」「服务器配置」这些页面上不用再退回控制台看一眼或者
    重启一次。停机时只留状态和启动按钮,不显示三个「—」。

    窄屏逐级往回收:1240 以下先收掉「已运行」,1024 以下只留状态点和启停 —— 手机上收到告警要做的就是
    确认死没死、按一下重启,其余的数字在控制台上还有。同一档宽度下面包屑整条收起,因为每个页面自己的
    标题已经写着同一个词了。

    没有显示 TPS 和在线人数:守护进程读的是服务端的 stdout,它既没有玩家名册也没有 tick 计时,这两个
    数只能编,而编出来的数字比没有数字更糟。

    启停从控制台页的标题栏搬到了顶栏,所以控制台页不再重复一份状态徽章和一排按钮。启动失败的报错改在
    内容区顶上常驻显示,要手动关掉 —— 它可能是从「文件」页按出来的,不能只往控制台页的角落里写。

  • 面板多了三套配色可以换。「面板设置 → 外观」新增配色一栏:除了出厂的樱花,还有松绿、杏黄、
    碧蓝。每套都有浅色和深色两份,换配色不动明暗 —— 顶栏那个开关照旧管深浅,跟随系统也照旧。选择
    只存在这台设备的浏览器里,不跟着账号走,也不影响别人看到的面板;和明暗、像素字体一样在首帧之前就
    定下来,刷新不会先闪一下旧配色。浏览器标签页上那个图标也跟着换,标签栏没有明暗之分,所以它
    在深色下用的还是浅色那版渐变。

    两样东西故意不跟着配色走。一是两块终端:服务器控制台和主机 shell 在任何配色下都保持深色、而且
    互相不同色 —— 那是防止把危险命令敲进另一块终端的唯一屏障(碧蓝下主机 shell 会改成深绿,因为这套
    配色自己的深色表面正好落在 shell 原来的石板蓝上,再不挪就真看不出区别了)。二是状态色和图表曲线
    色
    :「运行中」「启动中」要在扫一眼的时候还认得出来,图表的四条曲线是按「彼此在色觉障碍下也分得开」
    校验过的,跟着品牌色走反而会失效。

  • JVM 参数有现成的几套可以直接点了。「启动设置 → JVM 参数」上面多了三个按钮:Aikar's Flags、
    G1GC 保守、ZGC 低延迟,点一下把整套参数填进下面那个框,填完照样能自己改。Aikar 那套会按你填的最大
    内存自动切数值(12 GB 是分界线),它要求最小内存和最大内存一样大,不一样的时候面板会直接说出来。

    做成整套替换而不是一个参数一个开关,是因为这些参数只在成套时才成立 —— 半套 G1 调参拌半套 ZGC 不是
    第三套调参,是个故障。框还是那个框,预设填不出任何你自己打不出来的东西。

  • 服务端参数里的 --nogui 有了一个开关,点一下加上、再点一下去掉。--forceUpgrade、--eraseCache
    这类一次性操作故意没做成开关 —— 记得住的开关意味着下次重启还会再跑一遍。

  • 读启动脚本多了两个来源。 除了实例目录里那个,现在还能读面板本机的任意路径,或者直接从你自己
    电脑上传一个
    。上传的脚本只在浏览器里读一遍、内容发过来解析完就丢,不会存进服务器目录 ——
    免得目录里多出一个面板永远不会执行的脚本,让下一个人以为那才是真正的启动方式。

  • 面板能读你原来的启动脚本了。 手工搭的服目录里一般躺着写好的 run.sh / 启动.sh / start.bat,
    里面 -Xmx、GC 参数、核心文件名一应俱全。导入目录时面板会把这些脚本列出来,选一个就把里面的参数
    读出来填进表单
    ;已经建好的实例在「启动设置 → 从脚本读启动参数」里也能随时读一个。

    读出来的是草稿:每一项都摆出来给你看,改完自己点保存才算数。拆不出来的脚本面板直接说拆不了、并指出
    是哪一行 —— 循环重启包装、条件分支、$(…)、重定向、-cp 加主类这些一律不猜。半条命令行比拆不出来
    糟得多,因为它能启动。

    认得出的脚本名也不只 run.sh 了:start.sh、startup.sh、start_server.sh、启动.sh、
    开服.bat、start.cmd 都在内,而 install.sh、更新.sh、backup.sh 这类一律不进候选。

  • Forge / NeoForge 1.17+ 的启动方式(@参数文件)现在是面板自己的一种启动目标。 那些版本的安装器
    不产可运行的 jar,启动是 java @user_jvm_args.txt @libraries/…/unix_args.txt。以前这只能靠跑它们的
    run.sh,现在面板直接拼这条命令行,于是 Java 选择、服务端类型、开服前检查对它们同样生效。

  • Java 运行环境可以选发行版了,默认改成 Azul Zulu。「Java 环境 → 下载设置」多了一个发行版选择,
    Azul Zulu 和 Eclipse Temurin 都在,新装的 Java 默认走 Zulu。已经装好的 Temurin 一个都不受影响,
    照常能用、能删、能在启动设置里选;想继续装 Temurin,在那一页切回去就行,选择会被面板记住。

    换默认的理由是下载:Temurin 的包在 GitHub 的发布存储上,国内要靠镜像才下得动;Zulu 的包在
    cdn.azul.com,是商业 CDN,直连通常好得多。代价是国内没有能用的 Zulu 镜像(南大、阿里、北外、
    腾讯的 /zulu/ 都是 404),所以 Zulu 只有官方 CDN 一个源 —— 反过来 Temurin 那五个镜像一个没删,
    Azul 的 CDN 要是反而更慢,切回去就是两次点击。

    Zulu 还多三个 Adoptium 没有的大版本(13、14、15),所以可装版本列表现在跟着发行版走。

  • Alpine 之类的 musl 系统头一回能直接装 Java 了。 以前面板只能弹一句「Temurin 是 glibc 构建,
    装上也跑不起来,请自己用包管理器装 OpenJDK 再手填路径」。Zulu 有 musl 构建,面板检测到 musl 会
    自动挑对应的包。选着 Temurin 时那句警告还在,但结尾从「自己想办法」改成了「换成 Zulu 就能装」。

  • Zulu 的下载源支持自己填镜像地址。 知道哪个加速地址能用就填在下载设置页,面板把文件名接在后面
    下载,校验和照样卡 Azul 官方的,下不到会自动退回官方 CDN。给自建镜像和国内新出的加速站用。

  • 更新页可以装任意一个历史版本了。 「其他版本」折叠开之后,列出当前通道里还在的所有版本,每行
    一个按钮直接装 —— 新版有 bug 想退回去、或者想装某个特定的快照,不用再 SSH 上去手动换二进制。

    列表是展开时才去 GitHub 拉的,不在首屏联网。能不能装由面板对着通道自己的列表判定,不是信请求里
    的版本号:否则从列表里挑一个就绕开了更新通道。往回装同样算降级,同样会先把面板配置备份一份。

    和「退回上一版」的区别:那条路不联网、秒级、不受 releases 清理影响,但只有一份,连退两版做不到;
    这条路能跳着装,但得那一版还在 GitHub 上(快照只留 3 份)。

  • 更新页可以退回上一版了。 面板更新时被换下去的那个二进制一直留在原地(<可执行文件>.old),
    注释里早就写着「留着好让人手动回退」—— 但没人知道那个文件是哪一版,也就没有按钮可按。现在它记在
    panel.json 里,更新页上多一节「回退」。

    这条路是纯本地的:不下载、不联网,哪怕那一版已经从 releases 页上被清理掉(快照只留 3 份)也照样
    能退。按之前面板会先把 .old 跑起来问它 -version,跟记录对不上或者跑不起来就不给按钮并说明原因 ——
    把面板换成一个起不来的文件,之后连修它的面板都没有了。退回去之后 .old 就是刚才那一版,改主意还能
    再换回来。

    任何一次降级之前,面板会先备份自己的配置。 这不只是回退,从快照切回正式版也算。原因是旧版本
    读不懂新版本写进配置的字段,而 Go 只写它声明过的字段 —— 旧版本一保存,那些字段就永久没了(登录
    凭据、GitHub token、角色权限都可能中招)。所以 panel.json、users.json 等八个文件会原样复制到
    `data/roll...

Read more

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 00:13
6d15f6f

安全

  • 修改密码接口现在也走限速和并发派生上限。 它校验的是同一个面板密码,代价同样是 0.1 秒单核
    CPU,之前却因为「在登录之后」而完全没有节流。结果是:拿到一个会话的人在正门被限流之后,可以拿
    这个接口当密码探测器无限次试;任何一个已登录的客户端也能靠它把 CPU 从 Minecraft 服务端手里抢走。
    现在和登录、配对共用同一份额度 —— 理由和配对接口当初共用时一样,把一扇门敲满之后换另一扇继续
    就行了。输错的当前密码会记进凭据记录,输对则清空该地址的记录。

  • 同一个客户端对同一个实例最多开 4 条控制台连接。 一条连接会在实例的日志分发上挂一个订阅、
    占两个 goroutine,并且要一直占到关闭为止 —— 按速率限制拦不住这种「持有型」开销,一个不停重连
    又不关旧连接的客户端可以慢慢把它们堆到一个不能被打扰的服务端进程上。超过上限返回 409,
    和本机终端的会话上限是同一套做法。按「客户端 + 实例」计数,所以开满一个实例的控制台不影响看
    另一台服务器。

  • 设备令牌被拒绝时会记进凭据记录(设备令牌无效)。 猜一个 32 字节随机令牌没有意义,这条
    记录真正要抓的是另一种情况:某个 app 还在拿已经被解除配对的令牌请求。从外面看这和有人在探测
    面板一模一样,而在此之前它是完全静默的。连续重复会折叠成一行并计数。

  • 登录和配对接口加了限速,密码校验加了并发上限。 校验一次密码是 210k 轮 PBKDF2,约 0.1 秒的
    单核 CPU;而 /api/auth/login 和 /api/auth/devices 都是公开的。原先两者都不限次数,于是同一台
    机器上既能无限次在线猜密码,也能靠几十个并发请求把 CPU 从 Minecraft 服务端手里抢走 —— 后者甚至
    不需要猜对密码。

    现在按客户端地址计数:连续 5 次失败后限流,每 30 秒回一次机会,返回 429 并带 Retry-After。
    只有失败扣次数,登录成功会清空该地址的记录,所以连打几个错字再输对不会被罚;被限流的请求
    约 4ms 返回,不再跑 PBKDF2。配对接口和登录共用同一份额度 —— 分开的话,把一扇门敲满之后换另一扇
    继续就行了。

    另有一道并发派生上限(约 1/4 核数,下限 2),排不上返回 503。这一道才是真正兜住 CPU 的:
    按地址限速挡不住换源地址的攻击,也挡不住所有人都从加速器同几个回源地址进来的情况。

  • 登录成功现在会记日志。 之前每一次失败的猜测都写进了日志,唯独猜对的那次什么也没留下 ——
    面板被拿下之后没有任何痕迹可查。日志同时记 remote(TCP 对端)和 client(面板判定的真实
    客户端),后者在反代或加速器后面才有区别。

  • 新增 trustedProxies 配置,用来在反代/加速器后面认出真实客户端。 限速默认只认 TCP 对端地址:
    X-Forwarded-For 是任何客户端都能写的头,无条件相信等于让攻击者每个请求换一个计数桶。但在
    Nginx、CDN 或阿里云 GA 后面,所有请求都从少数几个回源地址进来,全算一个客户端的话,一个攻击者
    就能把所有人一起锁在门外。

    在 panel.json 里列出可信代理(支持 CIDR 和单个 IP)之后,只有对端命中列表时才读
    X-Forwarded-For,并且取最右侧那个不属于可信代理的地址 —— 每一跳都往右追加自己看到的地址,
    取左边就等于把计数桶交给攻击者挑。条目写错只会在启动日志里告警并跳过,不会拦住面板启动。

新增

  • 插件的版本锁定现在在版本列表里就能点。 「锁在某一版、不要再提示更新」这个能力一直都有 ——
    插件抽屉的「设置」页有个「版本锁定」下拉框,锁上之后这个插件不再报「有更新」,批量升级也会
    跳过它。问题是没人找得到它:想停在某一版这个念头是看着版本列表时产生的,而当时唯一能做的
    事是下载和删除。现在每个已经在库里的版本展开后都有「锁定在这个版本 / 解除版本锁定」,锁着的
    那个版本行上照旧挂「已锁定」徽章。两个入口写的是同一个字段,改哪边都一样,更新策略的其余几项
    不会被顺手改掉。

  • 新建实例改成向导式页面:一步问一件事,缺什么就在那一步补上。 原来的新建是一个对话框,
    五个问题一次问完,而且默认你要的东西都已经有了 —— 核心下拉框里是核心库现有的,jar 输入框
    里填的是目录里已有的,Java 压根不问。开第十个服时这样最快,开第一个服时不是:核心库是空的,
    下拉框里一个选项都没有,唯一的出路是「去核心库下载一个」,一点,对话框关掉,刚填的全没了。

    现在是 /instances/new 上的一个页面,五步,顺序就是这些东西互相依赖的顺序:

    1. 服务端核心 —— 从核心库挑一个,或者就在这一步下载一个新的(项目、版本、构建信息
      和下载进度都在页面里,下完自动选上),或者「先不放核心」自己传 jar。
    2. Java 环境 —— 按上一步选的核心算出它要哪个 Java,逐个标「可用 / 版本过低 / 可能太新」,
      并且就在这一步装。默认选的是满足要求里最低的那个:1.16.5 挑 Java 8 而不是 21,
      因为老服务端在新 Java 上一样起不来,这个方向以前没人提醒过。
    3. 名称与位置 —— 名字按核心预填(Paper 1.21.4),目录、内存(对着本机内存给档位,超过
      八成会警告)、开机自启和崩溃重启。
    4. 服务器设置 —— 端口、MOTD、最大玩家数、难度、游戏模式、存档名和世界种子,以及
      EULA。种子和存档名放在这里是有原因的:世界一旦生成就改不动了,而它们过去只能在实例建好
      之后去「服务器配置」里赶在第一次启动前改。代理端(Velocity)没有世界也没有 EULA,这一步
      整个不出现。
    5. 确认创建 —— 把每个答案读一遍,然后按顺序做四件事:建实例、复制核心、写 EULA、写
      server.properties,一行一个状态。第一件事之后实例就真的存在了,所以后面哪一步失败都会
      单独报出来而不是回滚 —— 建好一个缺核心的实例,也好过面板悄悄把刚建的服务器删掉。

    只写你改过的 server.properties 项,其余的仍旧由服务端第一次启动时自己生成。整个过程在按下
    「创建实例」之前不碰磁盘,每一步都能往回改。

  • 新增「数据库环境」,可以像装 Java 一样把 MySQL / PostgreSQL / MongoDB 装起来并跑起来。
    半数常用插件都要数据库 —— LuckPerms 存权限、CoreProtect 存日志、Plan 存统计 —— 而「装个 MySQL」
    在此之前意味着包管理器、service 文件、root 密码和一条 GRANT 语句,全都不是 Minecraft 知识,
    却挡在勾选插件配置的前面。

    侧栏「资源库 → 数据库环境」分三页:我的数据库(建库、启停、复制连接串)、已装引擎
    (引擎是数据库程序本身,一次安装可供多个库共用)、安装引擎(下载)。整套东西归守护进程所有,
    关掉网页不影响下载,也不影响正在跑的数据库;勾了「面板启动时自动开」的库会跟着面板一起起来,
    并且排在服务端之前启动 —— 反过来的话,开机自启的服务端会连不上库,好几个插件会就此关闭自己。

    建库时端口、账号和密码都有默认值(端口自动错开,密码自动生成),建完直接给出可以粘进插件配置的
    连接串和 JDBC 地址。默认只监听回环地址:同一台机器上的服务端照常连,外面连不进来。

    几点值得先知道的:

    • 二进制都从官方或权威渠道取,能校验的都校验:MongoDB 用官方发布清单里的 SHA-256,PostgreSQL 用
      Maven 中央仓库的 SHA-1,MySQL 用官方的 MD5。后两者的强度不足以防替换,所以这一块不提供镜像
      —— 对这两个引擎来说,到发布方的 HTTPS 本身就是保证,加一层镜像等于把它去掉。
    • PostgreSQL 官方不为 Linux 提供免安装包(EDB 的二进制包如今只剩 Windows 和 macOS),这里用的是
      zonky.io 发布在 Maven 中央仓库的便携构建 —— embedded-postgres 用的就是它。
    • MySQL 在 Linux 上装的是官方精简包(60 MB 左右);ARM 机器官方没出精简包,只能下完整包(近 1 GB)。
      macOS 上的 MySQL 请用 Homebrew,官方压缩包的文件名带 macOS 版本号,面板没法可靠地拼出来。
    • MySQL 和 MongoDB 的官方二进制依赖系统里的共享库(libaio、libnuma 等)。装完面板会先跑一次
      引擎自检
      ,跑不起来就在「已装引擎」页把原始报错和对应的安装命令一并写出来 —— 包括 Ubuntu 24.04
      上装完 libaio1t64 还要补一个 libaio.so.1 软链接这种坑。跑不起来的引擎不允许建库。
    • MongoDB 官方压缩包里不带 mongosh,面板没法给它建账号密码,所以 MongoDB 的库只能监听回环地址。
    • 面板以 root 运行时,数据库会降权到一个普通系统账号再启动(PostgreSQL 根本拒绝以 root 运行)。
      优先用该引擎自己的惯例账号(mysql / postgres / mongodb),没有就退而求其次。
    • 删除数据库时,数据目录默认保留,要连数据一起删得在确认框里单独勾选。
  • 服务器上的 jar 现在能直接导入插件库了,不用先下载到本地再传回去。 插件库页的「库外来源」
    一直有个「收编进库」按钮,但它只对校验和跟库里某个版本一模一样的 jar 有用;剩下的(自己编译
    的、朋友发的、从备份还原来的)点下去只会得到一句「先在 XX 的插件页上把它导入插件库」—— 而那个
    按钮并不存在:面板里的「导入 jar」是从你自己电脑上传,可文件明明已经在服务器上了。

    现在这条路补上了:面板直接在实例目录里把 jar 读出来、算校验和、作为一个版本存进插件库。实例
    目录里的文件一动不动,还是原来那一份在跑。进库之后它和下载来的插件一样 —— 能装到别的服、能在
    跨实例总览里比版本、能回滚;唯一的区别是它没有上游,所以永远不会有更新提示。

    两个入口:插件库页的「收编进库」现在两种 jar 都能收(认得出的记账,认不出的导入);实例插件页
    每一行的 ⋯ 里,「接管」和「导入插件库」按情况二选一出现。

  • 实例插件页现在读得懂每个 jar 里的 plugin.yml,点插件名打开抽屉看全部信息。 面板过去只从
    没装过的 jar 里挖名字和版本,剩下的字段读完就扔;面板自己装的那些干脆不读——记录里有版本号,
    看起来就够了。可记录里没有的恰恰是最要命的一条:这个插件要哪些前置。一个插件明明躺在
    plugins/ 里却没跑起来,十次里有八次是前置没装,而这件事页面上一个字都没有。

    现在每个 jar(自己传的和面板装的一视同仁)都会读一遍描述文件:插件名、版本、简介、作者、
    API 版本、前置依赖、软依赖。简介和依赖列表是散文和列表,塞进表格只会被截断或者把行高撑坏,
    所以放进右侧抽屉——点行首的插件名打开。抽屉里的依赖会跟这台服现有的插件比一遍,逐条标
    已装 / 没装,不用自己回去数。plugin.yml 里 description: | 和 > 这两种折行写法也认,
    以前这种写法等于没有简介。

    支持 Bukkit / Spigot / Paper 的 plugin.yml、BungeeCord 的 bungee.yml、Velocity 和 Fabric
    的 JSON。Forge 的 TOML 还是不读——猜错了比不说更糟。读出来的结果按文件的大小和修改时间缓存,
    轮询这一页不会反复去开压缩包。

  • 两个 jar 声明了同一个插件名时会标出来。 插件叫什么由 jar 里的 plugin.yml 说了算,跟文件名
    毫无关系,所以「手动传了一份新构建,忘了删旧的」在文件列表里看不出任何异常:两个文件名不一样、
    大小不一样、都好端端待在 plugins/ 里。而服务端只会加载其中一个、按目录顺序挑,另一个直接拒绝,
    于是页面上显示的版本号是那个没在跑的。

    现在这样的行会整行标黄、带一个「重名 N」标记,页面顶上有一条汇总,筛选栏多一个「重名」档,
    抽屉里会把撞上的文件路径逐个列出来。只算启用着的 jar——.disabled 的那个服务端根本不加载,
    停用本来就是解决重名的办法之一。

  • 主机监控新增网络流量:上行、下行两条曲线,外加自面板启动以来的累计收发。 一台服卡,先看的三个数
    一直只有两个 —— CPU 和内存。而 Minecraft 是个每秒往每个在线玩家推几十 KB 的东西,带宽先到顶在人
    多的服上比 CPU 先到顶常见得多,表现出来就是所有人一起橡皮筋、方块拉丝,而面板上 CPU 和内存都好端端的,
    于是排查方向从一开始就是错的。

    采样和 CPU 走同一个五秒的节拍,存在同一个环形缓冲里,所以关掉网页也在采,重新打开就是完整的
    三十分钟。只统计真正出得去的网卡:回环(本机上服务端和数据库之间的往来,它从没离开过这台机器)
    不算,docker / veth / 网桥 / 隧道 / 流量镜像设备也不算 —— 这些设备上的字节最终还会在物理网卡上再数
    一遍,全加起来会得到两三倍于真相的数字。到底在数哪几块网卡,就写在图表标题旁边。

    累计量从面板启动算起,不是从开机算起:内核的计数器是自开机以来的总数,一台跑了半年的机器上,
    那个数回答的不是任何人问过的问题。

  • 实例列表新增「导入现有目录」:把机器上已经有的服务端目录直接接管过来。 面板原先只会新建 —— 目录
    是它挑的,核心是它复制的。可是相当一部分人是先有服务器、后有面板:手动跑了一年的生存服,或者从别的
    面板搬过来的一堆目录。这些人过去只能新建一个实例、把目录字段改成已有路径、再去启动设置里手填 jar
    名,而这条路上没有任何一步会告诉你「这个目录里到底有什么」——填错了要等到启动失败才知道。

    现在选一个目录,面板就地读一遍并把看到的东西摆出来:哪个 jar 像是服务端(按名字认 Paper / Purpur /
    Fabric / Forge / Velocity 这些,认不出就取最大的那个,所以插件 jar 不会被当成核心)、有哪些世界存档、
    插件和模组各多少个、server.properties 里的端口和 MOTD、EULA 同意了没有。名字默认取目录名,确认之后
    面板只往自己的实例表里写一条记录 —— 目录里的世界、插件、配置一个字节都不动,不复制核心,也不改写
    配置。

    唯一会被拒绝的是已经有实例指着的目录:两个实例指向同一个世界,一起开服会把存档写坏。这一条在
    对话框里就说清楚,创建接口本身也拦(它原先不拦,手填路径就能撞上)。⌘K 里也能直接叫出这个对话框。

  • 实例控制台改成跑在伪终端上,并且是默认。 原先服务端的 stdout 是一根管道,这带来两个躲不开的
    限制:服务端能看出没有终端,于是 JLine 不提供补全、TerminalConsoleAppender 不上色;而按行扫描
    意味着没有换行的输出根本不会出现——区块预生成、Forge / NeoForge 安装器画的进度条,还有
    Continue? [y/N] 这类提示,在面板上都是一片空白,看着像服务器卡死了。

    现在默认给服务端开一个 pty,输出以原始字节送到 xterm.js,键盘直接喂给服务端自己的行编辑器。
    于是 Tab 补全由正在运行的那个服务端回答——插件命令、命令方块参数、真实在线玩家名、版本
    差异全部自动正确,不再是面板手写的那份命令表;进度条来多少显示多少;颜色不用再强制;折行按
    你浏览器窗口的真实宽度(多个浏览器同看一个服务器时取最窄的那个)。

    代价是终端只有一条流,stderr 不再单独标红(内容仍然完整记录,只是无法区分)。需要这个区分
    的实例可以在「启动设置 → 控制台」里关掉终端模式,连同原来的命令输入框、面板自带的补全和 ↑↓
    历史一起回来。Windows 没有 ConPTY 实现,所有实例仍以管道模式运行,开关是灰的;Linux / macOS
    上万一开不出 pty,会回落到管道并在控制台里说明,而不是拒绝启动服务器。

    行视图并没有被丢掉:同一份字节会再抽成行进环形缓冲,所以 /logs?since=、Done (x.xxs)! 就绪
    识别和日志导出都照旧,\r 重绘在日志里只保留最后一次的结果而不是每一个百分比。
    终端模式下 -Dterminal.jline=false -Dterminal.ansi=true 不会被加上——前者恰好会关掉终端模式
    最想要的那个补全。

  • 「设置 → 登录记录」 —— 面板收到的地址,以及最近的登录、配对和限流事件,不用再 SSH 上去翻
    journald。上半页是当前这次连接的客户端地址和 TCP 对端;配了 trustedProxies 时两者会不同,
    页面会说清哪个是代理回源地址(防火墙要放行的那个)、哪个是真实客户端。

    下半页是面板启动以来的事件表:登录成功/失败、设备配对/解除、修改密码、被限流。连续重复的同类
    事件折叠成一行并标出次数 —— 否则一次限流就能把其他记录全挤出去,而那恰恰是最需要看清历史的时候。
    失败记录里的用户名是对方输入的,页面上明说了它不代表这个账号存在。

    只存在内存里,面板一重启(包括自动更新)就清空,和会话一样。它是方便查看的视图,不是审计
    底账:需要长期留存的记录仍然在系统日志里,那边一条都没少。这样也不会多出一份需要保护的凭据轨迹
    文件,或者悄悄把磁盘写满。

    用加速器的话请注意:这一页显示的是已经连过的地址,而回源节点通常有一批。它适合用来验证
    防火墙白名单对不对,不适合用来生成白名单。

  • 面板可以自己跑 HTTPS 了:-tls-cert / -tls-key。 原先面板只会说明文 HTTP,加密这件事必须
    由反代代劳。反代仍然是有域名时的最佳选择(证书能自动续期),但它覆盖不了几种情况:手上已经有
    证书(acme.sh 签的、公司内部 CA 发的、云厂商送的)、内网自建 CA、或者机器只能用 IP 访问因而
    永远签不出公网证书。

    两个参数必须成对出现,只给一个直接报错退出 —— 半套配置多半是打错了,静悄悄退回明文 HTTP 比报错
    糟糕得多。证书在绑端口之前加载,路径写错会立刻失败并指出是哪个文件,不会等服务器都起来了才发现。
    最低 TLS 1.2。证书续期后需要重启面板重新加载。

  • 插件管理 —— 侧栏多了一个「插件库」页,实例里多了一个「插件」标签。分工是刻意的:
    插件的添加、下载来源、版本和更新全部归全局的插件库管,实例只能拿来用、换版本、停用。
    如果每个服都能自己下载,同一个插件很快就会有六份说不清区别的副本,而最想回滚到的那个旧版
    永远是被就地覆盖掉的那个。

    全局:定义来源、拉版本、看更新。 填一个 GitHub 仓库(EssentialsX/Essentials,或者
    直接把浏览器地址栏里的仓库地址粘进去),面板就从它的 Release 里拉 jar,走的和面板自己更新
    同一条路,镜像源也跟着「设置 → 面板更新」里的那个走(默认 https://ghfast.top/,镜像不通
    自动回落 GitHub 直连)。一个 Release 挂了好几个 jar 时,默认跳过 -sources、-javadoc、
    -dev 这类附带包,在剩下的里挑最大的那个 —— 装错成 sources 包的后果是服务器正常启动、
    插件却完全不工作,这种问题最难查。不满意可以填个文件名通配(EssentialsX-*.jar)自己指定。
    预发布版默认不列。

    每个版本单独存一份,放在 data/plugins/<插件>/<版本>/。很多插件每次发布都叫同一个
    Foo.jar,按文件名存新版会直接盖掉旧版,回滚时就没东西可回了。检查更新是手动点的
    (整体或者单个),结果缓存在 registry.json 里,卡片上写清上次检查的时间 —— 匿名 GitHub API
    一小时只有 60 次配额,页面自动去刷会把它花在没人看的地方。

    实例:只管用哪个。 从库里挑插件和版本装进去,拿到的是自己的副本,所以删掉库里的插件
    不会动到已经装上的服。换版本是一次操作,新 jar 落地后旧的才删,不会出现同一个插件两个版本
    同时躺在 plugins/ 里害得服务器起不来;本来是停用状态的插件换完版本还是停用的,不会被
    悄悄打开。停用就是把 jar 改名成 .jar.disabled(Bukkit / Spigot / Paper / Velocity /
    BungeeCord 都只加载 *.jar),插件自己的配置目录一动不动,重新启用就是改回来。
    增删和启停都要重启服务器才生效,正在跑的时候界面会明说。

    不是面板装的 jar 也会列出来(自己传的、从备份恢复的),标成「自行放入」,可以停用和删除,
    只是没有版本和来源信息 —— 装作没看见只会让服务器上多一个谁也说不清的插件。Fabric / Forge
    的模组把「安装目录」填成 mods 就行,同一套机制。

    下载归守护进程管,关掉网页也会继续,重开页面接得上进度;先写 .part 再改名,失败、取消或
    断网都不会留下一个看起来能用的半截 jar。删实例时它的插件记录一起清掉。

    页面分两层:侧栏的「插件库」是一张列表 —— 二十个插件里哪个有更新、哪个没人用、一共占多少
    磁盘,一眼扫完;点进去才是那个插件自己的页面,版本、上游发布、来源设置和删除都在那里。挑版本、
    看更新说明、决定回滚到哪一版,本来就是一次对着一个插件做的事,挤在一堆卡片里只会互相干扰。
    访问令牌和下载源不在这两个页面里,它们搬去了「设置 → 插件源」:那是配好一次就不再动的东西,
    没必要天天挡在插件列表上面。

    下载源可以挑。 和 Java 运行时一样给了一组镜像:ghfast.top、gh-proxy.com、
    github.moeyy.xyz、GitHub 直连,也可以填自己搭的代理前缀。...

Read more

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 02:32
07f3efb

新增

  • Java 下载源可选 —— 「Java 运行时」页安装前多了一个「下载源」:清华大学 TUNA、南京大学、
    华为云、GitHub 加速,以及 Adoptium 官方直连。Adoptium 的包放在 GitHub 发布页上,国内机器
    (尤其是各家云主机)直连常年只有几十 KB/s,一个 50 MB 的 JRE 能下半小时甚至超时失败;换成
    国内镜像通常是几十秒的事。

    默认是自动:按清华 → 南大 → 华为云 → GitHub 加速 → 官方的顺序挨个试,哪个通就用哪个。
    指定了某个源也一样保底 —— 镜像同步有延迟,刚发布的版本可能还没同步过去,这时会自动落到官方,
    界面上的「下载源」会显示实际在用的那个,不会因为镜像没跟上就装不了。

    换源不改变装的是什么。 版本列表、文件名、大小和 SHA-256 始终来自 Adoptium 官方 API,
    镜像只负责传那几十兆的压缩包,下完仍然逐字节校验,对不上直接丢弃、不解压——所以镜像没有
    能力塞给你一个别的 JDK。安装失败时的报错也会写清是哪个源传的,方便换一个再试。

    选择记在 panel.json 里(javaSource),下次安装默认还用这次选的;老配置没有这一项,
    等同于「自动」。

  • 本机终端(默认关闭) —— 「设置 → 终端」里打开开关后,侧栏多一个「终端」页:面板所在这台
    机器的一个真 shell,跑在伪终端上,所以 top、vim、htop、Ctrl-C、颜色和 shell 自己的
    Tab 补全全都正常,中文输入输出也没问题。装插件、翻日志、改配置不用再单独 SSH 上来。

    跑的就是本机、身份就是面板进程的身份,不是 SSH 到别的服务器 —— 所以面板里不存任何
    SSH 密钥或密码,终端也拿不到比面板本身更高的权限。

    默认关闭,升级面板也不会自动打开。 开启等于把面板密码变成这台机器的 SSH 密码:任何能
    登录面板的人都能以运行面板的用户执行任意命令。界面上开启前会要求确认一次,开关的开/关都记进
    panel.json 并写进日志。关掉开关会立刻挂断所有已经开着的会话,不只是拦住新连接。

    会话跟着页面走:关掉标签页就挂断,连同它启动的程序一起(先 SIGHUP,3 秒后 SIGKILL)——
    和实例控制台正好相反,因为没人看着的 shell 只会把命令留在半路。要让命令活得比标签页久,
    用 systemd 或者在里面开 tmux / screen。同时最多 4 个会话。

    Windows 上不可用(需要 ConPTY),面板会直接说明,开关点不动,其余功能不受影响。

  • 快照版与更新通道 —— main 分支每个通过 CI 的提交都会自动出一版快照,发布成 GitHub 上的
    prerelease,想提前试新功能不用自己编译。面板更新页多了「更新通道」,在「正式版」和「快照」
    之间切;默认是正式版,没人会被动升到快照上。

    快照版本号是下一个次版本号加后缀(0.2.0 发布后的快照是 0.3-snapshot.86,数字是提交数),
    按语义化版本正好落在 0.2.0 之后、0.3.0 之前 —— 所以正式版通道永远看不见快照,而快照通道
    在 0.3.0 发布的那一刻会自动更新过去,不会一直卡在快照轨道上。快照通道取的是版本号最新的
    那一个,正式版和快照一起比。

    切回正式版通道时,如果当前跑的快照比最新正式版新,面板会提示把它装回最新正式版 ——
    版本号是往回走的,确认弹窗里会明说,并提醒先备份数据目录。除此之外面板不会往回装。

    快照走的是和正式版完全相同的构建、打包和校验流程(同一个 make package),装的时候一样
    校验 SHA256SUMS.txt。GitHub 上只保留最近 5 个快照,旧的连同 tag 一起删掉,正式版不受影响。

  • 服务端核心库 —— 下载好的服务端 jar 现在存在面板级的 data/cores/ 里,在
    「设置 → 服务端核心」管理。一个核心只下载一次,之后开多少个服都是从库里复制一份过去,
    不必每建一个服就再拉一遍同样的 60 MB —— 断网的机器上也照样能开新服。

    实例拿到的是自己的副本而不是共享路径,所以删掉库里的核心、或者下载一个更新的构建,
    都不会改变一个正在跑的服务器是从什么启动的。自己丢进 data/cores/ 的 jar(Fabric、
    Forge、整合包服务端)也会被列出来,一样能复制给实例。

  • 全局仪表盘 —— 首页从一段说明文字变成了真的仪表盘:实例运行中/总数、已装 Java 数、
    核心库存量、面板版本各占一格,点进去就是对应的管理页;崩掉的实例和待更新的版本直接
    在顶上提示。实例卡片上带了启动/停止按钮,常见的那两个操作不用再先进控制台。

  • 实例目录选择器 —— 「服务器目录」旁边多了「浏览…」,可以直接翻本机的目录树选一个:
    外挂硬盘、NAS 挂载点,或者一个你已经有服务端的目录。选了不存在的目录也没关系,创建
    实例时会一并建好。目录里已有的 jar 会自动出现在「服务端 jar」的下拉里,跟着你输入的
    路径走 —— 接管一个现成的服务器不再需要照着记忆敲文件名。

  • 设备令牌 —— 原生客户端(桌面端 / Android)现在可以用 Authorization: Bearer 认证,
    不必再去模拟浏览器的 Cookie。配对走 POST /api/auth/devices,要的是密码而不是一个
    已登录的会话:签发一个比会话活得久的凭证,就该出示凭证本身。令牌只在配对那一次返回,
    面板只留它的摘要。

    和浏览器会话是两套东西,互不通用 —— 会话故意存在内存里、重启即失效,这对坐在电脑前的
    人是对的,对手机 App 不是:面板每自更新一次就把人登出,体验很差。设备令牌写进
    panel.json,重启照常能用,可以单独吊销,在「设置 → 已配对设备」里能看到名字和最后
    使用时间。

    改密码会一并解除所有设备的配对:这个动作通常意味着「旧密码不该再打开任何东西」,
    而每个设备令牌都是拿旧密码换来的。

变更

  • 面板换了一套配色,并且有了浅色模式 —— 颜色统一从一套 Material 3 配色(源色 #8F4C38,
    一种暖陶土色)生成,深浅两套只是同一张表的两组取值,样式表里其余的规则都只认语义名,不认
    具体颜色。

    默认跟随系统,侧栏底部多了一个开关,在「跟随系统 / 浅色 / 深色」之间轮换,选择记在浏览器
    本地(所以是一人一设备的偏好,不写进 panel.json)。模式在首屏渲染之前就定好了,刷新不会
    先闪一下另一套颜色。

    控制台和终端在两种模式下都保持深色画布 —— Minecraft 的日志用的是 ANSI 颜色,而 ANSI 是按
    深色背景配的;浅色模式下这块画布用的是配色自带的反相表面,仍然属于同一套色板。切换模式时
    终端就地换色,会话和已经打印出来的内容都不受影响。

    图表的两条线(CPU 与内存)每种模式各有一组取值,都按各自的卡片底色跑过色觉与对比度校验;
    「运行中 / 启动中 / 已崩溃」这些状态色也没有被品牌色吞掉,仍然是各自的绿、黄、红。

  • 默认监听地址改成 0.0.0.0:19190 —— 原先是 127.0.0.1:8080,只有本机能连,想从外网
    打开面板还得先开 SSH 隧道或配反代。现在装好直接用服务器 IP 加 19190 就能访问,记得在防火墙
    或安全组里放行这个端口。

    只影响新装的面板。 listen 是持久化在 panel.json 里的,已经跑起来的面板升级后仍然
    沿用原来的地址;要跟着改,在配置里改掉或者用 -listen / HYPERCRAFT_LISTEN 覆盖。

    面板讲的是明文 HTTP,而且能在这台机器上执行任意控制台命令,所以挂公网请配 TLS 反代;想回到
    原来只监听本机的行为,用 -listen 127.0.0.1:19190。

  • 面板级的东西都收进了「设置」 —— Java 运行时、服务端核心、面板更新现在是「设置」
    下的三个分页(/settings/java、/settings/cores、/settings/update,刷新和分享链接
    都认;老的 /java 会跳到对应分页)。这些都是不属于任何一个实例的共享资源,原先散在
    总览页和实例的「启动设置」里,装个 Java 或下个核心得先滚半屏。

    安装/下载状态跟着提到了应用级:装到一半切去看实例,侧栏会一直标着「安装中」或「下载中」,
    切回来进度条接着走 —— 这些任务本来就归守护进程管,现在界面也不再假装它只在那一页上存在。

  • 实例里的「下载服务端核心」改成了「从核心库复制」 —— 联网下载统一在核心库那一页做,
    实例这边只负责挑一个复制过来。原先每个实例各自下载,同一个 Paper 版本在磁盘上会存好几份,
    下载任务的状态也是一实例一份;现在下载路径只有一条。

移除

  • GET /api/instances/{id}/jars 和 POST /api/instances/{id}/jars/download(及其状态、
    取消端点)。前者被 GET /api/fs 取代(它能列出任意目录,不只是实例自己的),后者被
    POST /api/cores + POST /api/instances/{id}/core 取代。

安装

下载对应平台的压缩包,解压后直接运行:

tar -xzf hypercraft-0.3.0-linux-amd64.tar.gz
cd hypercraft-0.3.0-linux-amd64
./hypercraft -data ./data

前端已经嵌在二进制里,不需要另外部署。开机自启参考包内的
hypercraft.service。

校验

sha256sum -c SHA256SUMS.txt --ignore-missing