Files
orbit/docs/console.md

6.5 KiB
Raw Blame History

Orbit Console · 星轨控制台

Orbit 内置了一个不依赖 Node.js、外部 CDN 或额外文件挂载的管理控制台第一版。静态资源编译进 Orbit 二进制,入口为:

http://127.0.0.1:8080/console/

当前能力

  • 读取 /health/live、/health/ready 和 /version 展示服务、Schema 与工具链状态。
  • 通过数据库中的控制台账号登录;服务端使用 HttpOnly 会话 Cookie 调用现有授权 API,浏览器不接触业务 Token。
  • 总览页直接展示当前查询窗口的任务成功率、任务状态分布、活跃计划、待核查流程和待交付结果;登录和权限信息不会占用统计区域。
  • 展示任务、定时计划、流程实例和结果订阅的最近摘要。
  • 点击任务查看任务详情、执行尝试时间线、最终结果和操作审计摘要。
  • 在具备对应权限时提交任务取消和安全重试,沿用服务端的版本校验、幂等键、队列范围和审计规则。
  • 点击定时计划查看当前版本、规则、下一次触发和触发记录;在具备 schedules:manage 权限时可暂停或恢复计划。
  • 点击流程实例查看当前权威状态、固定版本、步骤状态和事件时间线;步骤读取沿用 workflows:read,事件时间线没有 workflows:audit:read 时会明确显示权限提示。
  • 点击结果订阅查看冻结配置、游标、积压窗口和最近交付历史;页面不展示租约秘密,也不绕过 events:read / events:manage 权限。
  • 在具备 workflows:control 权限时,流程详情可以暂停、恢复或取消;操作原因、control_revision 和幂等键交给服务端做最终校验。
  • NEEDS_REVIEW 流程会显示按步骤类型划分的人工恢复入口:任务核查、步骤结论、继续、步骤重试、PENDING 接续和等待重建;每次提交都要求当前修订、证据引用和显式确认,服务端恢复 API 负责最终门控。
  • 在具备 events:manage 权限时,订阅详情可以启停订阅,并对 EXPIRED 交付追加次数预算后重试;原交付身份、已用次数和事件不会被页面重置。
  • 左侧六个模块是独立的控制台视图,使用 /console/#/overview、#/tasks、#/schedules、#/workflows、#/subscriptions 和 #/retention 定位;切换视图不会把所有模块堆在一张长页面上。
  • “保留策略”只允许单管理员查看和修改命名空间级窗口;修改需要版本号、幂等键和原因并留下审计。预览和只读导出不会删除源数据,未确认交付、未知效果和未结束流程不会成为候选。
  • 任务状态按 10 秒自动刷新;页面只调用服务端授权接口,不把账号密码或业务凭据上传到独立服务,也不读取数据库。
  • 页面使用当前请求方的业务权限;没有权限的模块显示为空或等待权限,不绕过服务端授权。

本地打开

启动 Orbit 后访问 /console/。未登录时,任何控制台业务页面都会跳转到 /console/login;登录成功后进入控制台,登录会话过期或服务端返回 401 时也会重新跳转。当前 Docker 开发环境入口:

http://127.0.0.1:8080/console/

首次使用可以在 orbit-admin bootstrap 时一起创建控制台管理员。这样业务资源、业务凭据和管理员账号在同一个初始化事务中提交:

secret-manager read orbit/console-admin-password | \
  ./bin/orbit-admin bootstrap \
    --application sample-app \
    --namespace default \
    --environment production \
    --queue files \
    --console-username admin \
    --console-display-name 'Orbit 管理员' \
    --console-password-stdin \
    --output .local/production.credentials.json

密码不会进入命令参数、日志或 JSON 文件,初始化失败时资源和账号一起回滚。已经完成业务初始化的环境,也可以由数据库管理员单独创建控制台账号。账号绑定一个已有的命名空间凭据,账号权限就是该凭据的权限;这不会轮换或输出业务 Token。推荐从私有凭据文件读取命名空间和凭据标识,并从标准输入交付密码:

./bin/orbit-admin console-user create \
  --credential-file .local/local.credentials.json \
  --username operator \
  --display-name 'Orbit 管理员' \
  --password-stdin

命令会把密码写成 bcrypt 哈希,只输出账号的脱敏信息。生产环境应通过受保护的密钥管道提供标准输入;不要把密码写进命令历史、镜像或仓库。账号创建后直接打开控制台,用账号密码登录。

页面的 API 地址默认自动取当前访问地址的 origin,不需要手填。部署到域名后,直接访问 https://orbit.example.com/console/,页面会自动请求同一域名下的服务端接口;生产建议用反向代理让控制台和 API 保持同源。页面不再要求填写队列 ID、Bearer Token,也不再选择凭据 JSON。

如果未来把前端静态资源和服务端拆成不同域名,需要额外设计 API 基地址、CORS、Cookie SameSite/Domain 和 CSRF 防护,不能只替换一个 URL。当前内置控制台优先保证同源部署的安全边界。

ORBIT_CONSOLE_QUEUE_ID 只作为单一默认队列的展示和查询范围配置:

export ORBIT_CONSOLE_QUEUE_ID='queue_xxx'

GET /console/config 只对已登录会话返回这个非敏感的默认队列 ID。健康检查和版本探针保持公开,业务 API、控制台 HTML、配置和所有业务模块均受登录会话与原有权限双重保护。

安全边界

控制台不直接访问数据库,也不绕过业务凭据权限。登录会话只保存令牌摘要,服务端每次请求都会校验账号、会话、命名空间、应用启停和凭据权限。取消和人工重试会使用当前任务版本生成一次性幂等键;网络结果不明时不要重复点击,应使用原始操作身份通过 API/SDK 核对。NEEDS_REVIEW 任务仍须使用带证据的核查 API/SDK 完成最终裁决。控制台账号绑定业务凭据,不自动获得跨命名空间权限;不支持跨命名空间聚合,不代替平台的权限与审计 API。

不能把业务 Token 长期放进浏览器本地存储,也不能让控制台直连 MySQL。计划版本发布、跨命名空间管理身份和其他高风险写操作仍应通过受保护 API/SDK 设计后再接入页面。流程恢复入口只调用已经定义的恢复 API,不自动猜测结果、不替操作者补齐证据,也不把冲突重试成“最新版本”。