一套面向运维场景的全栈平台:SvelteKit 5 前端 + TypeScript 后端(Fastify)。
你可以把它理解为一条清晰的数据链路:
用户(Web)→ 鉴权(JWT + Refresh)→ RBAC 权限校验 → 聊天(可选 SSH 执行)→ 审计落库。
说明:仓库已迁移为 TypeScript 后端,不再需要 Python/FastAPI。
在仓库根目录执行一次:
npm install
npm run dev
前端开发地址:
建议直接同时启动前后端(开发体验最好):
npm run dev:all
也可以只启动后端:
npm run dev:server
服务启动后访问:
Windows / PowerShell 说明:
curl 通常是 Invoke-WebRequest 的别名,建议使用:Invoke-RestMethod http://127.0.0.1:8000/healthscripts/dev_server_bg.ps1(可配端口)说明:TypeScript 后端暂不提供 Swagger(后续可按需补充 OpenAPI)。
(更新时间:2025-12-14)
/api/* → http://localhost:8000,减少/消除跨域 OPTIONS/api/auth/me:前端 auth.loadMe() TTL 缓存(300s)+ in-flight 合并;后端增加 Cache-Control: private, max-age=300/api/admin/users:后端分页性能优化(只查询“本页用户”的角色关联,避免全表扫描)/api/dashboard/summary:前端 in-flight 合并;后端短缓存 max-age=8server.fs.allow)并补齐 @types/node(更新时间:2025-12-23)
POST /api/chat/stream),支持逐步推送命令与输出/api/chat/approval/approve|reject,由环境变量控制)(更新时间:2025-12-24)
poweroff/halt/shutdown -h/systemctl poweroff),不进入确认流程(更新时间:2025-12-31)
curl | bash + nohup ... &)QYAI_AGENT_BASE_URL 可留空,默认按目标主机 IP 自动拼接 http://{ip}:{QYAI_AGENT_PORT}(支持 {ip} 占位符)listen_port NOT NULL 相关的落库失败与 UPSERT 字段覆盖问题待办:
ETag/Last-Modified(可选)/api/admin/users 等列表接口补充 Cache-Control(可选,注意按登录态 Vary: Authorization)agent-serve,由对端 Agent 负责工具调用与执行当你使用 MySQL 初始化脚本 mysql_init.sql 时,会自动写入该管理员与 RBAC 初始化数据。
提示:生产环境务必修改密码,并更新根目录 .env 中的 SECRET_KEY / JWT_SECRET 等安全配置。
A-Z a-z 0-9 _)。123456 与历史数据)。如果你希望“管理端创建/重置”也强制使用同样的强密码规则,请在后端统一改为调用强校验函数(见 server/src/routes_admin.ts 中相关注释与校验函数),并同步前端提示文案。
当前 TypeScript 后端仅支持 MySQL(不再提供 SQLite 模式)。
.env 中填写:MYSQL_HOST / MYSQL_PORT / MYSQL_USER / MYSQL_PASSWORD / MYSQL_DATABASE建议:仓库提供 .env.example,请复制一份为 .env 再启动(避免把本地环境变量提交到仓库)。
mysql_init.sql。GET /api/system/status 返回 needs_init=true,前端会弹窗提示你导入项目根目录的 mysql_init.sql。root 用户“为什么不行”):user@host 区分的。很多环境只有 root@localhost,你如果配置 MYSQL_HOST=127.0.0.1,可能会被视为 root@127.0.0.1 从而拒绝登录。
MYSQL_HOST 改为 localhostroot@127.0.0.1 / root@%(不建议生产这么做)aiops)并仅授予目标库权限。排查建议:直接访问 GET /api/system/status?force=true 查看 db.error / db.hint.reason。
当前聊天能力不在 AIOps 内部执行 SSH 命令。
agent-serve。说明:TypeScript 后端目前不提供 Swagger;字段定义以本文档与前端调用(src/lib/api/client.ts + stores)为准。
| 方法 | 端点 | 描述 |
|---|---|---|
| POST | /api/auth/register | 注册 |
| POST | /api/auth/login | 登录 |
| POST | /api/auth/refresh | 刷新 Access Token |
| POST | /api/auth/logout | 登出(刷新令牌可吊销/轮换) |
| GET | /api/auth/me | 获取当前用户信息 |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/hosts | 获取主机列表 |
| GET | /api/hosts/status | 获取主机状态(轮询) |
| GET | /api/hosts/{host_id} | 获取主机详情 |
| POST | /api/hosts | 创建新主机 |
| PUT | /api/hosts/{host_id} | 更新主机信息 |
| DELETE | /api/hosts/{host_id} | 删除主机 |
| POST | /api/hosts/{host_id}/test | 测试 SSH 连接 |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/models | 获取模型列表 |
| POST | /api/models | 创建模型配置(OpenAI-Compatible) |
| PUT | /api/models/{model_id} | 更新模型配置 |
| DELETE | /api/models/{model_id} | 删除模型配置 |
| POST | /api/models/{model_id}/test | 测试连通性与鉴权 |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/chat/sessions | 获取会话列表 |
| POST | /api/chat/sessions | 创建会话 |
| GET | /api/chat/sessions/{session_id} | 获取会话详情 |
| PUT | /api/chat/sessions/{session_id} | 更新会话 |
| DELETE | /api/chat/sessions/{session_id} | 删除会话 |
| GET | /api/chat/sessions/{session_id}/messages | 获取会话消息 |
| POST | /api/chat/send | 发送消息(会话 + 模型路由 + 写库) |
| POST | /api/chat/stream | 流式发送(SSE):逐步推送命令/输出并写库 |
| POST | /api/chat/approval/approve | 审批:确认继续执行(可选功能) |
| POST | /api/chat/approval/reject | 审批:拒绝执行(可选功能) |
| GET | /api/chat/admin/other-sessions?username= | 管理员:按用户名搜索“其他用户会话元数据”(仅定位,不返回消息内容) |
Send API(推荐)示例:
POST /api/chat/send
{
"session_id": 2,
"message": "ping"
}
成功响应示例(字段可能因前端兼容而略有差异):
{
"session_id": 2,
"user_message_id": 123,
"assistant_message_id": 124,
"assistant_content": "..."
}
Stream API(SSE)说明:
POST /api/chat/streamAccept: text/event-streamtext/event-stream,每帧为:data: {"type":...}\n\nthinking → command → output → done(中间会穿插 ping)| 方法 | 端点 | 描述 |
|---|---|---|
| POST | /api/agent/install | 通过 SSH 在目标机安装/重装 kubectl-qyai 并启动 agent-serve(支持 force 重装) |
| POST | /api/agent/apply-model | 下发模型环境变量(export)到目标机,并重启 agent-serve(可 auto/指定 model) |
| POST | /api/agent/apply-path | 下发 KUBEQY_PATH(linux/kubernetes)并重启 agent-serve |
| GET | /api/agent/status | 查询目标机 agent-serve 健康状态与存储状态(安装/健康/模型) |
| GET | /api/agent/logs | 通过 SSH 拉取目标机 install.log / agent-serve.log 等诊断信息 |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/admin/permissions | 获取权限列表 |
| GET | /api/admin/roles | 获取角色列表 |
| POST | /api/admin/roles | 创建角色 |
| PUT | /api/admin/roles/{role_id} | 更新角色 |
| GET | /api/admin/roles/{role}/permissions | 获取角色权限 |
| PUT | /api/admin/roles/{role}/permissions | 设置角色权限 |
| POST | /api/admin/roles/bulk-delete | 批量删除角色 |
| GET | /api/admin/users | 获取用户列表(分页) |
| POST | /api/admin/users | 创建用户 |
| PUT | /api/admin/users/{user_id} | 更新用户 |
| PUT | /api/admin/users/{user_id}/roles | 设置用户角色 |
| POST | /api/admin/users/bulk-delete | 批量删除用户 |
| POST | /api/admin/users/{user_id}/reset-password | 重置密码 |
| GET | /api/admin/hosts | 管理员:获取主机列表(分页) |
| GET | /api/admin/hosts/{host_id}/access | 获取主机访问权限(users/roles) |
| POST | /api/admin/hosts/{host_id}/access/sync | 同步主机访问权限(users/roles) |
| POST | /api/admin/hosts/bulk-delete | 批量删除主机 |
| GET | /api/admin/models | 管理员:获取模型列表(分页) |
| GET | /api/admin/models/{model_id}/access | 获取模型访问权限(users/roles) |
| POST | /api/admin/models/{model_id}/access/sync | 同步模型访问权限(users/roles) |
| POST | /api/admin/models/bulk-delete | 批量删除模型 |
!<主机名|IP> <命令>)本项目已移除“在 AIOps 内部通过 SSH 执行命令/命令审批/本地 allow/deny 策略”。
聊天能力仅负责:选择主机、鉴权、把请求转发到被管主机上的 kubectl-qyai agent-serve。
安全策略(如命令白名单/审批/审计)应由对端 Agent 或外围系统负责。
核心规则:
deny_commands → deny_patterns → allow_*allow_* / deny_commands:按 token 前缀匹配(例如 systemctl status 可匹配 systemctl status nginx --no-pager)deny_patterns:正则(对完整命令字符串匹配,忽略大小写)allow_commands:所有有该主机可见权限的用户可用(建议仅只读/探测)allow_manage_commands:仅当用户对该主机具备 can_manage 或为 owner(或管理员)时允许allow_admin_commands:仅管理员允许提示:当 CHAT_EXEC_UNRESTRICTED=false 时,才会启用该 YAML 校验;修改后重启后端即可生效。
如果你在开发环境将 CHAT_EXEC_UNRESTRICTED=true,则会跳过策略校验(相当于直接给聊天开启远程 Shell,风险很高)。
YAML 注意事项(避免解析失败):
deny_patterns 使用的是 YAML 字符串 + 正则。'\\btail\\s+-n'),可以减少反斜杠转义的坑。\s 这类反斜杠序列需要额外转义成 \\s,否则可能触发 YAML 解析错误。user_id 归属:任意用户(包括管理员)只能查看/删除自己创建的会话与消息。/api/chat/admin/other-sessions?username= 搜索其他用户会话元数据(不返回消息内容,也不提供删除)。在 Chat 页面发送以下内容会触发真实 SSH 执行并写入审计(前提:开启 CHAT_EXEC_ENABLED=true 且你对目标主机有 can_manage 权限):
直接执行(推荐,最稳定):
!主机A whoami!<目标IP> uptime在 主机A 执行 !df -h(消息里包含主机名即可识别)自然语言 → 命令(需要会话绑定可用模型,或请求带 model_id):
在 主机A 查看 /tmp 下有什么文件在 <目标IP> 查看 nginx 进程当消息中无法识别目标主机时:系统会返回“需要你指定目标主机”,并给出你账号可执行主机的脱敏提示列表。
补充:简单问候(例如“你好/hi/hello”)不会触发“请选择主机”,而是作为普通对话处理。
以下规则用于防止误操作造成事故:
poweroff / halt / shutdown -h ... / shutdown --poweroff / systemctl poweroff 等。
rm -rf /、rm -rf /* 等(会直接拒绝)。| 权限代码 | 中文描述 |
|---|---|
| admin:manage_users | 用户与角色管理(创建 / 编辑 / 禁用用户与角色) |
| chat:use | 使用智能运维对话(命令执行 / 问答) |
| hosts:read | 查看主机信息 |
| hosts:write | 新增 / 编辑主机信息 |
| hosts:delete | 删除主机 |
| models:read | 查看大模型配置 |
| models:write | 新增 / 编辑大模型 |
| models:delete | 删除大模型 |