Kaneo 2.48.0 常用 API 与运维命令详解

Kaneo 2.48.0 常用 API 与运维命令详解:API Key 与 Bearer 认证、限流实测、项目/任务/评论/标签/工时/搜索全链路接口、错误码表与备份恢复运维命令。

KaneoKaneo项目管理看板Node.jsPostgreSQL2026/10/28

Kaneo 2.48.0 常用 API 与运维命令详解

目标:给 Kaneo 2.48.0 的 REST API 一份可直接照抄的实操清单——认证怎么拿、工作区/项目/任务/评论/标签/工时/搜索这些主链路怎么调、错误码怎么读、限流怎么绕,最后附日常运维命令(健康检查、备份、恢复、日志)。全部请求与响应于 2026-10-28 在 Kaneo 2.48.0 真实实例上实测照抄。

一、环境信息

项目值
操作系统Ubuntu 22.04.5 LTS
Kaneo2.48.0
服务地址http://192.168.1.71:8142(应用内部监听 5173)
API 前缀http://192.168.1.71:8142/api
数据库PostgreSQL 16,库 kaneo
管理员账号root@kaneo.local / q1w2e3r4
实测工作区 IDLhWKEttqzjppUFHLP6Wxe81KMCstUF5B(Kaneo Lab)

下文所有 ID 均来自实测实例,读者照抄时替换成自己环境的值即可。

二、认证:API Key 与 Bearer

Kaneo 的 API 有两类凭据:API Key(脚本/集成用)和会话令牌(浏览器/CLI 用)。两者都通过 Authorization: Bearer 头传递。

2.1 创建 API Key

在 Web 界面 Settings → Account → API Keys → Create 创建,完整密钥只在创建时显示一次(实测生成示例):

AWLeXaDAKWshZXwEzlpRKqcxmElZdeIgGPToPurZzmEXXaEWULecPFDozIEytXlQ

拿到后存入环境变量,不要写进脚本明文:

export KANEO_API_KEY='<你的密钥>'

2.2 用 API Key 访问

curl --fail-with-body -s \
  -H "Authorization: Bearer $KANEO_API_KEY" \
  http://192.168.1.71:8142/api/user/me

实测回显:

{"id":"DWV4ls5Iqeaw1nOcABrbVeKARJd4jpW3","name":"root","email":"root@kaneo.local","image":null,"role":"admin","managedProfileFields":[]}
HTTP 200

2.3 用邮箱密码换会话令牌

curl -s -X POST http://192.168.1.71:8142/api/auth/sign-in/email \
  -H 'Content-Type: application/json' \
  -d '{"email":"root@kaneo.local","password":"q1w2e3r4"}'

实测回显:

{"redirect":false,"token":"DlEg1hdL8SLKPMXRABgmY4QNM80ZySKv","user":{"name":"root","email":"root@kaneo.local","emailVerified":false,"image":null,"createdAt":"2026-10-27T16:15:41.029Z","updatedAt":"2026-10-27T16:15:41.047Z","isAnonymous":false,"role":"admin","banned":false,"banReason":null,"banExpires":null,"locale":null,"id":"DWV4ls5Iqeaw1nOcABrbVeKARJd4jpW3"}}

返回的 token 可直接作为 Bearer 值使用。注意:会话令牌不受 API Key 的限流约束,脚本压测时用会话令牌更稳,但会话会过期、不适合长期集成。

2.4 限流规则

凭据类型限额窗口
API Key100 次 / 60 秒以最近一次成功请求重新计时
会话令牌 / 设备授权令牌不计入限额—

窗口是「滚动」的:只要持续有成功请求,60 秒窗口一直往后推。实测超限响应头与正文:

{"message":"Rate limit exceeded","code":"RATE_LIMITED"}

HTTP 状态码 429。若脚本以 1 秒间隔长期运行,会稳定在 100 次后被卡住——这是滚动窗口的典型表现,正确做法是降频或改用会话令牌。

三、基础探测:先确认「谁在这、我能干什么」

3.1 实例状态(无需认证)

curl -s http://192.168.1.71:8142/api/instance/status

实测回显:

{"hasUsers":true,"hasAdmin":true}
HTTP 200

hasUsers/hasAdmin 用于首次部署后判断「是否需要创建管理员」,也是监控探活最轻量的端点。

3.2 健康检查

curl -s -o /dev/null -w '%{http_code}\n' http://192.168.1.71:8142/api/health

实测返回 200。编排里的 healthcheck 就是打这个端点(间隔 30 秒、超时 5 秒、启动宽限 60 秒);自建 systemd 或负载均衡探活建议用同一路径,避免「应用活着但数据库断了」被误判为健康。

3.3 能力开关

curl -s http://192.168.1.71:8142/api/config

实测回显(节选):

{"isCloud":false,"disableRegistration":true,"disablePasswordRegistration":true,"disableEmailOtpSignIn":true,"disableWorkspaceCreation":true,"isDemoMode":false,"hasSmtp":true,"hasImageUploads":true,"hasGithubSignIn":false,...}
HTTP 200

集成脚本应先用它决定「能不能自助注册」「能不能上传附件」,而不是硬编码假设。

3.4 当前身份与工作区权限

curl -s -H "Authorization: Bearer $KANEO_API_KEY" http://192.168.1.71:8142/api/workspace
curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  http://192.168.1.71:8142/api/workspace/LhWKEttqzjppUFHLP6Wxe81KMCstUF5B/capabilities

实测回显:

[{"id":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B","name":"Kaneo Lab","slug":"kaneo-lab","logo":null,"description":null,"createdAt":"2026-10-27T16:16:50.673Z","role":"owner"}]
HTTP 200
{"manageProjects":true,"createProjects":true,"updateProjects":true,"shareProjects":true,"deleteProjects":true,"updateTasks":true,"createTasks":true,"deleteTasks":true,"assignTasks":true,"createLabels":true,"updateLabels":true,"deleteLabels":true,"manageWorkspace":true,"manageSettings":true,"deleteWorkspace":true,"inviteUsers":true,"manageTeam":true,"updateMembers":true,"removeMembers":true}
HTTP 200

role 与 capabilities 是两回事:role=owner 是成员角色,capabilities 是细粒度能力位。集成脚本做权限预检应读 capabilities,而不是只看 role。

四、项目与看板结构

4.1 列出工作区内的项目

curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  'http://192.168.1.71:8142/api/project?workspaceId=LhWKEttqzjppUFHLP6Wxe81KMCstUF5B'

实测回显:

[{"id":"pc9c5fit4wxzjgk4kybyve6e","workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B","slug":"website-redesign","icon":"rocket","name":"网站改版","description":null,"createdAt":"2026-10-27T16:17:08.210Z","isPublic":false,"archivedAt":null,"lastTaskNumber":1,"position":0,"backgroundVersion":null,"statistics":{"totalTasks":1,"completionPercentage":0,"dueDate":null},"archivedTasks":[],"plannedTasks":[],"columns":[]}]
HTTP 200

statistics.completionPercentage 可直接用于进度看板;columns 在此端点恒为空(官方响应代码里有注释说明「看板结构请用 GET /task/tasks/{id}」)。

4.2 创建项目

curl -s -X POST http://192.168.1.71:8142/api/project \
  -H "Authorization: Bearer $KANEO_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"name":"API 实测项目","slug":"api-demo","icon":"zap","workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B"}'

实测回显:

{"id":"axlf0q84fyh2cc2ifwp61o2i","workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B","slug":"api-demo","icon":"zap","name":"API 实测项目","description":null,"createdAt":"2026-10-27T16:32:38.968Z","isPublic":false,"archivedAt":null,"lastTaskNumber":0,"position":1,"backgroundVersion":null}
HTTP 200

4.3 读取项目的列(看板阶段)

curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  http://192.168.1.71:8142/api/column/pc9c5fit4wxzjgk4kybyve6e

实测回显:

[{"id":"l3xiaxeazt1gytkz5yot7z9a","projectId":"pc9c5fit4wxzjgk4kybyve6e","name":"To Do","slug":"to-do","position":0,"icon":null,"color":null,"isFinal":false,"createdAt":"2026-10-27T16:17:08.210Z","updatedAt":"2026-10-27T16:17:08.210Z"},{"id":"aggb08i0egsgmx4ttpmimu7n","projectId":"pc9c5fit4wxzjgk4kybyve6e","name":"In Progress","slug":"in-progress","position":1,...},{"id":"pfn3hrkwqr2lr2u4q9stw2u3","projectId":"pc9c5fit4wxzjgk4kybyve6e","name":"In Review","slug":"in-review","position":2,...},{"id":"tf7xc0qdbw1xqd9wmovn2wbd","projectId":"pc9c5fit4wxzjgk4kybyve6e","name":"Done","slug":"done","position":3,"isFinal":true,...}]
HTTP 200

isFinal:true 的列(Done)是「完成态」标记,脚本统计完成率时按它判定,而不是按列名硬匹配。

五、任务主链路

5.1 读取看板(任务按列分桶)

curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  'http://192.168.1.71:8142/api/task/tasks/axlf0q84fyh2cc2ifwp61o2i?page=1&limit=50'

实测回显(结构节选):

{"data":{"id":"axlf0q84fyh2cc2ifwp61o2i","name":"API 实测项目","slug":"api-demo","columns":[{"id":"to-do","name":"To Do","position":0,"tasks":[]},{"id":"in-progress","name":"In Progress","position":1,"tasks":[{"id":"sl60h6tl8sags2wkd4rxc3ix","title":"API 文档编写","number":1,"priority":"urgent","status":"in-progress","labels":[{"id":"ycbfqauv5qk6n2t6bk1m6lvj","name":"API","color":"#2563eb"}],"subtaskCounts":{"completed":0,"total":0}}]},{"id":"in-review","name":"In Review","position":2,"tasks":[]},{"id":"done","name":"Done","position":3,"tasks":[]}],"archivedTasks":[],"plannedTasks":[]},"pagination":{"total":1,"page":1,"pageSize":1,"totalPages":1,"relatedPage":1,"relatedPageSize":100,"relatedTotalPages":1}}
HTTP 200

这个端点返回的是「看板结构」,不是扁平任务数组——分页依据是 pagination.totalPages。脚本若按扁平数组解析会直接报错,这是官方文档特别提示的坑。

5.2 创建任务

curl -s -X POST http://192.168.1.71:8142/api/task/axlf0q84fyh2cc2ifwp61o2i \
  -H "Authorization: Bearer $KANEO_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"title":"API 文档编写","description":"通过 REST API 创建的任务","priority":"medium","status":"to-do"}'

实测回显:

{"id":"sl60h6tl8sags2wkd4rxc3ix","projectId":"axlf0q84fyh2cc2ifwp61o2i","position":1,"number":1,"userId":null,"title":"API 文档编写","description":"通过 REST API 创建的任务","status":"to-do","columnId":"bodw29z051gmz5vlnabhqnd5","priority":"medium","startDate":null,"dueDate":null,"recurrence":null,"createdAt":"2026-10-27T16:32:43.913Z","updatedAt":"2026-10-27T16:32:43.913Z"}
HTTP 200

number:1 是项目内的任务编号(用于 WEB-1 这类短 ID),由服务端递增维护,不要自己算。

5.3 读取单个任务

curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  http://192.168.1.71:8142/api/task/sl60h6tl8sags2wkd4rxc3ix

实测回显:

{"id":"sl60h6tl8sags2wkd4rxc3ix","title":"API 文档编写","number":1,"description":"通过 REST API 创建的任务","status":"to-do","columnId":"bodw29z051gmz5vlnabhqnd5","priority":"medium","startDate":null,"dueDate":null,"recurrence":null,"position":1,"createdAt":"2026-10-27T16:32:43.913Z","userId":null,"assigneeName":null,"assigneeId":null,"projectId":"axlf0q84fyh2cc2ifwp61o2i","workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B"}
HTTP 200

列表接口会把长描述「延迟加载」(descriptionDeferred),需要完整正文时按此端点单取。

5.4 局部更新:优先用专用端点

通用 PUT /api/task/{id} 是全量更新,缺字段直接 400。实测漏传 title/projectId/position 的回显:

{"message":"title: Invalid input: expected string, received undefined","code":"VALIDATION_ERROR","issues":[{"path":"body.title","message":"Invalid input: expected string, received undefined"},{"path":"body.projectId","message":"Invalid input: expected string, received undefined"},{"path":"body.position","message":"Invalid input: expected number, received undefined"}]}
HTTP 400

正确姿势是用只改一个属性的专用端点:

curl -s -X PUT http://192.168.1.71:8142/api/task/status/sl60h6tl8sags2wkd4rxc3ix \
  -H "Authorization: Bearer $KANEO_API_KEY" -H 'Content-Type: application/json' \
  -d '{"status":"in-progress"}'

curl -s -X PUT http://192.168.1.71:8142/api/task/priority/sl60h6tl8sags2wkd4rxc3ix \
  -H "Authorization: Bearer $KANEO_API_KEY" -H 'Content-Type: application/json' \
  -d '{"priority":"urgent"}'

两次调用都在活动流里留下记录(见 5.6),说明状态与优先级变更会被审计。

5.5 删除任务

curl -s -X DELETE http://192.168.1.71:8142/api/task/<taskId> \
  -H "Authorization: Bearer $KANEO_API_KEY"

实测返回 200 且任务从看板消失。删除是软删(活动流保留历史),恢复需管理员在数据库侧处理,脚本删除前建议先导出。

5.6 评论与活动流

curl -s -X POST http://192.168.1.71:8142/api/activity/comment \
  -H "Authorization: Bearer $KANEO_API_KEY" -H 'Content-Type: application/json' \
  -d '{"taskId":"sl60h6tl8sags2wkd4rxc3ix","content":"这是一条通过 API 写入的评论"}'

实测回显:

{"id":"x556o60t5e8qst5xmjj04l8l","taskId":"sl60h6tl8sags2wkd4rxc3ix","type":"comment","createdAt":"2026-10-27T16:32:50.351Z","updatedAt":"2026-10-27T16:32:50.351Z","userId":"DWV4ls5Iqeaw1nOcABrbVeKARJd4jpW3","content":"这是一条通过 API 写入的评论","eventData":null,"externalUserName":null,"externalUserAvatar":null,"externalSource":null,"externalUrl":null}
HTTP 200
curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  http://192.168.1.71:8142/api/activity/sl60h6tl8sags2wkd4rxc3ix

实测回显(四条按时间倒序):

[{"id":"tf5c80mme5aqtnq8zhym8o0f","taskId":"sl60h6tl8sags2wkd4rxc3ix","type":"priority_changed","createdAt":"2026-10-27T16:32:57.130Z",...,"eventData":{"newPriority":"urgent","oldPriority":"medium"}},{"id":"mh6w586hb9bxfd1vopm0a5yx","type":"status_changed",...,"eventData":{"newStatus":"in-progress","oldStatus":"to-do"}},{"id":"x556o60t5e8qst5xmjj04l8l","type":"comment",...,"content":"这是一条通过 API 写入的评论"},{"id":"ujxo2w9msdrjsg0gnsdnjjw7","type":"created",...,"eventData":{}}]
HTTP 200

活动流的 type 字段(created/status_changed/priority_changed/comment)是做自动化触发的抓手:轮询该端点 + 比对 createdAt 即可实现「状态变更通知」。

六、标签与工时

6.1 标签:先建再挂

curl -s -X POST http://192.168.1.71:8142/api/label \
  -H "Authorization: Bearer $KANEO_API_KEY" -H 'Content-Type: application/json' \
  -d '{"name":"API","color":"#2563eb","workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B"}'

实测回显:

{"id":"tj6e04hlkbu6jbs0mwh49mbf","name":"API","color":"#2563eb","createdAt":"2026-10-27T16:35:13.030Z","updatedAt":"2026-10-27T16:35:13.030Z","deletionStartedAt":null,"taskId":null,"workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B"}
HTTP 200

挂到任务上(注意:PUT /api/label/{labelId}/task,标签 ID 在路径、任务 ID 在体):

curl -s -X PUT http://192.168.1.71:8142/api/label/tj6e04hlkbu6jbs0mwh49mbf/task \
  -H "Authorization: Bearer $KANEO_API_KEY" -H 'Content-Type: application/json' \
  -d '{"taskId":"sl60h6tl8sags2wkd4rxc3ix"}'

实测回显中 taskId 已绑定,并生成了一条新的标签记录:

{"id":"ycbfqauv5qk6n2t6bk1m6lvj","name":"API","color":"#2563eb",...,"taskId":"sl60h6tl8sags2wkd4rxc3ix","workspaceId":"LhWKEttqzjppUFHLP6Wxe81KMCstUF5B"}
HTTP 200

这里有个容易误解的语义:挂标签会产生「任务级副本」(新 id),不是把工作区标签对象直接引用过来。查询某任务的标签用 GET /api/label/task/{taskId},实测返回该副本:

[{"id":"ycbfqauv5qk6n2t6bk1m6lvj","name":"API","color":"#2563eb",...,"taskId":"sl60h6tl8sags2wkd4rxc3ix"}]
HTTP 200

6.2 工时记录

curl -s -X POST http://192.168.1.71:8142/api/time-entry \
  -H "Authorization: Bearer $KANEO_API_KEY" -H 'Content-Type: application/json' \
  -d '{"taskId":"sl60h6tl8sags2wkd4rxc3ix","description":"API 文档实测","startTime":"2026-10-27T09:00:00.000Z","endTime":"2026-10-27T10:30:00.000Z"}'

实测回显:

{"id":"hp4qfchr4onfo379izqnn8kv","taskId":"sl60h6tl8sags2wkd4rxc3ix","userId":"DWV4ls5Iqeaw1nOcABrbVeKARJd4jpW3","description":"API 文档实测","startTime":"2026-10-27T09:00:00.000Z","endTime":"2026-10-27T10:30:00.000Z","duration":5400,"createdAt":"2026-10-27T16:35:13.056Z","updatedAt":"2026-10-27T16:35:13.056Z"}
HTTP 200

duration:5400 是服务端按起止时间算出的秒数(1.5 小时),不需要客户端传。endTime 省略即开启一个「进行中」的计时条目。时间必须是合法 ISO 8601(服务端会校验日历合法性,2026-02-31 这类日期会被拒)。

七、全局搜索

curl -s -H "Authorization: Bearer $KANEO_API_KEY" \
  'http://192.168.1.71:8142/api/search?q=API&workspaceId=LhWKEttqzjppUFHLP6Wxe81KMCstUF5B'

实测回显(截取前两条 + 统计):

{"results":[{"id":"sl60h6tl8sags2wkd4rxc3ix","type":"task","title":"API 文档编写","relevanceScore":3,"taskNumber":1,"priority":"urgent","status":"in-progress"},{"id":"axlf0q84fyh2cc2ifwp61o2i","type":"project","title":"API 实测项目","relevanceScore":3},{"id":"x556o60t5e8qst5xmjj04l8l","type":"comment","title":"Comment on API 文档编写","relevanceScore":2},{"id":"tf5c80mme5aqtnq8zhym8o0f","type":"activity","title":"priority_changed on API 文档编写","relevanceScore":1},{"id":"mh6w586hb9bxfd1vopm0a5yx","type":"activity","title":"status_changed ...","relevanceScore":1},{"id":"ujxo2w9msdrjsg0gnsdnjjw7","type":"activity","title":"created on API 文档编写","relevanceScore":1}],"totalCount":6,"searchQuery":"API"}
HTTP 200

可传 q、type(限定任务/项目/评论/活动)、workspaceId、projectId、limit。结果按 relevanceScore 降序,type 字段决定后续该用哪个端点取详情。

💡 技术拓展:REST 轮询 vs Webhook vs MCP

集成方式实时性复杂度典型用途
REST 轮询(本文)秒级,受限于轮询间隔低定时同步、报表生成
集成 Webhook(GitHub/Slack/Gitea)准实时中代码提交联动任务状态
MCP 服务(/api/mcp)调用即时中让 AI 助手直接读写任务
Kaneo 同时提供三者。批处理与报表走 REST;事件驱动走 Webhook;对话式操作走 MCP。三者共用同一套权限模型,能力边界一致。

八、错误码与排障

HTTPcode语义处置
400VALIDATION_ERROR请求体字段缺失或类型错(issues 数组给出行路径)按 issues[].path 逐项补齐
400—搜索参数非法或工作区无法确定带上 workspaceId
403—缺少该资源类型的读权限核对 capabilities 与项目访问权
404—工作区/项目/任务不存在核对 ID(不要用 slug 代替 ID)
429RATE_LIMITEDAPI Key 超出 100 次/60 秒降频或换会话令牌

8.1 排查清单

  1. 401 全无响应体:检查 Authorization 头是否带 Bearer 前缀(漏空格是最常见错误)。
  2. 400 VALIDATION_ERROR:直接读 issues[].path,它精确到 body.title 这种字段级。
  3. 403:先用 GET /api/workspace/{id}/capabilities 确认自己的位,再看是否该资源在「项目访问限制」名单里。
  4. 429:确认是否用的是 API Key;连续成功的请求会滚动延长窗口。

九、日常运维命令

9.1 服务状态与资源占用

curl -s -o /dev/null -w '%{http_code} %{time_total}s\n' http://192.168.1.71:8142/api/health
systemctl is-active kaneo
ps -eo pid,rss,etime,comm --sort=-rss | head -4

实测回显:

200 0.0012s
active
    PID     RSS ELAPSED COMMAND
   3009  203876   15:57 MainThread
      1     984   15:59 kaneo-entrypoin
   3034    6464   15:54 nginx

判读要点:健康检查在 1 毫秒量级返回 200 说明应用层正常;Node.js 主进程 RSS 约 200 MB 是 2.48.0 的常态水位,若持续上涨到 500 MB 以上要怀疑内存泄漏(多为自定义插件持有大对象);数据库主进程 postgres 约 26 MB,随连接数增长。

9.2 日志

journalctl -u kaneo -n 12 --no-pager

启动完成段的实测回显:

✓ Registered plugin: Slack
✓ Registered plugin: Mattermost
✓ Registered plugin: Discord
✓ Registered plugin: Generic Webhook
✓ Registered plugin: Telegram
GitHub App not configured, skipping webhook handlers
✓ Plugin event subscriptions initialized
✅ Plugins initialized
⏰ Scheduler started (deferred integration edits every minute, reminders every 5 minutes, seat reconciliation and trial reminders hourly)
📡 WebSockets Initialized using: "InMemoryBroadcastAdapter"
⚡ API is running at http://192.168.1.71:8142/api
API is ready

排障顺序:先看应用日志有无 500 栈,再看数据库日志(/var/log/postgresql/postgresql-16-main.log)有无连接拒绝。InMemoryBroadcastAdapter 说明当前是单机内存广播,若日志里出现 too many connections,对应调小 DATABASE_POOL_MAX。

9.3 备份

PGPASSWORD=q1w2e3r4 pg_dump -h 127.0.0.1 -p 5432 -U kaneo -d kaneo \
  --no-owner --clean > /opt/backup/kaneo-$(date +%F-%H%M).sql
ls -lh /opt/backup/ | tail -2

实测产物为纯 SQL 文本,初始数据量下约 105 KB:

-rw-r--r-- 1 root root 105K Oct 28 00:56 kaneo-2026-10-28-0056.sql

备份必须与 AUTH_SECRET 一起保存:只恢复数据库而不恢复原密钥,会全员登出(见同专栏配置篇的 8.2)。

9.4 恢复

psql -h 127.0.0.1 -p 5432 -U kaneo -d kaneo < /opt/backup/kaneo-2026-10-28-0056.sql
curl -s -o /dev/null -w '%{http_code}\n' http://192.168.1.71:8142/api/health

先恢复、后探活。恢复后建议抽查一个任务 ID 是否可读(GET /api/task/{id}),确认数据真的回来了,而不是只看 psql 无报错。--clean 生成的脚本会先 DROP 再 CREATE,恢复期间应用应停写。

9.5 版本核对

curl -s http://192.168.1.71:8142/api/instance/status
node -v

实测回显:

{"hasUsers":true,"hasAdmin":true}
v24.22.1

/api/instance/status 只回答「实例是否已完成初始化」,不返回版本号;版本以部署目录里的 package.json 或前端页脚为准,再与官方发布标签交叉核对,避免「文档写 2.48 而实际跑的是旧版本」这种静默偏差。

十、参考链接