管理控制台是 MagicFrog 控制面的一块独立管理界面。它位于 console web 部署的 /admin 路径,与工作台不共享任何东西:它有自己独立的登录门、自己的会话存储、自己的准入检查。登录桌面或 web 工作台永远不会顺带获得管理控制台的访问权。
访问模型
准入依据账号的显式角色。账号带有一个 role 字段,取值为闭集:owner 或 member。只有 owner 账号可以使用管理控制台——产品内部不存在任何 grant、邀请或提权路径能把 member 变成 owner,部署上第一个注册的账号也不会隐式成为 owner。owner 账号由部署本身在首次启动时创建(参见自部署)。
强制在服务端执行。每个 /v1/admin/* 端点都会解析调用者身份,并在一个集中式守卫处要求 owner 角色;非 owner 请求一律返回 403,与 UI 发送了什么无关。console 自身的检查只是展示层。
登录门
/admin 入口呈现四种状态之一,均仅由 admin 会话推导:
| 状态 | 出现时机 | 你看到什么 |
|---|---|---|
login |
没有 admin 会话 | admin 登录表单 |
change-password |
账号仍在使用部署时的初始密码 | 强制改密表单;改密成功前会话仅保存在内存中 |
forbidden |
已登录,但角色不是 owner(或会话载荷格式非法) |
明确的无权限页面——绝不静默降级 |
ready |
以 owner 身份登录且没有待完成的改密 |
带六个资源面的 admin 壳 |
admin 会话存放在自己专属的浏览器存储键下,与工作台使用的账号会话相互独立。被篡改或过期的会话载荷会被丢弃并按已登出处理。
强制改密未完成期间,除登录与改密外的所有业务端点都会被服务端以 403 password_change_required 拒绝——这适用于处于该状态的任何账号,而不只是 owner。
托管的资源
admin 壳有六个面。/admin 重定向到第一个面。
| 面 | 展示内容 | 可执行操作 |
|---|---|---|
| Computers | 名称、类型、来源(provisioned / enrolled)、状态 |
代某账号创建一台托管创建(provisioned)的计算机(账号 ID、OS linux/windows、名称、CPU 核数、内存、可选镜像);启动与停止托管创建的计算机;销毁托管创建的计算机;吊销已登记机器 |
| Enrollments | 账号、设备、计算机、名称、状态、egress 授权 | 吊销一条 enroll 登记;授予或吊销 egress grant |
| Plugins | 种类、状态、来源 | 安装(来源加种类 directory/url/registry)、启用、停用、更新、卸载 |
| Runs | 运行时 owner、位置、目标计算机、egress、终态 | 取消一个 run |
| Forms | 会话、状态、创建时间 | 使一个表单过期 |
| Audit log | 操作者、动作、资源、时间、摘要 | 只读,cursor 分页(每页 50 条),可按资源类型过滤 |
enroll 登记上的 egress grant 是作为一个整体写入的:授予时必须同时给出协议(socks5 或 http)、本地端口与远端端口——不完整的 grant 会被服务端拒绝。吊销即收回该授权。
销毁与吊销是两种不同的操作
销毁一台计算机与吊销一台计算机是两个独立动作,各有各的确认,并且从不共用端点或文案:
- 销毁(Destroy) 只适用于托管创建的计算机——由 provider 创建的机器。它销毁的是 provider 托管的机器。
- 吊销(Revoke) 只适用于已登记机器——通过 CLI 登记的真实计算机。它收回登记与该机器的访问权;机器本身、其数据与运行状态都不受影响。吊销登记不会关机,也不会抹掉机器。
UI 把每个动作限定在它适用的行上,服务端也会独立拒绝错配:对已登记机器执行销毁,或对托管创建的计算机执行吊销,都会失败。
审计日志
每一处管理变更都会写入一条审计记录,包含操作者账号、目标资源与时间,并与变更本身在同一个事务里提交。不存在绕过审计链的管理动作。审计面通过 cursor 分页查询这些记录,并可按目标资源类型(computer、enrollment、plugin、run 或 form)过滤。
HTTP API
以下所有端点都要求已认证的 owner 会话;其他调用者一律 403。admin 面通过常规账号端点(POST /v1/account/login、POST /v1/account/change-password、POST /v1/account/logout)完成认证,然后调用 /v1/admin/* 面。
| Method | Path | 用途 |
|---|---|---|
| GET | /v1/admin/audit-log |
查询审计日志(cursor、limit、resourceType) |
| GET | /v1/admin/computers |
列出计算机 |
| POST | /v1/admin/computers |
为账号创建一台托管创建的计算机 |
| POST | /v1/admin/computers/:computerId/start |
启动一台托管创建的计算机 |
| POST | /v1/admin/computers/:computerId/stop |
停止一台托管创建的计算机 |
| POST | /v1/admin/computers/:computerId/destroy |
销毁一台托管创建的计算机 |
| POST | /v1/admin/computers/:computerId/revoke |
吊销一台已登记机器 |
| GET | /v1/admin/enrollments |
列出 enroll 登记 |
| POST | /v1/admin/enrollments/:enrollmentId/revoke |
吊销一条 enroll 登记 |
| PATCH | /v1/admin/enrollments/:enrollmentId/egress-grant |
授予或吊销 egress grant |
| POST | /v1/admin/plugins |
安装插件 |
| GET | /v1/admin/plugins |
列出插件 |
| POST | /v1/admin/plugins/:pluginId/enable |
启用插件 |
| POST | /v1/admin/plugins/:pluginId/disable |
停用插件 |
| POST | /v1/admin/plugins/:pluginId/update |
更新插件 |
| POST | /v1/admin/plugins/:pluginId/uninstall |
卸载插件 |
| GET | /v1/admin/runs |
列出 run |
| POST | /v1/admin/runs/:runId/cancel |
取消一个 run |
| GET | /v1/admin/forms |
列出表单 |
| POST | /v1/admin/forms/:formId/expire |
使一个表单过期 |
部署
管理控制台是 console web 部署的一部分。它在 console 构建时通过 VITE_ADMIN_CONTROL_PLANE_URL 对控制面源进行认证;该变量未设置时,登录门会报告缺失配置,而不是去猜一个源。如果 console 与控制面不在同一个源上,需在服务端用 magicfrog serve --cors <origin> 放行 console 的源。控制面部署见自部署。