Files
aiops/AGENTS.md
T
attacker 092d0e4b9e refactor: Dockerfile.embed → Dockerfile + fix Login TS error
- Dockerfile.embed 重命名为 Dockerfile(统一命名规范)
- docker-compose.yml / run.sh 引用更新
- 全量文档(CLAUDE/AGENTS/README/docs)Dockerfile.embed → Dockerfile
- fix: Login.tsx User 类型缺少 email/status 字段
2026-07-01 04:54:53 +00:00

521 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AIOps 智能运维平台 — Agent 工作指南
> 本文档面向 AI 编程助手。阅读前默认不了解本项目。所有结论均来自项目实际文件,未做假设。
> 项目注释、文档、提交信息主要使用中文;新增/修改代码时注释末尾需署名 `// Logan.Li`。
---
## 1. 项目概述
**AIOps** 是一个企业级云原生智能运维平台,聚焦三大核心能力:
1. **资产管理** — 服务器 CRUD、批量导入、WebShell、云账号/域名/账单、Kubernetes 多集群。
2. **监控告警** — Agent 采集 `/proc` 指标、告警引擎(阈值/离线/日志告警)、告警中心、监控大屏、Prometheus/Zabbix/SNMP/站点拨测/中间件监控。
3. **自动化运维 / AIOps** — CI/CD 流水线、定时任务/脚本库、Go-native SSH 远程执行、资源申请审批、AI 智能助手、Agent CLI(ReAct + Evolver)。
项目采用前后端分离架构,但通过 `go:embed` 支持将前端构建产物嵌入后端二进制,实现单文件 / 单容器部署。
### 1.1 三种核心产物
| 产物 | 技术 | 说明 |
|------|------|------|
| `frontend/` | React 19 + TypeScript + Vite | Web 控制台 |
| `backend/` | Go 1.24 + Gin + GORM | HTTP API + WebSocket + 前端静态资源服务 |
| `agent/` | Go 1.24(CGO_ENABLED=0) | 主机指标采集 + 远程任务执行 |
### 1.2 默认账号(生产必须修改)
| 用户名 | 密码 | 角色 |
|--------|------|------|
| admin | 123456 | 超级管理员 |
| ops01 | 123456 | 运维 |
| dev01 | 123456 | 开发 |
---
## 2. 技术栈与关键配置
### 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` | 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`(4-stage embed 单容器方案)。前端构建嵌入后端二进制,`docker-compose.yml` 直接引用。
### 2.2 后端
- **语言 / 版本**:Go 1.24+
- **Web 框架**:Gin v1.9.1
- **ORM**:GORM v1.30.0
- **数据库**:SQLite(local 模式,开发本机)、MySQL 8.0(生产)、PostgreSQL(可选)
- **缓存**:Redis 7 或 redka(内嵌,local 模式默认)
- **认证**:JWT(`golang-jwt/jwt/v5`)
- **配置**:Viper
- **日志**:Zap
- **WebSocket**:Gorilla WebSocket
- **SSH/SFTP**:`golang.org/x/crypto` + `pkg/sftp`
- **PTY**:`creack/pty`
- **K8s 客户端**:自研轻量客户端(`net/http` + `crypto/tls`),不走 client-go
关键文件:
- `backend/main.go` — 应用入口、CLI 参数解析、配置加载、优雅关闭
- `backend/embed.go` — `go:embed static`,SPA fallback 逻辑
- `backend/config/config.go` — `Config` 结构体与默认配置
- `backend/router/routes.go` — 所有路由注册(实际约 1054 行,核心入口)
### 2.3 前端
- **框架**:React 19.2+
- **语言**:TypeScript 5.9+
- **构建工具**:Vite 7+
- **样式**:Tailwind CSS 3.4+ + `tailwindcss-animate`
- **UI 组件**:shadcn/ui(Radix UI 封装)
- **状态管理**:Zustand 5+
- **数据请求**:TanStack Query 5+
- **路由**:React Router 7+
- **图表**:Recharts
- **图标**:Lucide React
- **编辑器**:CodeMirror 6(`@uiw/react-codemirror` + `@codemirror/lang-yaml`)
- **终端**:xterm.js
- **国际化**:i18next + react-i18next(中/英双语)
- **表单校验**:Zod + React Hook Form
### 2.4 Agent
- **模块名**:`ezops/agent`
- **Go 版本**:go 1.22(文件声明),与后端共用 1.24 工具链
- **依赖**:仅 `golang.org/x/sys`
- **架构**:`collector/`(采集器)、`task/`(远程任务)、`reporter/`(HTTP 上报)、`client/`(HTTP 客户端)、`model/`(数据结构)
---
## 3. 项目结构与模块划分
### 3.1 顶层目录
```
aiops/
├── frontend/ # React SPA
├── backend/ # Go API + embed 静态资源
├── agent/ # 监控 Agent(独立 Go module)
├── deploy/ # 部署脚本与 K8s 清单
├── docs/ # 中文开发文档
├── tests/ # 集成测试脚本
├── scripts/ # 构建辅助脚本(kubectl 安装、alpine 镜像源等)
├── run.sh # 统一入口
├── Dockerfile # 推荐生产镜像
├── docker-compose.yml
├── docker-compose.k8s.yml
├── config.yaml
└── README.md / CLAUDE.md / AGENTS.md
```
### 3.2 后端目录职责
| 目录 | 职责 |
|------|------|
| `backend/main.go` / `embed.go` | 应用入口 + 前端嵌入 |
| `backend/controller/` | HTTP 处理器(60+ 个文件,按领域拆分;总代码行约 27K) |
| `backend/model/` | GORM 数据模型(约 30 个文件,86+ 张表) |
| `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 配置加载 |
| `backend/seed/` | 种子数据(默认账号、菜单等) |
| `backend/pkg/` | 公共包:database、redis、logger、kubernetesclient、remoteexec、agentcli、toolinstaller、wshub 等 |
| `backend/static/` | 前端构建产物(embed 目标目录) |
主要业务模块(按 controller 文件划分):
- 用户/角色/权限:`user.go`, `user_admin.go`, `item_role.go`
- LDAP:`ldap.go`, `ldap_users.go`, `ldap_ou.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`, `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`, `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`
- Agent:`agent.go`, `agent_task.go`, `agent_install.go`
- 系统:`navigation.go`, `credential.go`, `credential_assign.go`
### 3.3 前端目录职责
| 目录 | 职责 |
|------|------|
| `frontend/src/components/` | 业务组件(按领域分子目录) |
| `frontend/src/components/ui/` | shadcn/ui 基础组件 |
| `frontend/src/api/` | API 封装(按领域拆分为 `api.ts` 及子目录) |
| `frontend/src/hooks/` | 自定义 Hooks |
| `frontend/src/store/` | Zustand 状态管理 |
| `frontend/src/lib/` | 工具函数 |
| `frontend/src/types/` | TypeScript 类型 |
| `frontend/src/i18n/` / `locales/` | 国际化(zh-CN / en-US 双语) |
| `frontend/src/pages/` | 少量页面级组件 |
| `frontend/src/assets/` | 静态资源 |
业务组件子目录与后端模块基本对应:`dashboard/`, `server/`, `cloud/`, `k8s/`, `monitor/`, `deploy/`, `approval/`, `automation/`, `aiops/`, `system/`, `agent/`, `layout/` 等。
### 3.4 Agent 目录职责
| 目录 | 职责 |
|------|------|
| `agent/main.go` | CLI 入口、采集上报循环、任务轮询 |
| `agent/collector/` | CPU / 内存 / 磁盘 / 网络 / 端口 / 进程 / FD / Swap / 上下文切换 / 健康探针 |
| `agent/task/` | 远程任务执行器与轮询客户端 |
| `agent/reporter/` | HTTP 上报 |
| `agent/client/` | HTTP 客户端 |
| `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`(例如 `make dev` 调用 `./run.sh start` 实际不存在)。
### 4.1 本地开发
```bash
# 前后端热重载(前端 :5173,后端 :8080,SQLite + redka)
./run.sh dev
./run.sh stop # 停止
./run.sh restart # 重启
./run.sh status # 状态
./run.sh logs # 实时日志
```
后端本地单独运行:
```bash
cd backend
CGO_ENABLED=1 go build -o aiops-server .
./aiops-server
# 或
go run .
```
前端本地单独运行:
```bash
cd frontend
npm install
npm run dev
```
### 4.2 独立二进制(推荐边缘/本机)
```bash
./run.sh build # 产物 ./aiops(项目根目录)
./run.sh build tag v1.5.0 # 指定版本
./aiops version # 查看版本
./aiops --mode local --port 8080 # 前台运行
./run.sh binary upgrade # 停服 → 重编译 → 后台启动
./run.sh binary stop
./run.sh binary status
```
> ⚠️ Mac 上 `./run.sh build` 产出 darwin 二进制,不能直接在 Linux 服务器运行;Linux 部署请用 Docker 镜像或在 Linux 上构建。
### 4.3 Docker Compose
```bash
./run.sh docker up # 增量构建 + 启动(MySQL + Redis + AIOps :8080)
./run.sh docker up v1.5.0 # 指定版本
./run.sh docker up fresh # 无缓存全量重建
./run.sh docker down # 停止
./run.sh docker logs # 实时日志
./run.sh docker push v1.5.0 # 构建并推送 lghost/aiops:v1.5.0
```
### 4.4 Kubernetes
```bash
./run.sh kubernetes deploy # 构建镜像 + 全量部署(devops 命名空间,NodePort 30080)
./run.sh kubernetes upgrade v1.5.0 # 滚动更新
./run.sh kubernetes push v1.5.0 # 构建并推送镜像
./run.sh kubernetes status
./run.sh kubernetes logs
./run.sh kubernetes delete # 清理(保留 PVC)
```
### 4.5 Agent 构建
```bash
./run.sh build agent # 交叉编译 linux-amd64 + linux-arm64,macOS 额外产出 darwin-arm64
```
### 4.6 一键发版
```bash
docker login
./run.sh release v1.5.0 # 打 tag → 编译二进制 → 构建镜像 → 推送 Docker Hub → 更新 K8s manifest
```
版本来源优先级:`run.sh` 显式参数 > `VERSION` 环境变量 > `git describe --tags --always` > `dev`。
---
## 5. 测试说明
### 5.1 当前测试现状
- **后端 Go 单元测试**:`backend/` 下目前 **没有 `*_test.go` 文件**。若新增功能,请按 Go 惯例补充测试。
- **集成测试**:`tests/integration_test.py` 提供基于 HTTP 的端到端验证。
### 5.2 运行集成测试
```bash
# 默认访问 localhost:80(适合 Docker Compose 后)
python3 tests/integration_test.py
# 本地开发模式(后端端口 8080)
python3 tests/integration_test.py --host localhost --port 8080
```
测试覆盖:健康检查、登录、用户、仪表盘、服务器 CRUD、导航、凭证、流水线、环境、角色。
### 5.3 前端类型与构建检查
```bash
cd frontend
npm run build # 生产构建(含 tsc -b)
npx tsc --noEmit # 类型检查(提交前必须零错误)
npm run lint # ESLint 检查
```
### 5.4 后端静态检查
```bash
cd backend
go vet ./...
go build -o aiops-server .
```
---
## 6. 开发规范
### 6.1 注释规范
- 新增或修改代码必须写**中文注释**。
- 注释末尾署名 `// Logan.Li`。
### 6.2 文件大小红线
| 类型 | 上限 | 超出处理 |
|------|------|----------|
| Go handler | 400 行 | 按 sub-domain 拆分 |
| Go model | 300 行 | 按模块拆分 |
| React 组件 (.tsx) | 700 行 | 提取子组件 |
| 任何文件 | 700 行(硬上限) | 必须拆分 |
### 6.3 Go 代码规范
1. **所有 handler 返回必须包裹 `model.Response{Code:200, Data:...}`**。
2. **统一响应格式**:
```go
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data"`
}
type ListResponse struct {
List interface{} `json:"list"`
Total int64 `json:"total"`
}
```
3. **新增 handler 不直接绑 model**,使用独立 request struct。
4. **GORM 指针字段必须解引用**后再使用(`*field`)。
5. **Update handler 禁止复用 CreateRequest**,使用 `map[string]interface{}` 接收。
6. **编译参数**:`unset http_proxy https_proxy && export GOPROXY=https://goproxy.cn,direct && GOTOOLCHAIN=local CGO_ENABLED=1 go build -o aiops-server .`
7. **GORM `First()` 连续查询会带上次 ID**,请用 `Take()` 代替。
8. 文件名使用 `snake_case.go`;类型/方法 `PascalCase`;变量 `camelCase`。
### 6.4 React / TypeScript 规范
1. **列表响应自动解包**:`http.ts` 已提取 `.data`,组件拿到的是 `Response.Data`;列表返回 `{list, total}`。
2. **禁止 `window.confirm()` / `alert()`**,使用 `useConfirm()` + `toast`。
3. **Radix Dialog 必须包含 `<DialogDescription>`**。
4. **Token 双保险**:`useUserStore.getState().token || localStorage.getItem('token')`。
5. ESLint 禁止显式 `any`(`@typescript-eslint/no-explicit-any: error`)。
6. 组件文件 `PascalCase.tsx`;工具文件 `camelCase.ts`。
### 6.5 UI 设计原则
- 能去掉的都去掉 — 不要多余边框、装饰线。
- 按钮文案 2–4 字。
- 不留占位按钮;功能没完成就不放按钮。
- 页面打开即用,不需要额外“新建”按钮跳转。
- 主题感知 — 使用 CSS 变量 `var(--dg-xxx)` / Tailwind 语义色,不硬编码颜色。
### 6.6 Git 工作流
| 分支 | 说明 |
|------|------|
| `master` | 生产分支,保护分支 |
| `dev` | 开发集成分支 |
| `feature/*` | 功能分支 |
| `fix/*` | 修复分支 |
| `hotfix/*` | 紧急修复 |
提交规范:
```
<type>: <description>
- 变更点 1
- 变更点 2
```
Type:`feat`, `fix`, `refactor`, `docs`, `style`, `test`, `chore`。
---
## 7. 关键架构约定
### 7.1 认证流程
```
Login(本地/LDAP fallback) → JWT Token
→ 前端 Zustand persist + localStorage 双写
→ http.ts 自动注入 Bearer
→ JWTAuth 中间件
→ AdminAuth 中间件(管理类路由)
```
WebSocket 无法设置自定义 header → 后端 `JWTAuth` 支持 `?token=` query param 回退。
### 7.2 Agent 双通道架构
```
指标通道: ticker(10s) → collect(/proc) → POST /agent/report
任务通道: ticker(5s) → GET /agent/tasks/poll → execute → POST /agent/tasks/:id/result
```
### 7.3 K8s 客户端
自研轻量 K8s HTTP 客户端,基于 `channel.k8s.io` WebSocket 协议实现 Pod exec/日志/文件浏览,不引入 client-go(控制镜像体积)。
### 7.4 缓存策略
- `local` 模式:SQLite + redka(内嵌 Redis 兼容层)。
- 生产模式:MySQL + Redis。
- 告警引擎使用 Redis 分布式锁(SetNX + 60s TTL)保证多副本仅 Leader 执行检查。
### 7.5 健康检查
- 推荐探针:`GET /version`(无 DB 依赖)。
- `GET /health` 包含 DB 检查,启动早期可能不响应,因此 K8s 探针使用 `/version`。
### 7.6 工具懒加载
`kubectl`、`maven`、`nodejs`、`helm` 等首次使用时自动下载;国内网络自动优先国内镜像。见 `backend/pkg/toolinstaller/`。
---
## 8. 安全注意事项
### 8.1 已具备的安全机制
- **认证**:JWT Bearer Token。
- **授权**:RBAC 角色权限(后端路由 + 前端 `usePermission` / `<HasPermission>` + Sidebar 过滤)。
- **密码**:Bcrypt 存储。
- **SQL 注入防护**:全参数化查询(GORM)。
- **XSS 防护**:React 默认转义。
- **凭证加密**:7 种统一凭证类型(SSH/Docker/TLS/AKSK/DB/API/Generic)加密存储。
- **高危命令**:Agent CLI 通过 WebSocket `confirm` 事件 + 前端 `useConfirm()` 二次确认。
### 8.2 生产必须处理
1. **修改默认密码**:admin / ops01 / dev01 均为 `123456`。
2. **更换 JWT Secret**:`config.yaml` 中 `jwt.secret` 或环境变量 `JWT_SECRET`。
3. **启用 HTTPS**:Ingress 或前置 Nginx 终止 TLS。
4. **数据库密码**:`.env` / `config.yaml` 中 MySQL 密码不能使用默认值。
5. **定期备份**:MySQL 数据、PVC、SQLite 文件。
6. **审计日志**:确保审计中间件记录敏感操作。
7. **命令注入审计**:后端存在 `exec.Command` + `bash -c` 调用场景,需校验用户输入路径。
---
## 9. 常见陷阱速查
| # | 陷阱 | 解决 |
|---|------|------|
| Go1 | `go build` 超时 | `unset proxy + GOPROXY=https://goproxy.cn,direct + GOTOOLCHAIN=local` |
| Go2 | handler 不包裹 Response | 必须 `model.Response{Code:200, Data:...}` |
| Go3 | GORM 指针字段 | `*field` 解引用后再用 |
| Go4 | Update 复用 CreateRequest | 用 `map[string]interface{}` |
| Go5 | `CGO_ENABLED=0` + redka → 缓存静默失败 | MySQL 模式必须显式 `--redis-driver redis` |
| FE1 | 白屏无堆栈 | 90% 是列表 `{list,total}` 未解包 |
| FE2 | `confirm()` 冻结自动化 | 用 `useConfirm()` |
| FE3 | Token 获取 | `useUserStore.getState().token` + `localStorage` |
| FE4 | Radix Dialog 警告 | 必须有 `<DialogDescription>` |
| FE5 | Select.Item 空字符串 value | 用 sentinel 值 `__manual` |
| FE6 | API 字段名不匹配 | 检查前后端命名一致性 |
| Build | Mac 构建 Linux 二进制 | 不能直接用 `./run.sh build`;用 `Dockerfile` 或在 Linux 构建 |
---
## 10. 参考文档
| 文档 | 说明 |
|------|------|
| `README.md` | 项目主说明、快速开始 |
| `CLAUDE.md` | AI 助手完整命令参考与关键设计决策 |
| `docs/development-guide.md` | 开发规范、Git 工作流 |
| `docs/deployment.md` | 部署方式、版本发版 |
| `docs/project-structure.md` | 目录结构说明 |
| `docs/api-reference.md` | API 接口文档 |
| `docs/database-schema.md` | 数据模型和表结构 |
| `PROJECT_EVALUATION.md` | 全量项目评估(规模、技术债、评分) |
| `ROADMAP.md` | K8s 管理功能演进路线 |
---
## 11. 快速验证清单
修改代码后,按以下顺序验证:
1. `cd backend && go build -o aiops-server .`(零错误)
2. `cd frontend && npx tsc --noEmit`(零错误)
3. `./run.sh docker up` 或 `./run.sh dev` 启动完整环境
4. `python3 tests/integration_test.py --host localhost --port 8080` 通过
5. 手动验证相关页面 / API
6. `git commit`(大变更前先提交,方便回滚)
> 代码改完不算完成,端到端验证通过才算完成。