1安装插件
两个 jar:LinuxAPP.jar 硬依赖 InTheNameOfLinux.jar —— 26.11.11 起 App 的服务端就是直接调 ITNOL 的 API,老版本 ITNOL 缺这些方法会报「服务器没有 ITNOL 插件」,所以两个必须一起换、版本对齐。AuthMe、经济插件、LinuxTeam、LinuxTitle 这些是接上就用,没接就少一块数据,不会报错。
- 把
LinuxAPP.jar放进服务器的plugins/目录。服务端用 Paper 或 Spigot 1.12.2,Java 8。 - 重启服务器。插件会自己生成配置和密钥,并在
49282端口把接口开起来(默认监听0.0.0.0,云服务器要能直连)。 - 看控制台的
[联动]日志,确认 AuthMe、金币、点券、封禁、队伍、头衔都接上了。 - 在服务器本机执行
curl http://127.0.0.1:49282/api/health,能返回一串 JSON 就说明接口是活的;在手机浏览器里试http://你的服务器IP:49282/api/health能看到同样的 JSON,就说明安全组也放行了。
正常启动时控制台会依次打出这几行(装了什么就出现什么,没装的那一项不会打):
哪一行结尾写的是「未检测到」,就是对应的插件没装、没启用或者版本不认识。那一项在 App 里会显示成 —,其余功能照常,不用为了一行日志去折腾服务器。
启动后生成的文件
没有子目录、没有数据库,就这几个文件:
0.0.0.0:49282,手机直接连 http://服务器IP:49282,不需要 Nginx。
代价是密码和令牌在公网上是明文(限流、令牌签名、审计都还在)。想加密有两条路:
前面挂 Nginx(见 Nginx 反代),或者开 http.tls: true 让插件自己上 HTTPS
(见本节末尾)。
2配置
全部配置都在一个 config.yml 里,改完执行 /nalxerapp reload 就生效,不用重启服务器。
| 键 | 默认值 | 说明 |
|---|---|---|
http.host | 0.0.0.0 | 监听地址。0.0.0.0 = 所有网卡(手机才能直连);只想让本机 Nginx 转发就写 127.0.0.1。 |
http.port | 49282 | 接口端口。改了记得同步改 Nginx 里的 proxy_pass,两边要对得上。 |
http.threads | 8 | 处理请求的线程数。几十个人的服 8 个足够,没必要往上加。 |
http.tls | false | 插件自带 HTTPS 的总开关。开了就不用在前面挂 Nginx,地址直接写 https://域名:49282。 |
http.keystore | keystore.p12 | 证书文件(PKCS12),放在 plugins/LinuxAPP/ 下。 |
http.keystore-password | 空 | p12 的密码,开了 tls 就不能留空。 |
token.secret | "" | 令牌签名密钥。留空会自动生成一串随机值写回配置;换掉它等于所有人重新登录一次。 |
token.ttl-hours | 168 | 令牌有效期(小时)。168 = 7 天,过期的令牌直接返回 401。 |
login.require-authme | true | true = 登录必须通过 AuthMe 校验游戏密码(推荐);false = 不校验密码,只放行此刻在游戏里在线的玩家,给正版服 / 没装 AuthMe 的服用。关掉它之后,知道别人 ID 的人可以在对方在线时登进去,别在装了 AuthMe 的服上关。 |
login.attempts-per-minute | 5 | 每个 IP 每分钟允许几次登录尝试。这是防撞库的第一道闸。 |
login.requests-per-minute | 180 | 每个 IP 每分钟允许多少次请求(所有接口合计)。App 自动刷新 30 秒一次,180 有富余。 |
admin.players | [] | 管理员名单,填游戏 ID。名单里的人能看到玩家管理页;服务器 OP 自动算管理员,不用重复填。 |
data.* | 全 true | 某一项数据要不要对外提供(coins / points / level / playtime / team / title)。关掉哪一项,App 里对应的那一块就显示 —,接口也不返回。 |
verify.enabled | true | 1.4.1 的 Linux 身份验证总开关。开着时,verify.players 里的账号登录 App 后要先输一次 ITNOL 密码,验完才能用其它功能。 |
verify.players | [Linux582021, fs1] | 哪些账号要二次验证。留空就退回「插件里那个受保护账号」。 |
su.players | [Linux582021, fs1] | 能碰「命令控制台」和「su(任意命令)」的账号。不在这份名单里的管理员照样能封禁 / 惩罚 / 处理举报 / 管假人,但命令控制台直接返回 403。App 设置里还要再打开「启用 su 控制台」开关才看得见入口。 |
chat.capture-link | true | 26.11.14:把 logs/latest.log 里 [App] 名字: 内容 这种广播收进 App 公屏,标「FS1安卓端」。 |
chat.link-speakers | [app] | 认哪些方括号前缀是「安卓端发来的聊天」。默认 app(NalxerLink 的广播前缀);也可以写 fs1、nalxerlink。 |
features.* | 全 true | 1.3.0 起的功能开关:chat / team / titles / checkin / report / penalty / fakes / console。关掉后对应接口直接返回 403,App 里那一页也不再出现。 |
debug | false | 打开后每个请求都往控制台打一行(路径、耗时、来源 IP),排查连不上时用,平时关着。 |
一份改过的配置长这样
存盘之后执行 /nalxerapp reload。配置写错(缩进错、键名拼错)插件不会崩,会在控制台打一行黄色警告并且继续用旧配置跑。
token.secret,已经发出去的令牌才会立刻失效 —— 因为签名换了,旧令牌验不过。改端口、改限流、改管理员名单都不影响已登录的人。
config.yml,
线上那个文件用 .gitignore 排除掉。
3Nginx 反代
直连已经能用(http://服务器IP:49282),这一节是给「想要 https、想要域名」的人准备的:Nginx 转一次,顺便把 http 跳 https 一起做了。
证书路径按你自己的改,用 certbot --nginx -d api.nalxer.top 签的话它长这样。proxy_pass 后面是纯地址,不要再拼一个 /api/,拼了会把路径再叠一遍,变成 /api/api/login。
改完先 nginx -t 看语法,再 systemctl reload nginx。然后本机验一下:
curl -I https://api.nalxer.top/api/health,返回 200 就通了。
127.0.0.1。少了这一行,全服所有玩家在限流眼里是同一个人:
一个人连续输错 5 次密码,所有人接下来一分钟都登不上,日志里也全是 127.0.0.1,出了问题根本没法查是谁。
$remote_addr 会是 Cloudflare 的节点 IP。要么让 Nginx 认 CF-Connecting-IP,
要么在插件前面就别加这一层 —— 加一层就得配一次真实 IP,多一层就多一个「限流算错人」的机会。
不想挂 Nginx:让插件自己上 HTTPS
服务器上就这一个服务、又懒得维护 Nginx 的话,插件内置了 HTTPS(Java 自带 HttpsServer,没有额外依赖)。 把 certbot 签的证书转成 PKCS12 丢进插件目录就行:
重启后控制台会打 接口已启动:https://0.0.0.0:49282/api/health(插件自带 TLS,证书来自 keystore.p12),
App 里地址填 https://你的域名:49282。
tls: true 但 p12 缺失或密码错时,插件打一条警告后退回普通 HTTP,不会起不来。
4接口表
一共 16 个普通接口 + 13 个管理员接口,除了 health 和 login,其它都要在请求头里带 Authorization: Bearer <token>。
| 方法 | 路径 | 要令牌 | 说明 |
|---|---|---|---|
| GET | /api/health | 否 | 返回版本、监听地址和 capabilities(哪些插件接上了)。连不上、数据全是 0,第一个要看的就是它。 |
| POST | /api/login | 否 | body 传 name + password,校验通过返回 token 和过期时间。 |
| GET | /api/me | 是 | 当前登录玩家的完整数据,App 的「我的」页只靠这个接口。字段见下一节。 |
| GET | /api/me?name=Steve | 是 | 管理员查别人的数据。普通玩家查别人会拿到 403,查自己不带参数就行。 |
| GET | /api/online | 是 | 在线人数和在线玩家名单(名字 + 延迟)。 |
| GET | /api/players | 是 | 在线玩家列表:名字 / 等级 / 延迟 / 世界 / 队伍 / 头衔,最多 200 条。 |
| GET | /api/chat?since=0 | 是 | 聊天记录(环形缓冲 120 条),参数 since 是上一条的 id,只回新的。 |
| POST | /api/chat | 是 | 发一条聊天,body:message(最多 200 字)。被禁言会返回 403。 |
| GET | /api/team | 是 | 我的队伍(成员、队长、队标)+ 全部队伍列表。 |
| POST | /api/team | 是 | 队伍操作,body:action(create / join / leave / kick / disband / transfer)+ arg。 |
| GET | /api/titles | 是 | 头衔总览:当前佩戴、已解锁数量、全部头衔 + 解锁条件。 |
| POST | /api/titles | 是 | 佩戴 / 卸下,body:id(传空串是卸下)。 |
| GET | /api/checkin | 是 | 签到状态:今天签没签、连续多少天、累计多少天、下次重置时间(北京时间 0 点)。 |
| POST | /api/checkin | 是 | 签今天的到。返回 reward(5000 金币 / N 点券);当天重复调用返回 400 和「今天已经签过了」。 |
| GET | /api/reports | 是 | 我提交过的举报 + 处理结果。 |
| POST | /api/report | 是 | 举报别人,body:target / reason。返回举报编号。 |
| GET | /api/admin/linux | 是 | Linux 系插件清单:名字 / 版本 / 是否运行 / config.yml 大小 / 目录里的文件。需要管理员。 |
| GET | /api/admin/linux/config?name=LinuxTAB | 是 | 读这个插件的 config.yml 原文,App 里直接改。 |
| POST | /api/admin/linux/config | 是 | 保存配置:body {name,text}。先做 YAML 语法检查,过了才写盘 + 重载,旧文件留 config.yml.app-bak。 |
| POST | /api/admin/linux/op | 是 | 启停重载:body {name,op:enable|disable|reload}。 |
| GET | /api/admin/status | 是 | 插件联动状态(11 个插件 + 8 个功能开关),App 设置页那张状态表就是它。 |
| GET | /api/admin/players?q=st | 是 | 在线 + 离线一起搜(离线名字来自 ITNOL 的历史记录),最多 60 条。 |
| GET | /api/admin/player?name=Steve | 是 | 单个玩家详情:数据 + 他身上生效的惩罚 + 举报记录。 |
| GET | /api/admin/penalties | 是 | 当前所有惩罚记录(禁言 / 移动 / 方块 / 封禁)。 |
| POST | /api/admin/penalty | 是 | op=apply|release,apply 传 type / name / minutes / reason。 |
| GET | /api/admin/reports?pending=1 | 是 | 举报列表,pending=1 只看没处理的。 |
| POST | /api/admin/report | 是 | 处理举报:op=accept|reject + id + note。 |
| GET | /api/admin/fakes | 是 | 假人列表:名字 / UUID / 世界 / 是否活跃 / 坐标。 |
| POST | /api/admin/fake | 是 | op=add|remove。召唤要求本人正在游戏里(假人要站在你脚下)。 |
| GET | /api/admin/commands | 是 | 命令白名单 + 分组清单,App 的「服务器命令」页靠它渲染。 |
| POST | /api/admin/exec | 是 | 执行一条白名单命令,body:command。返回真实回显,最多 40 行。 |
| POST | /api/admin/su | 是 | 1.7.0 的 su:验证过 Linux 身份后执行任意命令(不走白名单,stop / restart 仍然拦),body:command。 |
| GET | /api/admin/search?q=st | 是 | 按名字模糊搜玩家,最多 30 条,每条带 name / online / banned。需要管理员。 |
| GET | /api/admin/bans | 是 | 当前生效的封禁列表,带原因和到期时间。需要管理员。 |
| POST | /api/admin/ban | 是 | 封禁,body:name / reason / minutes。需要管理员。 |
| POST | /api/admin/unban | 是 | 解封,body:name。需要管理员。 |
手动试一次登录
拿到 token 之后可以接着试:
200 成功、400 参数不对、401 令牌没有或过期(重新登录)、
403 令牌是好的但你没有管理员权限、404 路径写错了、
429 触发限流(等一分钟,不用改配置)、5xx 服务端执行失败(消息里会写原因,比如玩家不存在)。
5数据字段
/api/me 返回一个 JSON 对象,App 的每一块显示都对应其中几个。下面挑常用的写,加粗的是 1.2.0 新增的。
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 游戏 ID,就是登录时填的那个名字。 |
uuid | string | 玩家 UUID,带连字符的完整形式。 |
online | boolean | 现在是否在线。离线也能拿到数据,只是这个字段是 false。 |
coins | number | 金币数量。没装经济插件时是 0,要靠 hasCoins 判断该不该显示。 |
hasCoins | boolean | 服务端有没有接上金币来源。false 时 App 显示「—」而不是 0。 |
points | number | 点券数量,同理。 |
hasPoints | boolean | 服务端有没有接上点券来源。 |
level | number | 玩家等级。1.2.0 起离线时也读真实存档(world/playerdata/<uuid>.dat 的 NBT),不再是 0。 |
exp | number | 当前这一级已经攒的经验,用于画进度条。 |
totalExp | number | 从 0 级算起的总经验,不掉级就只增不减。 |
levelLive | number | 实时等级,含经验条上那点还没存盘的进度。 |
expIntoLevel | number | 当前这一级已经攒的经验(和 exp 同义,App 用它算进度百分比)。 |
expToNext | number | 升到下一级要多少经验(1.12.2 公式:2L+7 / 5L-38 / 9L-158)。 |
identity | object | 玩家身份(来自 XlandCore):{role, label, prefix, roles, hasXland},label 是「服主 / 副服主 / 市长 / 协管 / 管理员 / 普通玩家」。 |
role | string | 上面那个 label 的简写,省得 App 再拆一层。 |
teamTag | string | 队伍标识(队标)带色码,没队伍是空串。 |
titleId / titleName | string | 头衔 id 和干净名字,没戴头衔是空串。 |
muted | boolean | 是否被 ITNOL 禁言(App 发聊天前会看它)。 |
health / maxHealth / food | number | 在线时的生命、血量上限、饥饿值。 |
gamemode / world / ping | string / string / number | 游戏模式、所在世界、延迟(毫秒)。 |
banUntil | number | 封禁到期时间戳(毫秒),永久封禁是 0。 |
playtimeHours | number | 累计在线小时数,保留一位小数。 |
firstPlayed | string | 第一次进服时间,ISO 8601 格式。 |
lastPlayed | string | 最近一次进服时间,同样 ISO 8601。 |
team | string | LinuxTeam 队伍名。没队伍是空字符串,App 显示「无队伍」。 |
title | string | LinuxTitle 头衔。没头衔是空字符串。 |
banned | boolean | 当前是否处于封禁状态。被封的人也能登录 App 看自己的状态。 |
banReason | string | 封禁原因。没封禁是空字符串。 |
world/playerdata/<uuid>.dat 的 NBT 里读,
不再依赖「上次有人在线时缓存下来的值」,所以挂机号、退服很久的人也能看到真实等级。levelLive 只是标记这次读数是不是实时的。
coins: 0 直接当「没钱」
判断有没有这个数据源看 hasCoins。只读 coins 的话,没装经济插件的服务器上每个人看起来都是穷光蛋。
6App 使用
普通玩家五个页签:我的(数据 + 签到)、聊天(公屏 + 队伍频道 + 队伍管理)、头衔、更多(在线玩家 / 设置)。管理员会多一个管理页签,里面分「玩家 / 举报 / 惩罚 / 假人 / 命令」五块。
1.4.0 把原来单独的「队伍」「命令」两页合了进来:队伍相关全在聊天页,命令在管理页的最后一个子标签里。
每日签到
「我的」页顶部那张卡就是签到:点一下领奖励,50% 是 5000 金币,剩下的是 1–5 点券。 每天北京时间 0 点重置。
- 连续签到天数会累加,断一天就从 1 重新算;累计天数永远只增不减。
- 当天签过按钮变「已签到」,再点会被服务端挡回来(`400`)。
- 奖励真的进游戏账户,下线也算数 —— 走的是 Vault 和 PlayerPoints。
装到手机上
两个平台给的包不一样,别装错:
| 平台 | 文件 | 怎么装 |
|---|---|---|
| 安卓 | LinuxAPP-26.13.3.apk(约 3.34 MB) | 传到手机点开装;系统提示「未知来源」时给浏览器一次安装权限 |
| iOS | LinuxAPP-26.13.3-unsigned.ipa(约 1.17 MB) | 电脑装 Sideloadly,插上 iPhone,把 ipa 拖进去、填 Apple ID、点 Start |
iOS 这个 ipa 是在 macOS 上编出来的真机包,没有签名 —— 苹果不允许未签名的 App 在手机上跑, 所以要用你自己的 Apple ID 重签一次。Sideloadly 在 Windows 和 Mac 上都能用,全程不用越狱。
第一次登录
先填接口地址(https://api.nalxer.top,不要带 /api 后缀),再填游戏 ID 和游戏密码。
这里的密码就是进服用的那个 AuthMe 密码,不是邮箱密码、也不是论坛账号。
登录成功会拿到一个令牌,默认 7 天有效。这 7 天里打开 App 不用再输密码;令牌过期会回到登录页,重新登一次即可。
「我的」页看什么
从上到下一屏:在线状态 → 金币 / 点券 / 等级三张卡 → 经验进度条 → 队伍和头衔 → 累计在线时长和最近一次上线时间。 被封禁的账号在最上面多一条红色横幅,写着原因和到期时间。
「聊天」页怎么用
游戏里公屏说的每句话都会同步到这里(带 · 游戏 标记),在 App 里发的消息会以 [LinuxAPP] 你的名字:内容 的格式广播回服务器,游戏里的人能看见。30 秒自动拉一次新消息,有未读时底部页签上会出现小红点。
队伍频道(1.4.0)
聊天页顶部有「世界 / 队伍」两个小按钮。点「队伍」就只看队内消息:发出去的话只有队友看得到,游戏里也会以 [队伍] 队标 名字 » 内容 的样子出现。
- 一个人在几个队里时,队伍频道下面会多出一排队名,点哪个看哪个、发到哪个。
- 队伍管理也在这一页:成员、贡献、退出、踢人、转让、解散、建队、加入,都在聊天记录下面。
- 队长把队伍聊天关了(
/team setting chat off),App 这边发会被挡回来。
发不出去通常就两个原因:被 ITNOL 禁言了(返回「你被禁言了,现在不能在服务器说话」),或者单条超过 200 字。
say 今晚八点维护、面板用 RCON 发播报,都会以「控制台」的身份出现在聊天里。
万一你那边的面板走的是别的派发方式,插件还会盯 logs/latest.log 里
[Server] / [Rcon] / [CONSOLE] 开头的播报行兜底
(chat.capture-log,默认开)。同一句话不会重复出现。
FS1 安卓端(NalxerLink)发的消息也能看见(26.11.14)
如果服务器上装了 NalxerLink(给安卓客户端用的登录 / 聊天接口),那边发的聊天会以
[App] 用户名: 内容 的形式广播到控制台。这里的用户名就是对方在 FS1 安卓客户端登录时
填的那个账号(比如 Linux582021),不是固定的「FS1玩家」字样。LinuxAPP 会把这行认出来,
原样用这个用户名进 App 的「世界」频道,后面标 · FS1安卓端——一眼能分清是 游戏里 说的、
LinuxAPP 发的、还是 FS1 安卓端 发的。显示形如:Linux582021 · 23:59 · FS1安卓端。
- 开关:
chat.capture-link,默认true;关掉就不再读这类广播。 - 前缀名单:
chat.link-speakers,默认[app]。别的客户端广播前缀不是[App]的话,把它加进这个列表。 - 实现方式:只读
logs/latest.log,不碰 NalxerLink 本身,那个插件怎么升级都行。
在 App 里管 Linux 系插件(1.7.0)
设置页最下面一张「Linux 系插件」卡,点进去就是列表:每个插件一行,写清楚版本、有没有 config.yml、目录里还有哪些文件。
- 停用 / 启用:直接
disablePlugin,停用后服务器立刻不再跑它(被别的插件依赖会失败并告诉你)。 - 重载配置:等于
reloadConfig()。 - 改配置:把 config.yml 原文读出来,在手机上改完点「保存并重载」。保存前先跑一遍 YAML 语法检查,写错了不落盘、原文还能继续改;成功会留一份
config.yml.app-bak。
Linux 开头的(LinuxACE / LinuxChestGUI / LinuxSync / LinuxTAB / LinuxTeam / LinuxTitle)加上假人插件 FakePlayerPlugin;插件联动状态那张表也只显示这些。「队伍」页怎么用
没队伍时给的是「建队」按钮和全服队伍列表,点一个就能申请加入;有队伍时显示队长、队标、成员(在线的人名是亮的),队长能踢人 / 转让 / 解散,队员只能退出。所有操作直接调 LinuxTeam,和游戏里 /team 命令是同一套数据。
「头衔」页怎么用
顶上是你现在戴的头衔(右边有「卸下」),下面是全部头衔和它们的解锁条件 —— 条件都翻成了人话:「今日在线 12 小时」「挖矿 99999 次」「管理员发放」「节日活动」。已解锁的点一下就能戴上,进服或重新进服后会在名字前面显示。
管理页怎么封人
只有 admin.players 名单里的人或者 OP 才看得到这个入口。流程是五步,一步都不能少:
- 进管理页,在搜索框里打一部分名字(打
st就能搜到Steve),等结果出来。 - 点一下要处理的那个玩家,选中之后底部才会亮出操作栏。
- 点「封禁」,填原因 —— 这一栏建议写清楚,玩家在 App 里看到的就是它。
- 选时长:1 小时 / 1 天 / 7 天 / 30 天 / 永久。
- 再点一次「确认封禁」。在线的人会被当场踢下线,封禁立刻生效,同时写一条审计日志。
解封在同一个页面:admin/bans 列表里点开那条封禁,点「解封」就行,不用填原因。
刷新和设置
- 「我的」页每 30 秒自动刷一次,下拉也能立刻刷。
- 设置页可以改接口地址(换服务器用)、清掉本地令牌(等于退出登录)、看 App 版本号。
- 退出登录只删手机上的令牌,不影响游戏账号,也不影响别人。
726.13.3 更新说明
26.13.3 这一版有两件事:队伍能共享领地了,插件也改名成 LinuxAPP 了。
- 队伍「领地共享」:队伍卡片里,「队伍申请」下面多了一个开关。打开后,队长和每个队员名下的 Residence 领地会对全队开放 17 项基础权限(建造、破坏、使用、容器、按钮、拉杆、中继器、门、压力板、音符盒、附魔、酿造、铁砧、蛋糕、龙蛋、床、工作台);关掉就把这些权限收回。有人入队、退队、被踢,都会自动补上或收回。
- 必须先开「队伍申请」:没开进队验证时,这个开关是灰的,点不动,下面写着「需要先打开上面的「队伍申请」」。这样不会出现「谁都能进队、顺手把领地也交出去」。
- 插件改名 LinuxAPP:jar 从
LinuxAPP.jar改成LinuxAPP.jar,命令用/linuxapp(/nalxerapp也还能用)。第一次启动会自动把plugins/LinuxAPP里的配置、登录记录、队伍申请搬到plugins/LinuxAPP,旧的不用手动删。 - 装两个 jar 才完整:
LinuxAPP.jar+InTheNameOfLinux.jar一起放进 plugins。LinuxAPP 硬依赖 ITNOL,少了它不会启动。 - 领地共享靠的是命令 + 存档:不直接调 Residence 的 Java 接口(它把 WorldGuard / Kingdoms 写进了类里,服务器没装就崩),改成读
plugins/Residence/Save/Worlds找归属、用控制台resadmin pset改权限,所以服务器不需要额外装 WorldGuard。
此前版本要点:这一版加了主题(风格 + 颜色),把聊天的实时刷新彻底修好,并让 App 里做的操作在执行人一栏写成「APP端(用户名)」。
- 动效:开屏动画、切页滑入(按底栏顺序决定方向)、顶栏标题淡入、底栏选中态过渡、弹窗淡入缩放;系统开了「减少动态效果」就自动关掉。
- 分段控件:不再左右滑动,改成一整条带分隔线的合体按钮,条目多了换行、文字居中。
- 管理页「在线」多了管理层名单:服主 / 副服主 / 管理员 / 协管,在不在线都列,按身份优先、同级在线优先;每行「详情」直接进玩家详情。
- 保护对象不再假成功:对 ITNOL 的保护对象点禁言/禁移动/禁交互/全禁,现在会明确告诉你「ITNOL 会拦住这类惩罚」,不会再弹成功。
- 玩家详情能返回了:以前点返回会被异步回来的请求又拽回详情页,现在不会。
- iOS 风格 + 悬浮导航:主题里风格多了 iOS(卡片半透明液态玻璃、顶栏与弹窗毛玻璃、系统式分段控件);主题弹窗里还有「悬浮导航栏」开关,底栏会变成浮起来的一颗胶囊,iOS 风格默认开。
- 分段控件圆角修好:以前按钮自己带圆角和投影,套在胶囊容器里圆角对不上、投影还会溢出来。现在容器统一裁切、按钮不再自带投影;条目多了横向滑动,不折行。
- Miuix 布局:不只是配色,卡片内距、圆角、行高、按钮形状、页面边距都跟着 Miuix 走。
- 默认落在「我的」:登录 / 重新登录 / 冷启动都从「我的」开始。
- ITNOL 回到插件管理:InTheNameOfLinux 现在出现在「插件联动」和插件管理里,但它的配置、启停、重载只有
Linux582021能用,别人看到的是灰按钮。 - 主题:更多页 →「显示」→「主题」,点开是二级菜单。风格可选 默认 和 Miuix(大圆角、无边框卡片、胶囊按钮、浅底输入框);颜色可选 天蓝色 / 淡粉色 / 淡绿色 / 古董白 / 黑色 / 灰色,默认天蓝色,深色模式会自动换成对应的深色版本。选完立刻生效并记在本地。
- 聊天实时刷新:服务端
/api/chat原来返回的是全局最后一条消息的 id,游标会被别的频道推过去;重启后 id 又从 1 重来,旧游标就永远查不到新消息。现在返回本次实际最后一条的 id,并在游标跑飞时回reset让客户端重拉。App 里聊天页改成 2 秒一轮、8 秒卡死自愈、切到后台再回来立刻刷一次,每次切页也会重拉该页数据。 - 只认
[APP]日志:[NalxerLink] [Link] 有效 token:0这种插件自身的运行日志不会再被当成玩家发言,只把[APP] 玩家名:内容当成 FS1 安卓端的消息。 - 执行人写 APP端:从 App 里做的举报受理/驳回、禁言/禁止移动/禁止交互/全部禁止、封禁/解封,记录里的执行人是
APP端(用户名);在游戏里做的保持原样。 - 队伍离线可用:人不在游戏里也能建队 / 加入 / 退出 / 踢人 / 转让 / 解散 —— 之前只要离线,所有队伍按钮都回一句「你现在不在游戏里」。
- 队伍管理补齐:邀请、改队标、队伍聊天开关、转让队长、踢人、解散;多队玩家每张卡片上的按钮只对那一支队生效。
- 举报筛选:全部 / 待处理 / 已处理,已处理的显示受理还是驳回、处理人和备注。
- 玩家详情单独一页:搜索框里点「详情」直接进详情页,左上角有返回,不再挤在管理页下面。
- 设置页分组:账号 / 显示 / 管理 / 接口地址 / 插件联动 / 关于软件 / 退出登录,版本号和作者只在「关于软件」和页面最底下出现一次。
- 权限收紧:普通玩家看不到「改 Linux 系插件配置文件」的入口。
- 26.11.14 NalxerLink 的安卓消息进公屏:装了
NalxerLink的服务器,安卓客户端(FS1 安卓端)发的聊天会出现在 App 的「世界」频道,名字后面标「· FS1安卓端」,和游戏发言、App 发言一眼分清。只在服务端读日志,不改 NalxerLink;开关chat.capture-link,前缀名单chat.link-speakers。 - 26.11.12 队伍 / 转账 / 聊天:加入队伍成功却弹「加入失败」已修(LinuxTeam 的
join是 void,以前把 null 当 false);接上 NalxerECO 的转账,聊天输入框旁边多一个「转账」按钮,金币走 Vault、点券走 PlayerPoints,规则和税都沿用那个插件的实现;聊天重复显示修好(服务端 1.5 秒内同一句只存一次,App 端按消息 id 去重、请求串行,不再丢最新一条);有人上线/下线时公屏中间出现灰条提示;在线玩家点「管理」直接进详情页。 - 26.11.11 硬依赖 ITNOL:举报 / 惩罚 / 封禁 / 身份验证以前靠反射猜方法名,线上 ITNOL 版本一对不上就报「服务器没有 ITNOL 插件」,已处理的举报也读不出来。现在 plugin.yml 写死
depend: [InTheNameOfLinux],代码直接调ReportManager/LinuxPenalty/BanManager/LoginManager,缺插件直接不启动并说明原因。 - 26.11.10 我的页加了举报:以前只有管理员能在管理页看举报,普通玩家既没地方提交、也看不到自己举报的结果。现在「我的」页有一张「举报玩家」卡:填 ID 和理由就能提交,下面按时间列出自己的举报,已处理的会写受理还是驳回、谁处理、备注是什么。
- 26.11.9 补两处点击:队伍卡片上的按钮(邀请 / 改队标 / 队伍聊天开关 / 转让 / 踢人 / 解散 / 退出)之前按了没反应,是点击事件的匹配列表里漏了这几个按钮;玩家详情页里开惩罚提示「先选一个玩家」,是详情搬成独立页后还去旧位置找名字。
26.11.x 这种「年份.月份.序号」,不再用 1.x。
26.11.22 队伍和聊天合成「社交」
- 底栏变成:我的 / 社交 / 头衔 / 管理 / 更多,队伍不再是单独一页。
- 社交页顶部的切换控件是三段:公屏 / 队伍频道 / 队伍;最后一段就是队伍管理(我的队伍、建队、服务器上的队伍)。
- 切到「队伍」时聊天输入条会收起,整页只放队伍相关的内容。
26.11.28 消息提醒:提示音 + 振动 + 系统通知
- 以前只有顶部弹窗,现在同时响提示音、振动一下(走系统原生的振动与音频,网页版退回浏览器能力)。
- 停在聊天页也会弹,不再只在别的页面弹。
- 新增两个开关:「软件内提醒」(弹窗 + 提示音 + 振动)和「软件外提醒」(退到后台推一条系统通知),各管各的。
- 第一次打开会申请通知权限;拒绝后可以去系统设置里再打开。
- Miuix 主题的圆角补回来了:选择控件是完整胶囊,输入框有圆角描边,卡片/弹窗/按钮都跟 Miuix 一致。
26.12.3 新图标 + iOS 12 定位修复
- 换图标:蓝→紫对角渐变底 + 白色 N + 右下薄荷绿点,圆角与配色都重新调过;安卓同时出了自适应前景和圆形版。
- iOS 12 的开屏动画、弹窗跑到左上角:根因是 CSS 里用了
inset: 0(iOS 14.1 才支持)和100dvh(iOS 15.4 才支持),老 WebKit 直接丢掉这两条 → 全屏遮罩没有定位。 现在top/right/bottom/left与100vh都先写了一遍,老系统也认得。 - 老系统兼容层再补一批:开屏内部、消息弹窗、弹窗卡片之间用外边距补 flex gap;
.splash/.modal再兜一次四方向和宽高。 - iOS 12 包的版本号改成读
$(MARKETING_VERSION),CI 传什么就是什么,不会再出现「包里写着旧版本」。
26.12.4 新图标:白底蓝标
- 图标换成白底 + 极淡网格 + 蓝色渐变 N(右下蓝点),跟系统里一堆彩色图标放在一起更清爽,也更好认。
- iOS 12 那个包之前用的是 Capacitor 框架的默认图标(白底蓝色叉),现在和正式版统一,都是自己的 N。
- 安卓同步换了方形 / 圆形 / 自适应前景三套资源。
26.12.6 协管权限 / 单设备登录 / 开屏图标 / iOS 12 输入条
- 协管有权限了:XlandCore 的
moderators名单、config.yml里新加的admin.moderators、或游戏里带nalxerapp.moderator权限的人,登录后角色是moderator,底栏出现「管理」,但只有「在线 / 玩家 / 举报 / 惩罚」四格。 - 协管能做的:看在线列表和管理层名单、查玩家详情、处理举报、禁言 / 解除禁言。封禁、禁止移动、禁止交互、全部惩罚、假人、插件配置、su 控制台一律 403,文案直接说「协管只能禁言」。
- 一个账号同时只能在一台设备登录:第二台会提示「已经在另一台设备上登录了,请先在那边退出登录」;原设备点「退出登录」后马上可以换机。原设备还开着的话,下一次请求会收到「已经在另一台设备登录」并被登出。
- 手机丢了或重装了:登录时确认「踢掉那台设备」就能顶掉旧会话(
takeover),不必等旧机操作。 - 开屏和登录页的图标换成框架那张图,和桌面上一致。
- iOS 12 的聊天输入栏以前会跟着页面滚走,现在老系统单独走
position: fixed,钉在底栏上方。
26.12.5 图标:回到白底蓝叉
- 图标按你的要求换成 Capacitor 框架自带的那张(白底 + 淡对角网格 + 蓝色交叉标),iOS 用框架原图逐字节替换。
- 安卓由 1024 主图缩放生成方 / 圆 / 自适应三套,背景色改成白色,自适应前景缩进 66% 安全区。
- iOS 12 分支同步换成同一张,两个包图标一致。
装 ipa 报「Application is missing the application-identifier entitlement」
- 这句话的意思是:这个包装进去的时候没有带 application-identifier 这个授权项,不是包坏了,是「没签名 / 签名没注入授权」。
- 三条路,任选一条:
· 先签名再装:全能签里不要点「安装」,走「签名」→ 选证书 → 签完再装;
· 用电脑签:Sideloadly / AltStore 登 Apple ID 重签,最稳;
· 直接用 ad-hoc 版:下载页那两个「装不上?用 ad-hoc 版」,包里已经用codesign --sign -写入了application-identifier与_CodeSignature,TrollStore 这类只认授权的安装器可以直接装。 - ad-hoc 版没有开发者证书,越狱/TrollStore 之外的普通机器仍然要用证书重签一次才能启动,这点和未签名版一样。
- 如果重签后还是报同样的错,换一个 Bundle ID(比如
top.nalxer.app2)再签,多半是和已装的旧包冲突。
iOS 12 老系统版(26.12.2 起)
- 下载页多了一个
Nalxer-26.12.6-ios12-unsigned.ipa,最低 iOS 12.0,给 iPhone 6 / 6 Plus / 5s / iPad 4 这类老机器用。 - 它用的是 Capacitor 3.9.0(新版框架最低要 iOS 13),前端和主版本是同一套
mobile/www,功能没有删减。 - 包体约 16.0 MB,因为 Swift 运行库一起打进去了;新系统版仍是 1.12 MB。
- 老系统的 WebKit 没有 flex gap,包里带
legacy.js/legacy.css:检测到不支持就自动用外边距补间距,并把-webkit-sticky、惯性滚动补上。 - 32 位设备(armv7)最高只能到 iOS 10,现代 Xcode 已经不支持,所以这条线到头是 iOS 12 + arm64。
- 自己编:
mobile-ios12/是独立工程,macOS 上bash build-ios12.sh 26.12.6直接出包。
26.12.2 登录页「测试连接」:自己签名的 App 连不上时先看这里
- 登录按钮下面多了一个「测试连接」,只请求
/api/health,不用账号密码。 - 成功会显示
HTTP 200,服务端版本 x.y.z;失败会把原始错误原样贴出来。 - 常见三种原因会自动附上建议:
· ATS:重签名工具(全能签等)重写了 Info.plist,把 http 访问拦掉了 —— 重签时不要勾「修改 Info.plist」,或换回我们给的未签名 ipa 再签;
· Load failed:先在 Safari 打开同一个地址,能看到 JSON 就说明网络没问题、是签名包被限制了 http;
· 超时:地址写错、端口没放行、或服务器只在内网。 - iOS 端 Info.plist 补了
NSLocalNetworkUsageDescription与NSBonjourServices,连局域网服务器时会弹权限说明。
26.12.1 正式版 公屏上下线带时间
- 公屏里「XX 上线了 / XX 下线了」后面带上时间,例如「TabCheck 上线了 · 01:20」。
- 提示保持居中灰条,和微信「消息已撤回」一样,不占聊天气泡的位置。
- 这个版本作为 26.12.6 正式版发布。
26.11.36 队伍页彻底不跟随滚动
- 只有「公屏」「队伍频道」会跟着消息滚到底,「队伍」页完全不跟随。
- 切到「队伍」时会回到页面顶部,从队伍卡片第一行开始看,不会被上一页的滚动位置带跑。
26.11.35 队伍页不再被拉到底
- 只有「公屏」和「队伍频道」会跟着消息自动滚到底。
- 「队伍」页保持你当前的位置,来消息也不会把你拽走,方便看队伍和申请。
26.11.34 发消息 / 来消息直接拉到底
- 发完消息、收到新消息都直接把聊天拉到最后,不再做「刚好露出一条」的定位。
- 进聊天页、切频道同样落在最底部。
26.11.33 聊天自动跟到最新一条
- 自己发完消息,列表自动滚到底,不用再手动往下拉。
- 别人发来消息也自动跟过去,保证最新那条露在输入框上方,不会被挡住。
- 切频道、重新进聊天页同样会停在最新的位置。
26.11.32 提醒更聪明:哪页都能收到
- 以前只有聊天页才会提醒,现在任何页面收到别人的新消息都会提示(每 4 秒查一次)。
- 在聊天页只出声、只震动,不再弹卡片挡住消息;在别的页面才弹顶部卡片。
- 顶部卡片会避开灵动岛 / 刘海(跟着系统安全区下移),不会再被挡掉。
26.11.31 队伍频道会跟着开关消失 / 大数字带单位
- 队长把某个队的队伍聊天关掉后,聊天页顶部的「队伍频道」如果没别的队能用,整段就不显示了;正在队伍频道的话会自己回到公屏。
- 队伍频道里多个队的切换条,也会把关了聊天的队过滤掉。
- 所有开关(深色模式、软件内/外提醒、队伍三个开关)都加了滑动过渡,点下去是滑过去的,不是瞬间跳。
- 金币、点券带单位了:1000 → 1K,一百万 → 1M,十亿 → 1B,再往上还有 T / Q。转账弹窗里的余额也一起改了。
26.11.30 队伍申请与队长审批
- 队伍页多了一排开关:队伍聊天、队伍伤害、队伍申请,队长点一下就能改,非队长只能看。
- 「队伍申请」打开后,这个队就不再直接进:别人点「申请加入」,队长的队伍卡片上会出现「加入申请 N 条」,可以逐条同意或拒绝。
- 公开队照旧一键加入,没有申请这一步;服务器队伍列表里,需要申请的队伍排在最前面,按钮写「申请加入」,还带一个「需申请」标签。
- 同意时如果对方不在线,也照样批准 —— 他下次进服就在队里了。
26.11.29 提醒更靠谱、名字不分大小写
- 消息提醒只在真的来了新消息时出现,点来点去不会再重复弹旧消息;软件内提醒弹 2 秒。
- 提醒带提示音与震动(系统原生方式);退到后台可以推一条系统通知,两个开关各管一边。
- 玩家名一律不分大小写:输
apptest也能找到AppTest,名字来源是 InTheNameOfLinux 记过的真实玩家名单。 - 进「管理」默认落在「在线」;从玩家详情返回,回到刚才那一级(在线 / 玩家 / 举报…),不再被拽回玩家页。
- iOS 浅色模式下状态栏改成深色字,看得清了。
26.11.27 管理入口只给服主
- 普通管理员在「更多」页看不到「管理」那一块了:su 开关、Linux 系插件、插件联动状态一起隐藏。
- 导航栏的「管理」页照旧:在线、玩家、举报、惩罚、假人、命令、su 都在。
- 就算绕过界面调接口,服务端也会回 403「插件配置只有服主能改」。
26.11.26 权限、提醒、历史消息
- 插件配置文件的读取、保存、启停、重载只有服主能做;普通管理员进到插件管理只能看,按钮是灰的。
- 主题(风格 + 颜色)对所有人都开放,在「更多 → 显示 → 主题」。
- 聊天有了入场动画;别人发消息时顶部会弹一条 1.5 秒的提醒,可在「更多 → 显示 → 消息弹窗提醒」关掉。
- 每次打开社交页、切换公屏 / 队伍频道,都会重新拉最近 200 条历史,不会再「只看到刚发的」。
- 底栏选中块的圆角改成跟导航栏一致,看起来更贴。
26.11.25 一点手感上的修补
- 命令分组、多队伍切换、举报筛选这些「点一下会重建按钮」的选择控件,白块现在也会滑过去,不再直接跳。
- 底栏选中块再放大一圈,圆角 18px(悬浮导航 20px)。
- 顶部下拉、底部上推的回弹更明显:最大 150px、阻尼 0.55、松手 420ms 回位。
26.11.20 选择控件的白块会滑过去
- 点开哪个选项,白色滑块就平移到哪一格,0.28 秒的缓动,和 iOS 的分段控件手感一致。
- 选项换行到第二行时,滑块也会跟着跳到对应的一行。
- 深色模式滑块是半透明白;系统开了「减少动态效果」就不做动画。
26.11.18 又改了这些
- iOS 风格回到普通配色:不再做半透明毛玻璃,卡片 / 顶栏 / 弹窗都是实底;圆角、间距、胶囊按钮、悬浮导航这些布局保持原样。
- 开屏停 2 秒:最少显示两秒再进入,不会一闪而过。
- 管理列表挪到在线玩家下面:管理 → 在线,先「在线玩家」,再「管理层」。
- 详情按钮点了没反应修好:整行都能点;按下后 1 秒内不再重绘列表;返回时作废在飞请求,不会被拽回详情页。
- 开关跟随主题色:iOS 皮肤里「开」不再固定绿色,改成你选的强调色。
- 控件布局收尾:分段控件圆角裁齐(不再顶出容器)、聊天页吸顶条不再左右出血、接口地址输入框铺满卡片。
8换主题:风格与颜色(26.12.6)
更多页 →「显示」卡 →「主题」,点开是二级菜单:
| 项目 | 可选 | 说明 |
|---|---|---|
| 风格 | 默认 / Miuix / iOS | 默认是原来的界面;Miuix 把卡片改成大圆角无边框、按钮和开关改成胶囊、输入框改成浅底无边框、底栏去上边框加阴影;iOS 是液态玻璃:半透明卡片 + 背景毛玻璃、顶栏和弹窗一起毛玻璃、系统式分段控件、按钮带轻微投影。 |
| 颜色 | 天蓝色 / 淡粉色 / 淡绿色 / 古董白 / 黑色 / 灰色 | 改的是强调色:按钮、选中态、标签、未读小红点。默认天蓝色;深色模式自动用同一颜色的深色版,不会深底深字。 |
选完立刻生效,存在浏览器本地(nalxer.skin、nalxer.accent),换设备或清缓存会回到「默认 · 天蓝色」。
10管理层名单(26.12.6)
管理页的「在线」子标签,最上面多了一张「管理层」卡:
- 服主 / 副服主 / 管理员 / 协管四组,在不在线都列出来,右边写每组多少人;
- 排序:先按身份(服主 > 副服主 > 管理员 > 协管),同一身份在线的排前面,再按名字;
- 每行一个是「在线 / 离线」,一个是「详情」按钮 —— 点了直接进该玩家的详情页,不用再去搜索框里搜。
名单来源:服主 / 副服主 / 协管读 XlandCore 的配置名单,管理员读服务器 OP 列表。
7管理员
两种方式成为管理员:把游戏 ID 写进 admin.players,或者给这个玩家服务器 OP(OP 自动算管理员,不用重复填)。
改完 /nalxerapp reload,名单里的人下次打开 App 就能看到管理页。被移出名单的人要重新登录一次才会掉权限 —— 他手上的令牌还是管理员令牌,直到过期。
管理页有七块(1.7.0)
顶上一个横条切子页:在线 / 玩家 / 举报 / 惩罚 / 假人 / 命令 / su。
- 在线:当前在服里的人,点名能进玩家详情。
- 玩家:在线 + 离线一起搜,点开有金币 / 等级 / 身份(服主、副服主、市长、协管,读 XlandCore)/ 队伍 / 头衔 / 封禁,下面五种惩罚一键开。
- 举报 / 惩罚 / 假人:举报能看未处理和已处理;惩罚按类型解除;假人可以停用 / 启用、停载区块、关刷怪、重生、移除。
- 命令:白名单里的常用命令,点一条填参数再执行。
- su:仿真控制台,只有设置里打开才出现,打开前要验一次 Linux 身份;输入的命令以服务器控制台身份执行,回显就是后台那份。
管理页:玩家 / 举报 / 惩罚 / 假人
管理员的「更多」页会多出一张管理卡,四个子标签:
| 子标签 | 能做什么 |
|---|---|
| 玩家 | 搜在线或离线的玩家 → 点开详情(等级 / 金币 / 点券 / 队伍 / 头衔 / 历史惩罚 / 相关举报)→ 直接封禁或开惩罚。 |
| 举报 | 看玩家提交的举报(举报人、被举报人、理由、时间),逐条受理或驳回,可以写处理备注。 |
| 惩罚 | 所有生效中的禁言 / 移动封禁 / 方块封禁 / 封禁,按类型分组,点一下就解除。 |
| 假人 | FakePlayerPlugin 的假人列表(坐标、在线状态),能直接移除;召唤需要你本人正在游戏里。 |
封禁时长选项
App 里给的是四个档,对应的就是接口里的 minutes:
| 选项 | minutes | 什么时候用 |
|---|---|---|
| 永久 | 0 | 作弊、开小号报复。不传 minutes 也是永久。 |
| 1 小时 | 60 | 刷屏、骂人这类小问题,冷静一下就行。 |
| 1 天 | 1440 | 反复犯同一个小毛病。 |
| 7 天 | 10080 | 恶意破坏、偷东西。 |
审计日志
每一次封禁和解封都会往 plugins/LinuxAPP/audit.log 追加一行,一行一次操作,纯文本,直接 tail -f 看:
日志只追加、不自动清理。一个几十人的服务器一年也就几百行,占不了多少地方;真嫌大就手动归档一下,别直接删 —— 出了纠纷它是唯一能拿出来说话的东西。
admin.players 里的人能封人、解封、搜人,还能在下一节的「服务器命令」里跑白名单内的命令。
但 stop / op / give / whitelist 这类写死在黑名单里,改配置也放不开 —— 出问题最多影响玩家,不会把服务器搞挂。
8服务器命令(管理员)
管理员在 App 的管理页会多一个「服务器命令」标签。它不是给玩家看的榜单,而是一个受控的命令执行器: 点一条命令 → 参数自动填进输入框 → 服务器主线程执行 → 回显原样贴回来。
这样做的好处是 ITNOL 的 /linux xxx、LinuxTAB 的 /ltab、/team、/title、
/fp 全都能用,插件以后加新子命令也不用改 App。
linux ban <玩家> [原因]。默认能用哪些命令
白名单在 admin.commands.allow,默认这些根命令:
| 根命令 | 干什么 | 例子 |
|---|---|---|
linux | ITNOL 总入口:封禁、查人、插件状态、审计、日志 | linux plugins、linux lookup Steve |
tempban / unban | 临时封禁 / 解封(linux ban 没有时间参数,定时要用 tempban) | tempban Steve 7d 刷屏 |
banip / unbanip | 封 IP(小号报复时用,注意别把网吧 / 学校网段封了) | banip Steve |
banlist | 看全部封禁记录,分页 | banlist 2 |
ltab / lchest | LinuxTAB 状态与刷新 / 箱子面板 | ltab info |
title / team | 头衔 / 队伍插件 | title help |
fp / fplist / fpr / fpsave / fpreload | 假人插件的增删查、重载、存盘 | fplist |
linuxsync / nalxerapp | 玩家数据同步 / 本插件自己的状态与重载 | nalxerapp status |
要放开别的根命令,往 admin.commands.allow 里加一行,然后 /nalxerapp reload:
永远执行不了的命令
下面这些在代码里写死,改配置也放不开:
| 命令 | 为什么锁死 |
|---|---|
stop restart reload | 一键把服务器关掉或重载,手滑一次全服掉线 |
op deop whitelist permissions | 提权类,等于把服务器送给别人 |
give gamemode gm | 刷物品 / 改模式,会直接毁经济 |
kick plugins version sudo | 踢人、暴露插件列表、代执行任意命令 |
边界与超时
每条命令最多等 5 秒,回显最多 40 行 / 4000 字,超了就截断 —— 防止有人拿 banlist 一口气翻几百页把 App 卡死。
命令在服务器主线程执行,和你在控制台敲是一样的效果;执行记录会写进控制台和 audit.log:
Linux 身份验证(1.4.1)
verify.players 里的账号(默认就是 ITNOL 那个受保护号 Linux582021)登录 App 后,会先弹一个密码框:
「你登陆的是 Linux582021 账号,请通过 Linux 身份验证」。输的是 ITNOL 的验证密码,不是游戏密码。
- 验证之前,除了
/api/me和退出登录,其它接口一律403 need_verify,界面上什么都点不动。 - 验证状态跟着令牌走,重开 App 不用再验一次;令牌过期或换设备要重验。
- 连错 5 次锁 10 分钟,服务端
audit.log里有记录。
su 控制台(1.7.0)
「管理 → 命令」最上面那张卡。验证过 Linux 身份之后,可以在弹窗里输入任意命令,不再受
admin.commands.allow 白名单限制 —— 给东西、传送、改权限、装插件都行。
- 只拦
stop/restart/end:这三条按下去服务器就没了,App 里补救不了。 - 每条都写
audit.log,格式X su 执行 命令。 - 回显里要是「错误 / 找不到 / Unknown command」,App 会直接标红说失败,不会假装成功。
假人逐个开关(1.4.1)
假人列表每个名字下面会标「区块已加载 / 没加载」「会刷怪 / 不刷怪」,右边四个按钮:
- 停载区块 / 加载区块 —— 对应 FakePlayerPlugin 的区块常驻(
keep-loaded-chunks); - 关刷怪 / 开刷怪 —— 对应
spawn.*,假人站着的地方刷不刷怪; - 重生(按新设置重新出现)、移除。
举报能看已处理(1.4.1)
举报子页分「待处理 / 已处理」两个标签,已处理的会显示处理结果(受理 / 驳回)、处理人和备注。
接口是 GET /api/admin/reports?pending=0,返回里带 count / handledCount / pendingCount。
admin.players 的人,手上的令牌还是普通令牌;让他在设置页退出登录再登一次,管理页和命令标签才会出来。
9常见问题
下面这几条覆盖了绝大多数「打不开 / 数据不对」的情况,按顺序试。
/login 密码 确认这个密码是对的。还是不对的话按顺序查:① 玩家在 AuthMe 里注册过没有(
plugins/AuthMe/ 里能不能找到这个 ID);② 大小写有没有打错,ID 是区分大小写的;③ 服务器是不是把 login.require-authme 改成了 false —— 关掉后不再校验密码,只放行在线玩家,离线时怎么登都失败。另外注意限流:一分钟内输错 5 次会返回 429,这时候密码是对的也登不上,等一分钟再试。
https://api.nalxer.top/api/health,里面有一个 capabilities 字段,写着每一项接没接上:coins: false → 服务器没装经济插件,或者装了但插件名不在 data.* 的识别列表里;points: false → 点券插件没接上;team: false / title: false → LinuxTeam / LinuxTitle 没装。 而如果显示的是 0 而不是「—」,说明数据源接上了,只是这个玩家确实没有:新号、或者数据存在别的插件里。
插件已经做了能做的:玩家在线时把金币记进
plugins/LinuxAPP/stats.yml,离线后读这份缓存显示,所以一般不会是 0。但如果那个玩家从没在线过一次、或者换了经济插件导致旧缓存对不上,就只能是 0 —— 这不是 App 的问题。另外新人第一次进服之前没有任何数据,显示 0 是正常的。
① 服务器本机
curl http://127.0.0.1:49282/api/health 不通 → 插件没起来、端口被占,或者 config.yml 的 http.host 被改成了别的网卡,看一眼启动日志;老版本默认是 127.0.0.1:8787(只监听本机),新 jar 会自动改成 0.0.0.0:49282,日志里有一行「已自动改成」;② 本机通、手机浏览器打
http://服务器IP:49282/api/health 不通 → 云服务器安全组 / 系统防火墙没放行 49282,去控制台加一条入站规则(TCP 49282);③ 浏览器能打开、App 连不上 → App 里的地址填错了:忘了端口、多写了
/api、或者末尾多了斜杠。设置页的「测试连接」会直接告诉你通没通、联动接没接上。走
https://api.nalxer.top 域名的话,还要确认 Nginx 反代指向 127.0.0.1:49282、证书没过期(nginx -t,再看 /var/log/nginx/error.log)。
https:// 地址,保存后会要求重新登录一次(旧域名发的令牌不作数)。如果连 App 的登录页都进不去(老地址已经彻底不能用了),在登录页也能找到「修改接口地址」的入口。这个地址是存在手机本地的,卸载重装会清掉,等于回到第一次打开的状态。
另外两种可能:① 你手上的令牌是加进
admin.players 之前登录的,重新登录一次才会带上管理员身份;② 名字打错了 —— 搜索是模糊匹配但区分大小写,试试只打前三个字母。
10安全说明
这一节说清楚:密码去了哪、令牌怎么算的、什么样的部署方式等于没设防。
密码
App 里输入的密码,只在登录那一次请求里出现一次。插件拿到之后立刻交给 AuthMe 校验,校验完就丢掉 —— 不写配置文件、不写日志、不存数据库。所以别人拿到服务器上的文件,也翻不到任何人的密码。
令牌
登录成功后发的是 HMAC 签名令牌,签名的密钥就是 token.secret。令牌里带着玩家名和过期时间,
服务端每次校验都重新算一次签名,对不上就直接 401。默认有效期 7 天(168 小时),改密钥等于让所有令牌立刻作废。
限流
每个 IP 每分钟 5 次登录尝试 / 180 次请求。前者挡撞库,后者挡脚本刷接口。
这两个数字都按 IP 算,所以 Nginx 那一行 X-Real-IP 是硬要求 —— 少了它,全服共用 127.0.0.1 这一个额度。
监听与审计
接口默认监听 0.0.0.0:49282,公网可以直接连(明文 HTTP)。想加密就挂 Nginx 或开插件自带 TLS;
安全组里也可以只放行自己常用的网段。所有封禁 / 解封都写进
plugins/LinuxAPP/audit.log,谁在什么时候封了谁、什么原因、多长时间,一行一条。
http:// 等于把每个人的游戏密码写在明信片上寄出去。
一定要 HTTPS,证书用 Let's Encrypt 免费签就行。安卓 9 以后默认也禁止明文 HTTP,这条路本来就走不通。
login.attempts-per-minute 调大,或者干脆别在公共网络里登。