feat: Agent CLI 与终端审计回放全面优化

- Agent CLI: 多轮对话、SSH 长连接、流式推理、Evolver 按用户隔离、历史侧栏
- 终端审计: 回放播放器、命令书签、筛选分页导出、命令输出统计、录制落盘修复
- 修复 session_commands 表迁移、Kill 竞态导致录制丢失、无录制会话回放提示
- 审计历史页只读(移除删除),移除回放弹框录制搜索
This commit is contained in:
Logan committed 2026-07-01 12:13:53 +08:00
1 parent 9a3dd304f7
commit 1acb0c49af
81 files changed
+3916 -1655

No files matched your search

+49 -38
View File
@@ -10,7 +10,7 @@
**AIOps** 是一个企业级云原生智能运维平台,聚焦三大核心能力:
1. **资产管理** — 服务器 CRUD、批量导入、WebShell、云账号/域名/账单、Kubernetes 多集群。
2. **监控告警** — Agent 采集 `/proc` 指标、告警引擎(阈值/离线检测)、告警中心、监控大屏、Prometheus/Zabbix/SNMP/站点拨测。
2. **监控告警** — Agent 采集 `/proc` 指标、告警引擎(阈值/离线/日志告警)、告警中心、监控大屏、Prometheus/Zabbix/SNMP/站点拨测/中间件监控。
3. **自动化运维 / AIOps** — CI/CD 流水线、定时任务/脚本库、Go-native SSH 远程执行、资源申请审批、AI 智能助手、Agent CLI(ReAct + Evolver)。
项目采用前后端分离架构,但通过 `go:embed` 支持将前端构建产物嵌入后端二进制,实现单文件 / 单容器部署。
@@ -35,7 +35,30 @@
## 2. 技术栈与关键配置
### 2.1 后端
### 2.1 关键配置文件
项目不存在 `pyproject.toml`、`Cargo.toml`、`pom.xml` 等配置。核心配置文件为:
| 文件 | 说明 |
|------|------|
| `backend/go.mod` | 后端 Go 模块定义,模块名 `ezops`,Go 1.24.0 |
| `agent/go.mod` | Agent 独立模块,模块名 `ezops/agent`,Go 1.22(与后端共用 1.24 工具链) |
| `frontend/package.json` | 前端 npm 依赖与脚本 |
| `frontend/vite.config.ts` | Vite 配置:端口 5173,代理 `/api`、`/ws`、`/health`、`/version`、`/agent` 到 `localhost:8080` |
| `frontend/eslint.config.js` | ESLint flat config,禁止显式 `any` |
| `frontend/tailwind.config.js` | CSS 变量主题体系 |
| `config.yaml` | 本地开发默认配置(SQLite + redka,端口 8080) |
| `docker-compose.yml` | 3 容器:MySQL 8.0 + Redis 7-alpine + AIOps(:8080) |
| `docker-compose.k8s.yml` | 单应用容器 + 外部 DB |
| `Dockerfile.embed` | 4-stage Embed 镜像(前端→后端→Agent→Runtime),Compose 与 K8s 共用 |
| `.env.example` | Docker Compose 环境变量示例 |
| `deploy/kubernetes/` | K8s 清单:`devops` 命名空间、NodePort 30080 |
| `run.sh` | 统一入口:dev / build / docker / kubernetes / release / binary |
| `Makefile` | 快捷命令(dev / build / docker-up / lint 等),部分委托给 `run.sh`,部分已陈旧 |
> 注意:项目根目录**没有**独立的 `Dockerfile`,只有 `Dockerfile.embed`。`docker-compose.yml` 直接引用 `Dockerfile.embed`。
### 2.2 后端
- **语言 / 版本**:Go 1.24+
- **Web 框架**:Gin v1.9.1
@@ -52,13 +75,12 @@
关键文件:
- `backend/go.mod` — Go 模块定义,模块名 `ezops`
- `backend/main.go` — 应用入口、CLI 参数解析、配置加载、优雅关闭
- `backend/embed.go` — `go:embed static`,SPA fallback 逻辑
- `backend/config/config.go` — `Config` 结构体与默认配置
- `backend/router/routes.go` — 所有路由注册(约 1018 行,核心入口)
- `backend/router/routes.go` — 所有路由注册(实际约 1054 行,核心入口)
### 2.2 前端
### 2.3 前端
- **框架**:React 19.2+
- **语言**:TypeScript 5.9+
@@ -75,34 +97,13 @@
- **国际化**:i18next + react-i18next(中/英双语)
- **表单校验**:Zod + React Hook Form
关键文件:
- `frontend/package.json`
- `frontend/vite.config.ts` — 端口 5173,代理 `/api`、`/ws`、`/health`、`/version` 到 `localhost:8080`
- `frontend/tailwind.config.js` — CSS 变量主题体系
- `frontend/eslint.config.js` — ESLint flat config,禁止 `any`
### 2.3 Agent
### 2.4 Agent
- **模块名**:`ezops/agent`
- **Go 版本**:go 1.22(文件声明),与后端共用 1.24 工具链
- **依赖**:仅 `golang.org/x/sys`
- **架构**:`collector/`(采集器)、`task/`(远程任务)、`reporter/`(HTTP 上报)、`client/`(HTTP 客户端)、`model/`(数据结构)
### 2.4 部署与构建配置
| 文件 | 用途 |
|------|------|
| `run.sh` | 统一入口:dev / build / docker / kubernetes / release / binary |
| `Makefile` | 快捷命令(dev / build / docker-up / lint 等),实际多委托给 `run.sh` |
| `Dockerfile` | 3-stage 构建镜像(Frontend→Backend+Agent→Alpine Runtime),Docker Compose 使用 |
| `Dockerfile.embed` | 4-stage Embed 镜像(前端→后端→Agent→Runtime),K8s 单容器部署使用 |
| `docker-compose.yml` | 3 容器:MySQL 8.0 + Redis 7-alpine + AIOps(:8080) |
| `docker-compose.k8s.yml` | 单应用容器 + 外部 DB |
| `config.yaml` | 本地开发默认配置(SQLite + redka,端口 8080) |
| `.env.example` | Docker Compose 环境变量示例 |
| `deploy/kubernetes/` | K8s 清单:`devops` 命名空间、NodePort 30080 |
---
## 3. 项目结构与模块划分
@@ -117,11 +118,13 @@ aiops/
├── deploy/ # 部署脚本与 K8s 清单
├── docs/ # 中文开发文档
├── tests/ # 集成测试脚本
├── scripts/ # 构建辅助脚本(kubectl 安装、alpine 镜像源等)
├── run.sh # 统一入口
├── Dockerfile.embed # 推荐生产镜像
├── docker-compose.yml
├── docker-compose.k8s.yml
├── config.yaml
└── README.md / CLAUDE.md
└── README.md / CLAUDE.md / AGENTS.md
```
### 3.2 后端目录职责
@@ -129,11 +132,11 @@ aiops/
| 目录 | 职责 |
|------|------|
| `backend/main.go` / `embed.go` | 应用入口 + 前端嵌入 |
| `backend/controller/` | HTTP 处理器(约 60+ 个文件,按领域拆分) |
| `backend/controller/` | HTTP 处理器(60+ 个文件,按领域拆分;总代码行约 27K) |
| `backend/model/` | GORM 数据模型(约 30 个文件,86+ 张表) |
| `backend/dto/` | 请求/响应 DTO |
| `backend/service/` | 业务逻辑层(V2 Services 依赖注入) |
| `backend/repository/` | 数据访问层 |
| `backend/dto/` | 请求/响应 DTO(当前 `dto.go` 一个文件) |
| `backend/service/` | 业务逻辑层(V2 Services,当前 `service.go`) |
| `backend/repository/` | 数据访问层(当前 `repo.go`) |
| `backend/router/` | 路由注册 |
| `backend/middleware/` | JWT、Admin、PipelineAccess、CORS、日志 |
| `backend/config/` | Viper 配置加载 |
@@ -145,13 +148,13 @@ aiops/
- 用户/角色/权限:`user.go`, `user_admin.go`, `item_role.go`
- LDAP:`ldap.go`, `ldap_users.go`, `ldap_ou.go`
- 资产:`server.go`(V2 `server_handler.go`), `cloud_accounts.go`, `cloud_sync.go`, `cloud_domain.go`, `cloud_platform.go`, `cloud_region.go`, `billing.go`, `billing_alert.go`, `resource_model.go`
- 资产:`server.go`, `cloud_accounts.go`, `cloud_sync.go`, `cloud_domain.go`, `cloud_platform.go`, `cloud_region.go`, `billing.go`, `billing_alert.go`, `resource_model.go`
- K8s:`kubernetes.go`, `k8s_cluster.go`, `k8s_node.go`, `k8s_pod.go`, `k8s_workload.go`, `k8s_yaml.go`, `k8s_resource.go`, `k8s_namespace.go`, `k8s_events.go`, `k8s_compare.go`, `k8s_export.go`, `k8s_hpa_cronjob.go`, `k8s_pod_files.go`, `kubectl_shell.go`
- 监控告警:`alert.go`, `alert_rules.go`, `alert_engine.go`, `alert_channels.go`, `alert_contacts.go`, `alert_silence.go`, `metrics.go`, `health_probe.go`, `site.go`, `snmp.go`, `custom_dashboard.go`
- 数据源代理:`prometheus_proxy.go`, `prom_ds.go`, `zabbix_proxy.go`, `zabbix_ds.go`, `log_proxy.go`, `log_datasource.go`
- 监控告警:`alert.go`, `alert_rules.go`, `alert_engine.go`, `alert_channels.go`, `alert_contacts.go`, `alert_silence.go`, `metrics.go`, `health_probe.go`, `site.go`, `snmp.go`, `custom_dashboard.go`, `middleware_monitor.go`
- 数据源代理:`prometheus_proxy.go`, `prom_ds.go`, `zabbix_proxy.go`, `zabbix_ds.go`, `log_proxy.go`, `log_datasource.go`, `trace_datasource.go`
- 日志中心:`UnifiedQueryPanel.tsx`, `EsQueryPanel.tsx`, `LokiQueryPanel.tsx`, `LogDatasourcePage.tsx`, `LogDatasourceDialog.tsx`, `TimeRangePicker.tsx`
- 应用发布/部署:`pipeline.go`, `pipeline_executor.go`, `deploy.go`, `deploy_groups.go`, `deploy_environments.go`, `tool_config.go`
- 自动化运维:`automation.go`, `automation_cron.go`, `automation_script.go`, `remote_exec.go`
- 自动化运维:`automation.go`, `automation_cron.go`, `automation_script.go`, `remote_exec.go`, `ansible.go`
- 审批:`approval.go`, `approval_process.go`, `approval_workflow.go`
- 审计:`audit.go`, `audit_hub.go`, `terminal_session.go`, `session_command.go`, `login_log.go`
- AI:`llm.go`, `llm_chat.go`, `llm_history.go`, `agent_cli.go`, `agent_cli_api.go`
@@ -169,7 +172,7 @@ aiops/
| `frontend/src/store/` | Zustand 状态管理 |
| `frontend/src/lib/` | 工具函数 |
| `frontend/src/types/` | TypeScript 类型 |
| `frontend/src/i18n/` / `locales/` | 国际化(zh-CN / en-US 双语,120+ 翻译键) |
| `frontend/src/i18n/` / `locales/` | 国际化(zh-CN / en-US 双语) |
| `frontend/src/pages/` | 少量页面级组件 |
| `frontend/src/assets/` | 静态资源 |
@@ -187,11 +190,19 @@ aiops/
| `agent/model/` | 上报数据结构 |
| `agent/deploy/` | `install.sh` + systemd 服务文件 |
### 3.5 代码规模(实测)
| 层级 | 文件数 | 说明 |
|------|--------|------|
| 前端 `frontend/src` | 约 426 个 `.ts` / `.tsx` | 含组件、API、Hooks、Store、类型等 |
| 后端 `backend` | 约 172 个 `.go` | 含 controller、model、pkg、router 等 |
| Agent `agent` | 21 个 `.go` | 独立模块,仅依赖 `golang.org/x/sys` |
---
## 4. 构建与运行命令
统一入口是 `./run.sh`,优先使用它。`Makefile` 仅作为快捷别名。
统一入口是 `./run.sh`,优先使用它。`Makefile` 仅作为快捷别名,且部分命令已落后于 `run.sh`(例如 `make dev` 调用 `./run.sh start` 实际不存在)。
### 4.1 本地开发