🚀 一个现代化的运维管理平台,集资产管理、工单管理、监控告警、作业编排于一体
- 物理服务器、云服务器、域名、SSL证书统一管理
- 支持资产分类、状态、IP地址、管理信息等完整字段
- 资产导入导出功能
- 工单创建、流转、审批全流程
- 支持多种工单类型(变更、故障、咨询等)
- 工单状态跟踪与统计
- 资产统计图表
- 证书到期预警
- 工单状态分布
- Alertmanager Webhook 接收
- 告警规则配置与管理
- 告警收敛与去重
- 告警→工单自动创建
- 飞书 Webhook 机器人
- 邮件 SMTP 发送
- Slack Incoming Webhook
- 通知模板配置
- 升级策略(超时未处理→升级)
- 批量主机选择执行
- Shell 命令/脚本执行
- SSH 远程执行
- 脚本库管理
- 执行历史记录
- 容量管理
- 变更日历
- 故障复盘
- 运维手册
- 拓扑管理
- SLA 配置
git clone https://github.com/yourusername/opspilot.git
cd opspilotnpm install# 复制环境变量模板
cp .env.example .env
# 编辑 .env 文件,设置必要的环境变量
# JWT_SECRET=your-secret-key-here
# ENCRYPTION_KEY=your-64-char-hex-encryption-key# 开发环境
JWT_SECRET=your-secret-key node server/index.js
# 生产环境(使用 pm2)
pm2 start ecosystem.config.js- 前端页面: http://localhost:3000/index.html
- API 文档: http://localhost:3000/api-docs
- 健康检查: http://localhost:3000/api/health
用户名: admin
密码: admin123
⚠️ 重要: 生产环境请立即修改默认密码!
- Node.js >= 18.0.0
- 2GB 内存
- 1GB 磁盘空间
- Node.js >= 20.0.0
- 4GB 内存
- 10GB 磁盘空间
- SSD 硬盘
- Linux (Ubuntu, CentOS, Debian)
- macOS
- Windows (WSL2 推荐)
# 克隆项目
git clone https://github.com/yourusername/opspilot.git
cd opspilot
# 安装依赖
npm install
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件
# 启动服务
JWT_SECRET=your-secret-key node server/index.js# 构建镜像
docker build -t opspilot:latest .
# 运行容器
docker run -d \
--name opspilot \
-p 3000:3000 \
-e JWT_SECRET=your-secret-key \
-e ENCRYPTION_KEY=your-64-char-hex-encryption-key \
-v opspilot-data:/app/data \
opspilot:latest# 安装 PM2
npm install -g pm2
# 启动服务
pm2 start ecosystem.config.js
# 保存 PM2 配置
pm2 save
pm2 startup
# 查看状态
pm2 status
pm2 logs opspilot| 变量名 | 必填 | 说明 | 默认值 | 示例 |
|---|---|---|---|---|
JWT_SECRET |
✅ | JWT 签名密钥 | - | your-secret-key-here |
ENCRYPTION_KEY |
✅ | AES-256-GCM 加密密钥 (64位hex) | - | a1b2c3d4e5f6... |
NODE_ENV |
❌ | 运行环境 | development |
production |
PORT |
❌ | 服务端口 | 3000 |
8080 |
# 生成 JWT 密钥
openssl rand -base64 32
# 生成 AES-256-GCM 密钥 (64位hex)
openssl rand -hex 32项目配置文件位于 config/ 目录:
business-config.json- 业务配置swagger.json- API 文档配置
所有受保护的 API 需要在请求头中携带 Token:
Authorization: Bearer <token>
POST /api/auth/login- 用户登录POST /api/auth/logout- 用户登出POST /api/auth/refresh- 刷新 Token
GET /api/assets- 资产列表POST /api/assets- 创建资产PUT /api/assets/:id- 更新资产DELETE /api/assets/:id- 删除资产
GET /api/workorders- 工单列表POST /api/workorders- 创建工单PUT /api/workorders/:id- 更新工单DELETE /api/workorders/:id- 删除工单
GET /api/jobs- 作业列表POST /api/jobs- 创建作业POST /api/jobs/run/:id- 执行作业POST /api/jobs/ssh- SSH 远程执行POST /api/jobs/batch-ssh- 批量 SSH 执行GET /api/jobs/assets/hosts- 主机列表GET /api/jobs/scripts- 脚本库列表POST /api/jobs/scripts- 新增脚本
GET /api/alerts- 告警列表POST /api/alerts/webhook- Alertmanager WebhookGET /api/alert-rules- 告警规则列表POST /api/alert-rules- 创建告警规则
GET /api/channels- 渠道列表POST /api/channels- 创建渠道GET /api/templates- 模板列表POST /api/templates- 创建模板
详细 API 文档请访问: http://localhost:3000/api-docs
ops-platform/
├── server/ # 后端服务
│ ├── index.js # 主入口文件
│ ├── routes/ # API 路由
│ │ ├── assets.js # 资产管理
│ │ ├── workorder.js # 工单管理
│ │ ├── jobs.js # 作业编排
│ │ ├── alerts.js # 监控告警
│ │ ├── notifications.js # 通知渠道
│ │ └── ... # 其他路由
│ ├── middleware/ # 中间件
│ ├── config/ # 配置文件
│ └── ops.db # SQLite 数据库
├── html/ # 前端页面
│ ├── index.html # 主页面
│ ├── asset.html # 资产管理
│ ├── workorder.html # 工单管理
│ ├── job.html # 作业编排
│ ├── alert.html # 监控告警
│ └── ... # 其他页面
├── css/ # 样式文件
├── js/ # JavaScript 文件
├── config/ # 配置文件
├── docs/ # 文档
├── backup/ # 备份文件
├── .env.example # 环境变量模板
├── ecosystem.config.js # PM2 配置
├── package.json # 项目依赖
└── README.md # 本文件
# 1. 克隆项目
git clone https://github.com/yourusername/opspilot.git
cd opspilot
# 2. 安装依赖
npm install
# 3. 配置环境变量
cp .env.example .env
# 编辑 .env 文件,设置 JWT_SECRET 和 ENCRYPTION_KEY
# 4. 启动服务
JWT_SECRET=your-secret-key node server/index.js- 使用 ESLint 进行代码检查
- 遵循 JavaScript Standard Style
- 文件命名使用小写+下划线
feat: 新功能
fix: 修复 bug
docs: 文档更新
style: 代码格式调整
refactor: 重构
test: 测试相关
chore: 构建/工具相关
main- 主分支develop- 开发分支feature/*- 功能分支hotfix/*- 紧急修复分支
项目使用 sql.js (WebAssembly SQLite),数据库迁移通过 migrateDatabase 函数自动执行。
新增迁移示例:
runMigration('v11_add_new_table', `
CREATE TABLE IF NOT EXISTS new_table (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
`);-
后端 API
- 在
server/routes/创建新的路由文件 - 在
server/index.js注册路由 - 添加数据库表和迁移
- 在
-
前端页面
- 在
html/创建新的 HTML 文件 - 在
js/extracted/创建对应的 JavaScript 文件 - 更新导航菜单
- 在
-
测试
- 手动测试 API 端点
- 测试前端交互
- 验证数据库操作
# 运行所有测试
npm test
# 运行特定测试
npm test -- --testPathPattern=assets
# 运行测试并生成覆盖率报告
npm run test:coverage# 测试健康检查
curl http://localhost:3000/api/health
# 测试登录
curl -X POST http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'
# 测试资产列表
curl http://localhost:3000/api/assets \
-H "Authorization: Bearer <token>"-
配置环境变量
export JWT_SECRET=your-production-secret export ENCRYPTION_KEY=your-production-encryption-key export NODE_ENV=production
-
使用 PM2 部署
npm install -g pm2 pm2 start ecosystem.config.js pm2 save pm2 startup
-
配置反向代理 (Nginx)
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
-
配置 SSL (Let's Encrypt)
certbot --nginx -d your-domain.com
# 备份数据库
cp server/ops.db backup/ops.db.$(date +%Y%m%d)
# 恢复数据库
cp backup/ops.db.YYYYMMDD server/ops.dbA: 修改端口或停止占用进程
# 查看占用端口的进程
lsof -i :3000
# 停止进程
kill -9 <PID>
# 或使用其他端口
PORT=8080 JWT_SECRET=your-secret-key node server/index.jsA: 检查数据库文件权限
chmod 644 server/ops.dbA: 检查静态文件路径和权限
ls -la html/
ls -la css/
ls -la js/A: 确保设置了正确的 JWT_SECRET 环境变量
export JWT_SECRET=your-secret-key我们欢迎所有形式的贡献!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'feat: Add AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
feat:- 新功能fix:- 修复 bugdocs:- 文档更新style:- 代码格式调整refactor:- 重构test:- 测试相关chore:- 构建/工具相关
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- Node.js - JavaScript 运行时
- Express.js - Web 框架
- sql.js - WebAssembly SQLite
- ssh2 - SSH 客户端库
- ✨ 新增作业编排功能
- ✨ 新增监控告警对接
- ✨ 新增通知渠道集成
- 🔧 优化资产管理
- 🔧 优化工单管理
- ✨ 资产管理
- ✨ 工单管理
- ✨ 仪表盘
Made with ❤️ by OpsPilot Team