访问控制
一条流水线,
从题目到解答。
管理面只做三件事:看题目解出来没有、看解题池为什么停、看账本与抓到的账号。没有用户体系——一个运维口令就是真实的运维模型,口令文件不存在时管理监听器拒绝启动。
127.0.0.1;放到网关上必须显式 --admin-bind,且 --admin-allowed-host 必须与入口 hostname 逐字一致,否则隧道放行后仍会被 Host 白名单 403。准入
准入许可
一把密钥 = 一条准入许可。用它上报的一切(哪些 IP、抓到了什么、抓到哪些账号)都归到它名下,按密钥聚类,不再按机器号。
载荷直连服务器时出示密钥认证,服务端在每条记录上盖 key_id 与 user(名字)。所以这里读的就是"这条许可干了什么":来源 IP、抓包结果、抓到的账号,以及密钥本身(要值必须点「查看密钥」,那次访问会写进审计日志)。
只有盖了 key_id 的记录才成行:加字段之前写下的旧记录没有 key_id,归不到任何许可名下,不在这张表里(账本里照旧留着)。
正在载入…
已签发的许可
| 使用者 | 密钥 id | 创建时间 | 来源 IP | 记录 | 账号 | 最近活动 | 操作 |
|---|
还没有准入许可
在上面填一个名字(座位 / 学生,它会成为账本里的归档名),点「生成密钥」,然后把明文录进客户机:curl -fsSL <服务端>/i.sh | sudo sh -s -- --key <KEY>
「来源 IP」有三位:客户端上报的座位地址(lan_ip)、隧道边缘报的公网地址(edge_ip)、连接对端(client_ip,隧道后所有机器共用同一个 connector)。这张表由服务端在账本尾部上聚合而成——页面拿到的是每条许可的几个数字,不是那批记录。 删除旧账本用 (按保留天数删旧日文件,只增不减的账本要定期回收)。
总览
概览
题库、解题池、账本与接入面的当前状态一次读齐。数值来自服务端,有变化时 5 秒一拍,长时间没变化自动降频。
正在读取概览…
解题池
| 字段 | 值 |
|---|
解题池还没往状态表写过任何东西——worker 未启动,或 runtime/questions.stop 在位。
「待解」= pending + running + retry 的服务端口径;「题库总数」按状态计数求和,去重口径是题目内容指纹。账本天数即 runtime/reports/ledger-*.jsonl 的文件数,只增不减;本页不做回收——清理走 POST /api/reports/prune(keep_days)或服务器上的 tools/report_tail.py --prune。
题库
题目与解答
优先预览题面,快速查看答案与理由,点击「查看详情」阅读完整题目、来源与处理记录。
解题池
自动刷新:2 秒,空闲降到 10 秒正在读取解题池状态…
阻塞配置
AI 配置被判为无效(HTTP 400/401/403/404/422 或配置被改)时,服务端把配置摘要写进 ai_blocked_config,解题池随即停摆。先修好 private/question-ai.json(endpoint / model / api_key),再点「解除阻塞」——顺序反了,下一轮会按同一份配置再阻塞一次。
状态字段(ai_status / ingest_status / 租约回收 / 重排)
| 字段 | 值 |
|---|
状态表是空的:worker 进程没跑过,或本轮什么都没写。
「解除阻塞」会清 ai_blocked_config 与 ai_pause_until 两个状态键,操作会写进 fleet.log(含操作方 peer)。停止开关只是一个文件:runtime/questions.stop 在则 worker 下一轮自退,删掉则恢复,已入队的题目留在队列里。
按完整题目内容去重;已解答直接复用。AI 解答为生成结果,待复核题目不会标记为已解答。题面正文先净化再进沙箱 iframe 渲染,从不进入本页文档(所以样式与本站不同是正常的)。列表本身不带题面:它只有指纹、状态与计数,题面按屏批量取回——一屏一次请求,而不是每题一次。
每页 50 题,按入库时间倒序。管理面不能写答案:只能重试、优先重排、删除——否则它会变成一条绕过解题契约的捷径。删除后客户端再次上报可能重新入库;原始抓包与图片文件保留。