管理控制台概览:人、设备、用量、模型授权、审计一层管理面

DeepSeek Harness 实践:给企业内网 AI 做一个集中管理控制台

员工用 AI 编码工具,管理员管什么?——人、设备、用量、模型授权、审计,一个都不能少。记录集中管理平台控制台的设计、存储改造(心跳写入 11 GB/天 → 13 MB/天)与 329 项自动化验证。

背景:AI 工具普及之后,管理面是空白的

企业内网推广 AI 编码工具(我们用的是 DeepSeek Harness,下称 DSH)之后,很快会遇到几个问题:

  • · 谁在用?哪台机器装的?离职了 key 收了吗?
  • · 每天烧多少 token?哪个部门用得多?该给谁开哪个模型?
  • · 机器上的配置有没有被人改过?怎么证明"这台机器还在管"?

这些问题 DSH 本身不回答——它是给员工用的,不是给管理员用的。所以我们在 DSH 之外做了一个集中管理平台:服务端 + 浏览器控制台 + 员工机上的一个轻量受管插件。整个项目由 AI Agent 在 DSH 里推进完成,本文只讲其中的控制台部分。

概览页

控制台长什么样

六个页签:概览、用量、人员、设备、注册码、模型与配额(审计员还能看到第七个:审计)。技术上刻意"朴素":零第三方依赖的原生 JS(HTML 681 行 / JS 2630 行 / CSS 1549 行),原因是它是管理面——一旦被 XSS 就等于管理员会话被拿走,依赖越少、攻击面越小。

概览:一屏回答"现在什么情况"

人员数、设备数、待审批、24 小时活跃、合规异常、近 1 小时心跳。设备列表直接给出每台机器的合规徽章:合规 / 已漂移 / 版本落后 / 未知——不用点进去逐台查。

设备:注册不用管理员发码

这是整个平台我最满意的一个设计转变。最初版本是"管理员给每个工号签发注册码"——安全,但管理成本随人数线性增长:几百人就是几百次点击加几百次沟通。

现在默认走 SSO 自注册:员工在自己机器上跑一条命令,浏览器点一次确认,机器就挂到他的工号下。管理员只在异常时出现——超过每人工号设备上限的注册会进入待审批队列,在设备页批准或拒绝,注册码降级为例外路径(外包、共享机这类走不了 SSO 的场景)。

设备页

设备列表能看到:来源(SSO 自注册 / 注册码)、合规状态、DSH 版本、patch 指纹、最后心跳。合规判定完全在服务端:插件只上报"我是什么版本、我的 patch 指纹是什么",平台拿它与基线比对——手动改坏一台机器的配置,控制台立刻显示"已漂移"。这条是 M2 的验收点,有自动化测试守着。

用量:四个维度 + 一条底线

按日 / 人 / 部门 / 模型聚合,token 口径是输入 + 输出 + 缓存读 + 缓存写,按会话去重(重放、补发不会让数字翻倍)。有一条容易被忽略的底线:映射不上机器的用量单独统计,绝不混进人均——如果静默丢弃,"未映射机器数为 0"这个验收就永远做不实。

用量页

角色:平台管理员没有审计查询权

五档角色:员工(只看自己)、部门负责人(本部门汇总)、模型管理员、平台管理员、审计员。其中一条是刻意的职责分离,不是遗漏:平台管理员没有审计查询权——不然"自己改、自己查",审计就失效了。

部门负责人只看到本部门

审计:只追加,查询也留痕

审计是只追加的 JSONL:注册、审批、登录失败、越权尝试,连"谁查了审计"本身也记一条。字段自动脱敏,密钥类字段进不了日志。

审计页

存储改造:从 11 GB/天 到 13 MB/天

控制台背后还有一次值得记录的优化。最初实现里,每次设备心跳都会重写整个 `people.json`(人员配置和设备状态混在一个文件里)。500 台设备、15 分钟一跳,推算下来是每天 11.3 GB 的磁盘写入——数据还小的时候感觉不到,到一两百台就会先被写放大卡死。

Phase 0 改造(不换存储介质,仍是 JSON/JSONL,零第三方依赖):

指标

改造前

改造后

心跳写入(500 台)

11,344 MB/天

13.2 MB/天

心跳审计条数

48,000 条/天

约 40 条/天

用量启动(10 万行)

113 ms 全量进内存

0.4 ms(只读索引)

用量聚合(近 7 天)

98 ms 全表扫描

3.8 ms

心跳从"每次重写全表"改成"内存缓冲 + 只追加变化的记录到增量日志";常规心跳不再进审计(审计只留合规跳变、吊销、审批这类需要人看的事件),心跳本身进分钟级聚合指标。这两刀下去,审计从"心跳流水"变回"能被人读完的证据"。

验证:329 项自动化检查

控制台这类东西最容易"看起来能跑,一测就漏"。项目的验证体系分 14 组、329 项,61 秒跑完,其中 E 组是用 headless Chrome 驱动真实浏览器的 52 项 UI 检查(登录、七个页签、四种角色的可见性收敛、点一遍待审批、无外链、无 JS 异常)。

独立代码审查又挖出过一批"只有真跑才暴露"的缺陷——比如批量刷盘因为一个无 await 的 async 函数只生效一次、关停钩子误用 .catch() 导致崩溃退出、用量查询在 UTC 午夜附近会莫名少一天。这些现在都有回归断言守着。

一点方法论

这个项目做完,有三条感受值得记下:

  1. 1. "客户端不是判定方"是底线。合规判定、模型授权、角色收敛全在服务端;插件和浏览器只展示结果。任何把判定逻辑放到客户端的方案,最终都会变成"改个前端就能绕过"。
  2. 2. 压测数字要早做。"数据还小不用优化"和"到 200 台就卡死"之间隔着的,就是一次写放大压测的功夫。
  3. 3. 验证组是真跑,不是看代码。329 项里最值钱的都是端到端的:真起服务、真发 HTTP、真开浏览器。看代码永远觉得是对的。

受管插件(dsh-managed-agent)已开源:<https://github.com/tableau-China/dsh-managed-agent>(MIT,v0.2.1)。

*本文由 AI Agent(DeepSeek Harness)辅助整理,项目的设计、实现与验证过程均在其上完成。*

No comments yet