# zabbix_sentinel_aiops
**Repository Path**: SRIM/zabbix_sentinel_aiops
## Basic Information
- **Project Name**: zabbix_sentinel_aiops
- **Description**: 项目概述
Sentinel AIOps 是一个 Zabbix 7.0 前端扩展模块,将 AI 能力深度集成到监控运维平台中。核心功能包括:
功能说明
🤖 AI 对话助手 基于 Hermes API 的流式对话,支持文件上传、消息引用、多会话管理
📊 实时监控仪表盘 CPU/内存 TOP5、网络流量、磁盘使用率、告警统计、主机状态
⏰ Cron 定时任务管理 通过 Hermes CLI
- **Primary Language**: JavaScript
- **License**: AGPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-14
- **Last Updated**: 2026-04-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Sentinel AIOps — 部署说明手册
   
> **作者**: Skyrim | **兼容**: Zabbix Server 7.0.11 已测试 | **架构**: 纯前端扩展模块(无构建工具)
---
## 目录
- [1. 项目概述](#1-项目概述)
- [2. 架构设计](#2-架构设计)
- [3. 前置依赖](#3-前置依赖)
- [4. 安装部署](#4-安装部署)
- [5. 配置说明](#5-配置说明)
- [6. 功能详解](#6-功能详解)
- [7. 安全机制](#7-安全机制)
- [8. 故障排查](#8-故障排查)
---
## 1. 项目概述
Sentinel AIOps 是一个 **Zabbix 7.0 前端扩展模块**,将 AI 能力深度集成到监控运维平台中。核心功能包括:
| 功能 | 说明 |
|------|------|
| **🤖 AI 对话助手** | 基于 Hermes API 的流式对话  支持文件上传  消息引用、多会话管理 |
| **📊 实时监控仪表盘** | CPU/内存 TOP5、网络流量、磁盘使用率、告警统计、主机状态 |
| **⏰ Cron 定时任务管理** | 通过 Hermes CLI 管理 AI 自动巡检等周期任务 |
| **🔧 巡检报告生成** | 4 维度 16 点综合分析,自动生成结构化报告 |
### 技术特点
- **零构建工具**:纯 IIFE 模式单文件架构,无需 npm/webpack/vite
- **本地化部署**:所有资源内联,无外部 CDN 依赖
- **暗色主题适配**:与 Zabbix 原生暗色 UI 无缝融合
- **流式渲染**:SSE 实时输出,思考过程可折叠展示
|
|
|
|
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| | | |
| | | |
| | | |
---
## 2. 架构设计
```
┌─────────────────────────────────────────────────────────────┐
│ 浏览器端 (Zabbix Frontend) │
│ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ sentinel_widget.js (主逻辑 ~2700 行) │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │
│ │ │ 聊天引擎 │ │仪表盘组件│ │ Cron 管理面板 │ │ │
│ │ │ SSE 流式 │ │ ECharts │ │ REST CRUD │ │ │
│ │ └────┬─────┘ └────┬─────┘ └───────┬──────────┘ │ │
│ └────────┼────────────┼────────────────┼────────────┘ │
│ │ │ │ │
│ ┌────────▼────────────▼────────────────▼────────────┐ │
│ │ sentinel_styles.css (~600 行样式) │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↕ HTTP / HTTPS
┌─────────────────────────────────────────────────────────────┐
│ Zabbix Server (后端) │
│ │
│ ┌────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Module.php │ │ cron_api.php │ │ configuration │ │
│ │ (配置注入) │ │ (Cron桥接) │ │ .edit.php (设置) │ │
│ └─────┬──────┘ └──────┬───────┘ └──────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Nginx 反向代理 │ │
│ │ /hermes-api/ → 127.0.0.1:8642 │ │
│ └─────────────────────┬───────────────────────────────┘ │
└─────────────────────────┼─────────────────────────────────┘
│
┌─────────────────────────▼─────────────────────────────────┐
│ Hermes API Server (:8642) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌────────────────┐ │
│ │ /v1/models │ │ /chat/completions │ │ Cron CLI │ │
│ │ (模型列表) │ │ (AI对话SSE) │ │ 定时任务管理 │ │
│ └──────────────┘ └──────────────┘ └────────────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ LLM Provider │ │
│ │ (DeepSeek/GPT…) │ │
│ └───────────────────┘ │
└───────────────────────────────────────────────────────────┘
```
### 文件结构
```
sentinel_aiops/
├── manifest.json # 模块清单 (Zabbix 识别入口)
├── Module.php # PHP 后端 (Cookie 注入 + 配置加载)
├── proxy_api.php # 代理 API (Cron 管理 + 分类管理)
├── categories.json # 分类定义 (名称/图标/颜色) ⚠️ 需 Web 用户可写
├── job_categories.json # 任务-分类映射 (job_id → category_key) ⚠️ 需 Web 用户可写
├── views/
│ └── module.configuration.edit.php # 设置面板表单 (Hermes URL + Key)
├── assets/
│ ├── css/
│ │ └── sentinel_styles.css # 全部样式 (暗色主题, ~600行)
│ ├── js/
│ │ └── sentinel_widget.js # 全部业务逻辑 (IIFE, ~6700行)
│ └── hosts_template.csv # 主机巡检模板数据
└── README.md # 本文档
```
---
## 3. 前置依赖
### 必需项
| 组件 | 版本要求 | 用途 |
|------|---------|------|
| **Zabbix Server** |  | 宿主平台 |
| **Hermes Agent** |  | AI 引擎 (对话/Cron/Tool Calling) |
| **PHP** |  (Zabbix 自带) | 后端桥接 |
| **Nginx** |  | 反向代理 Hermes API |
### Hermes Agent 安装
```bash
# 1. 安装 Hermes CLI
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
# 2. 验证安装
hermes --version
# 3. 配置 API Key 和模型
# 编辑 ~/.hermes/config.toml
# 设置 provider、model、api_key 等
# 4. 启动 Gateway (Cron 调度器需要)
hermes gateway install # systemd 服务模式
# 或前台运行:
# hermes gateway start
```
### Nginx 反向代理配置
在 Zabbix Nginx 配置中添加:
```nginx
location /hermes-api/ {
proxy_pass http://127.0.0.1:8642/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# SSE 流式响应需要关闭缓冲
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 300s; # 长对话超时 5 分钟
}
```
```bash
# 测试并重载 Nginx
nginx -t && systemctl reload nginx
```
---
## 4. 安装部署
### 方法一:直接复制(推荐)
```bash
# 在 Zabbix 服务器上执行
MODULE_DIR="/usr/share/zabbix/modules"
# 创建目录
mkdir -p "$MODULE_DIR/sentinel_aiops/assets/css"
mkdir -p "$MODULE_DIR/sentinel_aiops/assets/js"
mkdir -p "$MODULE_DIR/sentinel_aiops/views"
# 复制文件
cp manifest.json "$MODULE_DIR/sentinel_aiops/"
cp Module.php "$MODULE_DIR/sentinel_aiops/"
cp cron_api.php "$MODULE_DIR/sentinel_aiops/"
cp views/module.configuration.edit.php "$MODULE_DIR/sentinel_aiops/views/"
cp assets/css/sentinel_styles.css "$MODULE_DIR/sentinel_aiops/assets/css/"
cp assets/js/sentinel_widget.js "$MODULE_DIR/sentinel_aiops/assets/js/"
cp assets/hosts_template.csv "$MODULE_DIR/sentinel_aiops/assets/"
# 设置权限 (非常重要!)
chown -R zabbix:zabbix "$MODULE_DIR/sentinel_aiops"
chmod -R 755 "$MODULE_DIR/sentinel_aiops"
# ⚠️ 关键步骤:新分类数据文件必须设置为 Web 用户可写
# categories.json — 存储分类定义(名称/图标/颜色)
# job_categories.json — 存储任务与分类的映射关系
# 如果这两个文件不可写,将导致"新增分类"等功能静默失败
cat > "$MODULE_DIR/sentinel_aiops/categories.json" << 'EOF'
{
"categories": [
{ "key": "inspect", "name": "巡检任务", "icon": "search", "color": "#3b82f6" },
{ "key": "security", "name": "安全审计", "icon": "shield", "color": "#ef4444" },
{ "key": "daily", "name": "日常管理", "icon": "settings", "color": "#f59e0b" },
{ "key": "report", "name": "报告生成", "icon": "file-text", "color": "#10b981" },
{ "key": "alert", "name": "告警响应", "icon": "bell", "color": "#8b5cf6" }
],
"default": "daily",
"uncategorized": { "key": "_uncategorized", "name": "未分类", "icon": "folder", "color": "#94a3b8" }
}
EOF
echo '{}' > "$MODULE_DIR/sentinel_aiops/job_categories.json"
# 设置文件所有者为 Web 服务器用户 (根据实际 Nginx 用户调整)
# CentOS/RHEL: nginx — Ubuntu: www-data — 如果 Nginx 在 Zabbix 下运行可能是 zabbix
WEB_USER="zabbix"
id nginx >/dev/null 2>&1 && WEB_USER="nginx"
id www-data >/dev/null 2>&1 && WEB_USER="www-data"
# 必须确保这两个文件可被 Web 用户读写 (664),目录可执行
chown "$WEB_USER:$WEB_USER" "$MODULE_DIR/sentinel_aiops/categories.json"
chown "$WEB_USER:$WEB_USER" "$MODULE_DIR/sentinel_aiops/job_categories.json"
chmod 664 "$MODULE_DIR/sentinel_aiops/categories.json"
chmod 664 "$MODULE_DIR/sentinel_aiops/job_categories.json"
# 验证权限 (应显示 -rw-rw-r-- 且所有者为 nginx 或 zabbix)
ls -la "$MODULE_DIR/sentinel_aiops/categories.json" "$MODULE_DIR/sentinel_aiops/job_categories.json"
```
### 方法二:从本地上传
```bash
scp -r sentinel_aiops/* root@:/usr/share/zabbix/modules/sentinel_aiops/
ssh root@ "
chown -R zabbix:zabbix /usr/share/zabbix/modules/sentinel_aiops
# ⚠️ 关键:修复分类数据文件权限
WEB_USER=zabbix; id nginx >/dev/null 2>&1 && WEB_USER=nginx
chown \$WEB_USER:\$WEB_USER /usr/share/zabbix/modules/sentinel_aiops/categories.json
chown \$WEB_USER:\$WEB_USER /usr/share/zabbix/modules/sentinel_aiops/job_categories.json
chmod 664 /usr/share/zabbix/modules/sentinel_aiops/categories.json
chmod 664 /usr/share/zabbix/modules/sentinel_aiops/job_categories.json
"
```
### 启用模块
1. 打开 Zabbix Web → ** Administration → Modules**
2. 找到 **"Sentinel AIOps Engine"** → 点击 **Scan directory** 或手动启用
3. 进入模块设置页面,填写:
- **Hermes API URL**: `/hermes-api/v1`
- **Hermes API Key**: 你的 Hermes Bearer Token
4. 点击 **Update** 保存
### 验证安装
打开浏览器开发者工具 (F12) → Console,输入:
```javascript
document.getElementById('sentinel-panel') ? '✅ 模块已加载' : '❌ 未找到'
```
或在 Zabbix 页面右侧应看到 **Sentinel AIOps** 面板入口。
---
## 5. 配置说明
### 5.1 模块配置(Zabbix 设置页)
| 字段 | 默认值 | 说明 |
|------|--------|------|
| `hermes_api_url` | `/hermes-api/v1` | Hermes API 地址前缀 |
| `hermes_api_key` | *(空)* | **必填** — Hermes Bearer Token |
### 5.2 前端内置配置(代码中的常量)
在 `sentinel_widget.js` 顶部可调整以下参数:
```javascript
const HERMES_URL_DEFAULT = "/hermes-api"; // Hermes API 基础路径
const AI_MODEL = "deepseek-chat"; // 使用的模型名称
const MAX_FILE_SIZE = 10 * 1024 * 1024; // 上传文件大小限制 (10MB)
const MAX_CONTENT_CHARS = 500000; // 文件内容最大字符数 (500K)
const CHAT_TIMEOUT_MS = 300000; // 对话请求超时 (5分钟)
```
### 5.3 数据存储位置
| 数据类型 | 存储方式 | 位置 |
|---------|---------|------|
| 会话历史 | localStorage | 浏览器本地 (`s_sess`) |
| 用户偏好设置 | localStorage | 浏览器本地 (`s_cfg`) |
| Hermes API Key | Cookie | `sentinel_config` (httponly=false) |
| Cron 任务数据 | Hermes 内部 | `~/.hermes/cron/jobs.json` |
---
## 6. 功能详解
### 6.1 AI 对话系统
#### 核心能力
| 特性 | 实现 |
|------|------|
| **流式输出** | SSE `text/event-stream`,逐 token 渲染 |
| **执行过程展示** | 从 content 中智能分离"过程文字"和"正文",折叠容器展示 |
| **文件上传** | 支持文本/代码文件读取内容;二进制文件(ZIP/PDF等)显示元信息 |
| **消息引用** | 点击 AI 回复的引用按钮,可在新消息中引用该段内容 |
| **多会话管理** | 左侧会话列表,支持切换/新建/删除/重命名 |
| **Markdown 渲染** | 表格/代码块/列表/链接/图片完整支持 |
| **Mermaid 图表** | 异步渲染流程图/序列图/甘特图等 |
#### 消息渲染顺序
```
🤖 Sentinel AIOps ← 名称行
┌─ ⚙ 执行过程 N 步操作 ▸ ─────┐ ← 可折叠 (默认收起)
│ 🧠 Thinking ... │ ← 思考过程 (如有)
│ ▸ tool_name ✓/✗ │ ← 工具调用卡片 (如有)
└────────────────────────────────┘
[Markdown 正文内容...] ← 最终回答
[📋 复制] [✏️ 编辑] ← 操作按钮
2026-04-14 16:37 ← 时间戳
```
### 6.2 监控仪表盘
| 面板 | 数据源 | 展示形式 |
|------|--------|---------|
| **CPU TOP5** | Zabbix API | 主机名 + 使用率条形图 |
| **内存 TOP5** | Zabbix API | 主机名 + 使用量/总量 |
| **网络流量** | Zabbix API | 网卡名 + 入/出速率 |
| **磁盘使用** | Zabbix API | 分区名 + 使用率 + 可用空间 |
| **告警统计** | Zabbix API | 按严重级别分组计数 |
| **主机状态** | Zabbix API | 在线/离线/维护 数量概览 |
| **触发器趋势** | Zabbix API | 近 24 小时折线图 |
> ⚠️ **用户偏好**:CPU/内存显示**主机名**(非监控项名),流量接口用**网卡名**
### 6.3 Cron 定时任务管理
通过 Hermes CLI 管理定时任务,支持完整的 CRUD 操作:
| 操作 | API 方法 | 说明 |
|------|---------|------|
| 列出任务 | GET | 含调度器状态 + 所有任务详情 |
| 创建任务 | POST | name, schedule, prompt, deliver, repeat |
| 暂停/恢复 | PUT | pause / resume |
| 手动触发 | PUT | run |
| 删除任务 | DELETE | 按 ID 移除 |
典型用例:**每日自动巡检** — 设定 Cron 让 AI 定时分析监控数据并输出报告。
---
## 7. 安全机制
| 措施 | 实现 |
|------|------|
| **认证链路** | Zabbix Session → Cookie → Hermes Bearer Token |
| **CSRF 防护** | `cron_api.php` 校验 X-CSRF-Token 与 Session Token 一致性 |
| **CORS 限制** | 仅允许同源请求(Origin 白名单) |
| **命令注入防护** | `escapeshellarg()` + 参数白名单 + 输入长度限制 |
| **XSS 防护** | `esc()` 函数转义所有动态 HTML 内容 |
| **文件安全** | 二进制文件不读取内容;文件大小上限 10MB |
| **敏感数据处理** | API Key 不写入日志/URL;localStorage 存储加密标记 |
---
## 8. 故障排查
### 常见问题
#### Q0: 新增分类、删除分类、修改分类图标/名称等功能无反应或静默失败
```
⚠️ 这是部署中最常见的问题!原因是 categories.json 和 job_categories.json
两个 JSON 文件的文件权限设置不正确。
现象:
- 点击 "+" 添加新分类,输入名称后回车,UI 无变化
- 控制台日志显示 "add-category success",但刷新后分类列表不变
- 删除分类、修改分类图标/名称等操作也无响应
原因:
- PHP 的 proxy_api.php 在 Web 服务器进程 (Nginx/PHP-FPM/PHP) 中运行
- 该进程以非 root 身份运行 (通常是 nginx/zabbix/www-data 用户)
- 如果 categories.json 由 root 用户创建,Web 用户无法写入
- 此时 saveJsonFile() 返回 false,但上层逻辑未检查,返回虚假成功
诊断步骤:
1. 登录服务器确认文件所有者:
ls -l /usr/share/zabbix/modules/sentinel_aiops/categories.json
# 错误示例: -rw-r--r-- 1 root root ... (所有者是 root)
# 正确示例: -rw-rw-r-- 1 nginx nginx ... (所有者是 Web 用户)
2. 确认 Web 服务器用户身份:
id nginx # CentOS/RHEL
id zabbix # 如果 Nginx 在 Zabbix 进程下运行
id www-data # Ubuntu/Debian
修复步骤:
WEB_USER="nginx" # 根据实际情况改为 zabbix 或 www-data
chown \$WEB_USER:\$WEB_USER /usr/share/zabbix/modules/sentinel_aiops/categories.json
chown \$WEB_USER:\$WEB_USER /usr/share/zabbix/modules/sentinel_aiops/job_categories.json
chmod 664 /usr/share/zabbix/modules/sentinel_aiops/categories.json
chmod 664 /usr/share/zabbix/modules/sentinel_aiops/job_categories.json
预防方法:
- 在部署脚本中始终先创建空文件,再修改所有者和权限
- 不要使用 scp root 覆盖后再忘记修改权限
- 确保 PHP 运行用户对这两个文件有写权限
```
#### Q1: 模块未出现在 Zabbix 中
```
检查清单:
1. 文件是否放在正确路径? → /usr/share/zabbix/modules/sentinel_aiops/
2. manifest.json 是否有效 JSON?
3. 文件权限是否正确? → chown zabbix:zabbix; chmod 755
4. Zabbix 缓存? → Administration → Modules → Scan directory
```
#### Q2: "请先配置 Hermes API Key" 提示
```
检查步骤:
1. 进入 Administration → Modules → Sentinel AIOps Engine
2. 确保 hermes_api_key 已填写并点 Update 保存
3. 清除浏览器 Cookie 后刷新 (sentinel_config cookie 可能过期)
4. F12 Console 输入: JSON.parse(document.cookie.match(/sentinel_config=([^;]+)/)?.[1])
查看 has_config 是否为 true
```
#### Q3: 对话请求失败 / 超时
```
排查方向:
1. Nginx 代理是否工作?
curl -H "Authorization: Bearer YOUR_KEY" http://localhost/hermes-api/v1/models
2. Hermes Gateway 是否启动?
hermes cron status
3. CORS 问题? (跨域部署时)
检查 Nginx 的 Access-Control-Allow-Origin 头
4. SSE 超时?
确保 nginx.conf 有: proxy_buffering off; proxy_read_timeout 300s;
```
#### Q4: 控制台报 SVG `` 错误
```
原因: 会话列表删除按钮的垃圾桶图标 SVG 路径缺少 M 命令
修复: 已在 v2.1.0+ 修复。确保使用最新版 sentinel_widget.js
```
#### Q5: `/v1/models` 返回 404
```
原因: Hermes API URL 配置了 /v1 后缀,导致路径变成 /hermes-api/v1/v1/models
修复: 代码已做去重处理 (replace(/\/v1$/, ""))。确认 hermes_api_url 不含 /v1 后缀
```
#### Q6: 附件显示为"文本文件"而非正确类型
```
原因: ZIP/PDF 等二进制文件被 FileReader.readAsText() 当成文本处理
修复: v2.1.0+ 新增 BINARY_EXTS 白名单 (30+ 扩展名),二进制文件只保存元数据
```
### 调试日志
开启浏览器控制台 (F12) 可看到 `[Sentinel]` 前缀的调试信息:
```
[Sentinel] 流式 meta: {"hasReasoning":true,"reasonLen":345,"toolCount":2,...}
[Sentinel] 最终结果: {"hasReasoning":true,"reasonLen":345,"toolCount":2,...}
```
这些日志帮助确认:
- AI 模型是否返回了 reasoning_content
- 是否有 tool_calls 数据
- 内容长度是否正常
---
## 附录:更新记录
| 版本 | 日期 | 主要变更 |
|------|------|---------|
|  | 2026-04-14 | 执行过程折叠框、二进制文件识别、附件/引用右对齐、SVG 修复、URL 去重 |
|  | 2026-04-13 | 对话功能全面升级(基于 Hermes HUD UI 分析) |
|  | 2026-04 初 | 基础框架:仪表盘 + 聊天 + Cron 管理 |
---
*本文档随项目更新而维护。如有疑问,请查看浏览器控制台的 [Sentinel] 日志或提交 Issue。*