# opsx-webhook **Repository Path**: attacker/opsx-webhook ## Basic Information - **Project Name**: opsx-webhook - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-23 - **Last Updated**: 2025-11-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OPSX Webhook - 消息转发系统 基于 Gin + Vue 3 的一体化 Webhook 消息转发系统,支持接收请求内容格式化完毕再转发给飞书、钉钉、Telegram、企业微信等第三方平台。 ## 特性 - ⚡️ **一体化部署** - 前后端统一部署,单个二进制文件 - 🚀 **高性能** - Go 语言原生性能 - 🔒 **JWT 认证** - 完整的认证系统 - 🗄️ **数据库支持** - MySQL / PostgreSQL / SQLite ## 技术栈 - **后端**: Gin + GORM - **前端**: Vue 3 + Pinia + Element Plus ## 项目结构 ```text opsx-webhook/ ├── main.go # 应用入口 ├── config/ # 配置管理 ├── database/ # 数据库初始化和迁移 │ └── initdata/ # 初始化数据(按平台拆分) ├── models/ # 数据模型(数据库层) ├── dto/ # 数据传输对象(API 层) ├── controller/ # 控制器层 ├── service/ # 服务层 ├── router/ # 路由配置 ├── middleware/ # 中间件 ├── utils/ # 工具函数 └── ui/ # 前端项目 ├── embed.go # 静态文件嵌入(直接嵌入 ui/dist) ├── dist/ # 前端构建产物 └── src/ # 前端源码 ``` **说明:** - `ui/embed.go` 使用 Go 的 `//go:embed` 直接嵌入 `ui/dist` 目录,无需额外的复制步骤 - `dto/` 和 `models/` 职责分离:`dto` 用于 API 请求/响应,`models` 用于数据库模型 ## 快速开始 ### 1. 构建 ```bash ./build.sh ``` 构建脚本会自动: 1. 构建前端(生成 `ui/dist`) 2. 编译 Go 二进制文件(前端资源自动嵌入) 构建完成后会生成 `opsx-webhook` 二进制文件。 ### 2. 运行 ```bash # 方式1: 使用环境变量 export DB_DRIVER=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USER=root DB_PASSWORD=your_password DB_NAME=opsx_webhook ./opsx-webhook # 方式2: 使用命令行参数 ./opsx-webhook --db-driver=mysql --db-host=127.0.0.1 --db-port=3306 --db-user=root --db-password=your_password --db-name=opsx_webhook --port=9000 ``` ### 3. 访问 - Web 界面: - 默认账号: `admin` / `admin` ## 测试示例 **通用格式:** `POST /api/v1/hook?type={type}&tpl={template}&url={url}` **测试数据:** ```json { "alerts": [{ "status": "firing", "labels": {"alertname": "测试告警", "severity": "warning"}, "annotations": {"description": "测试消息"}, "startsAt": "2025-11-23T21:00:00Z" }] } ``` ### 钉钉 **方式1: 使用 `ddurl` 参数(推荐,更简单)** ```bash curl -X POST "http://127.0.0.1:9000/api/v1/hook?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"alerts":[{"status":"firing","labels":{"alertname":"测试"},"annotations":{"description":"测试"}}]}' ``` **方式2: 使用 `url` 参数(需要 URL 编码)** ```bash # 注意:如果 URL 包含查询参数(如 access_token),需要对整个 URL 进行编码 curl -X POST "http://127.0.0.1:9000/api/v1/hook?type=dd&tpl=prometheus-dd&url=https%3A%2F%2Foapi.dingtalk.com%2Frobot%2Fsend%3Faccess_token%3DYOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"alerts":[{"status":"firing","labels":{"alertname":"测试"},"annotations":{"description":"测试"}}]}' ``` ### 飞书 ```bash curl -X POST "http://127.0.0.1:9000/api/v1/hook?type=fs&tpl=feishu&url=https://open.larksuite.com/open-apis/bot/v2/hook/YOUR_WEBHOOK_TOKEN" \ -H "Content-Type: application/json" -d '{"alerts":[{"status":"firing","labels":{"alertname":"测试"},"annotations":{"description":"测试"}}]}' ``` ### Telegram ```bash curl -X POST "http://127.0.0.1:9000/api/v1/hook?type=tg&tpl=telegram&url=https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage&chat_id=YOUR_CHAT_ID" \ -H "Content-Type: application/json" -d '{"alerts":[{"status":"firing","labels":{"alertname":"测试"},"annotations":{"description":"测试"}}]}' ``` **参数说明:** - `type`: 消息类型(`dd`=钉钉, `fs`=飞书, `tg`=Telegram) - `tpl`: 模板代码(如 `dingtalk`, `feishu`, `telegram`) - `url`: 目标平台的 Webhook URL(统一参数) - `chat_id`: Telegram 专用,群组/用户 ID ## Docker 部署 ### 快速开始(推荐) **两步完成部署:** ```bash # 1. 构建镜像(自动构建前端并打包到二进制) docker build -t lghost/opsx-webhook:latest . # 2. 运行容器 docker run -d \ -p 9000:9000 \ --name opsx-webhook \ lghost/opsx-webhook:latest ``` **说明:** - Dockerfile 会自动完成前端构建和 Go 二进制打包,前端资源已嵌入到二进制文件中 - 直接 `docker build` **不会**在本地生成 `ui/dist` 目录(这是正常的,因为前端已嵌入二进制) ### 构建 Docker 镜像(详细选项) #### 方式1: 直接构建(最简单,推荐) ```bash # 构建镜像(前端构建产物会自动嵌入到二进制文件中) docker build -t lghost/opsx-webhook:latest . # 构建并推送 docker build -t lghost/opsx-webhook:latest . && docker push lghost/opsx-webhook:latest ``` **注意:** 这种方式不会在本地生成 `ui/dist` 目录,因为前端资源已经嵌入到二进制文件中了。 #### 方式2: 同时输出前端构建产物到本地(可选) 如果需要本地也有前端构建产物(用于开发或调试),可以使用脚本: ```bash # 使用脚本(自动构建前端并输出到本地 ui/dist,然后构建镜像) ./docker-build.sh ``` #### 运行 Docker 镜像 **使用 SQLite(最简单,无需配置数据库):** ```bash docker run -d \ -p 9000:9000 \ --name opsx-webhook \ lghost/opsx-webhook:latest ``` **使用 MySQL:** ```bash docker run -d \ -p 9000:9000 \ -e DB_DRIVER=mysql \ -e DB_HOST=127.0.0.1 \ -e DB_PORT=3306 \ -e DB_USER=root \ -e DB_PASSWORD=your_password \ -e DB_NAME=opsx_webhook \ --name opsx-webhook \ lghost/opsx-webhook:latest ``` **健康检查:** - 健康检查端点:`http://localhost:9000/health` - Docker 会自动进行健康检查,确保容器正常运行 **访问应用:** - Web 界面:`http://localhost:9000` - 默认账号:`admin` / `admin` ## 开发 ### 前端开发 ```bash cd ui npm install npm run dev ``` ### 后端开发 ```bash go run main.go ``` ## License MIT