master
IPMI Monitor
基于 Web 的 IPMI 服务器硬件监控系统,实时采集和展示服务器温度、风扇转速、电源状态等关键指标,支持告警通知。
功能特性
- 🖥️ 多服务器管理 - 支持添加和管理多台 IPMI 服务器
- 📊 实时监控 - 实时采集温度、风扇转速、电压、电源功耗等传感器数据
- 📈 历史趋势 - 基于 InfluxDB 时序数据库,支持历史数据查询和趋势图表
- ⚠️ 智能告警 - 可配置温度、风扇、功耗等阈值,触发告警通知
- 📧 多渠道通知 - 支持邮件、Webhook(Slack / 钉钉 / 企业微信)告警推送
- 🐳 一键部署 - Docker Compose 一键部署,开箱即用
- 📱 响应式界面 - 纯静态前端,适配桌面和移动设备
- 🔌 API 驱动 - 完整的 RESTful API,支持二次开发
技术栈
| 组件 | 技术 |
|---|---|
| 后端 | Python 3.11 + FastAPI + Uvicorn |
| 数据库 | InfluxDB 2.7 (时序数据库) |
| 前端 | HTML / CSS / JavaScript (纯静态) |
| 监控采集 | ipmitool |
| 容器化 | Docker + Docker Compose |
快速开始(Docker Compose 一键部署)
前置要求
- Docker >= 20.10
- Docker Compose >= 2.0
部署步骤
- 克隆项目
git clone <repository-url> /opt/ipmi-monitor
cd /opt/ipmi-monitor
- 配置环境变量
cp .env.example .env
# 编辑 .env 文件,修改密码、Token 等敏感配置
vim .env
- 一键启动
# 使用启动脚本(推荐)
chmod +x start.sh
./start.sh
# 或手动启动
docker compose up -d
- 访问系统
- 前端界面: http://your-server:8000
- API 文档: http://your-server:8000/docs
- InfluxDB 管理界面: http://your-server:8086
- 添加第一台服务器
在 Web 界面中点击「添加服务器」,填写 IPMI 连接信息:
- 服务器名称(别名)
- IPMI IP 地址
- 用户名 / 密码
手动部署步骤
1. 安装依赖
# 安装 ipmitool
apt-get install -y ipmitool
# 安装 Python 依赖
cd backend
pip install -r requirements.txt
2. 安装并配置 InfluxDB
# 参考 InfluxDB 官方文档安装 InfluxDB 2.7
# 配置组织、Bucket 和 API Token
3. 配置环境变量
cp .env.example .env
# 编辑 .env,配置 InfluxDB 连接信息
vim .env
4. 启动后端服务
cd backend
uvicorn app.main:app --host 0.0.0.0 --port 8000
5. 使用 systemd 管理(可选)
# /etc/systemd/system/ipmi-monitor.service
[Unit]
Description=IPMI Monitor Backend
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/ipmi-monitor/backend
EnvironmentFile=/opt/ipmi-monitor/.env
ExecStart=/usr/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
环境变量说明
| 变量名 | 默认值 | 说明 |
|---|---|---|
INFLUXDB_USERNAME |
admin |
InfluxDB 管理员用户名 |
INFLUXDB_PASSWORD |
admin123456 |
InfluxDB 管理员密码 |
INFLUXDB_ORG |
ipmi-monitor |
InfluxDB 组织名称 |
INFLUXDB_BUCKET |
metrics |
InfluxDB 存储桶名称 |
INFLUXDB_TOKEN |
my-super-secret-token |
InfluxDB API Token |
INFLUXDB_PORT |
8086 |
InfluxDB 端口映射 |
COMPOSE_PROJECT_NAME |
ipmi-monitor |
Docker Compose 项目名;会影响命名卷名称,生产环境必须保持稳定 |
BACKEND_PORT |
8000 |
后端服务端口映射 |
DATABASE_URL |
sqlite+aiosqlite:///./data/ipmi_monitor.db |
后端 SQLite 数据库地址,Docker 部署时位于 /app/data 命名卷中 |
REQUIRE_EXISTING_DATABASE |
false |
是否要求启动前数据库文件已存在;新环境保持 false,已有生产数据环境建议设为 true |
MIN_EXPECTED_HOSTS |
0 |
数据库最少主机数量保护;新环境保持 0,生产环境可设为预期下限,如 50 |
POLL_INTERVAL |
60 |
数据采集间隔(秒) |
LOG_LEVEL |
INFO |
日志级别 |
ALERT_TEMP_THRESHOLD |
80 |
温度告警阈值(°C) |
ALERT_FAN_THRESHOLD |
0 |
风扇转速告警阈值(RPM,0 禁用) |
ALERT_POWER_THRESHOLD |
500 |
功耗告警阈值(W,0 禁用) |
SMTP_HOST |
- | SMTP 服务器地址 |
SMTP_PORT |
587 |
SMTP 端口 |
SMTP_USER |
- | SMTP 用户名 |
SMTP_PASSWORD |
- | SMTP 密码 |
ALERT_EMAIL_FROM |
- | 告警发件邮箱 |
ALERT_EMAIL_TO |
- | 告警收件邮箱(逗号分隔) |
WEBHOOK_URL |
- | Webhook 告警 URL |
数据持久化与生产环境保护
本项目有两类持久化数据:
- 后端 SQLite 数据库:保存用户、主机、分组、告警规则、告警历史等配置数据。Docker 部署时默认存放在 backend 的
/app/data/ipmi_monitor.db,对应 Docker 命名卷backend-data。 - InfluxDB 时序数据:保存传感器历史指标。Docker 部署时默认挂载
./data/influxdb到容器/var/lib/influxdb2。
新环境首次部署
新环境请保持默认配置:
COMPOSE_PROJECT_NAME=ipmi-monitor
REQUIRE_EXISTING_DATABASE=false
MIN_EXPECTED_HOSTS=0
含义:
- 允许后端自动创建 SQLite 数据库和表结构
- 允许自动创建默认管理员账号
- 适合测试环境、新服务器首次初始化、还没有导入生产数据的环境
启动:
cp .env.example .env
vim .env
bash scripts/preflight-data.sh
docker compose up -d --build
已有数据的生产环境
当环境已经导入真实主机、分组、告警规则后,建议开启生产保护:
COMPOSE_PROJECT_NAME=ipmi-monitor
REQUIRE_EXISTING_DATABASE=true
MIN_EXPECTED_HOSTS=50
MIN_EXPECTED_HOSTS 请按你的生产规模设置为合理下限。例如生产应有 100 台左右主机,可以设置为 50;如果只有 10 台,可以设置为 5。
开启后:
- 如果 SQLite 数据库文件不存在,后端会拒绝启动
- 如果数据库里的主机数量低于
MIN_EXPECTED_HOSTS,后端会拒绝启动 - 可以防止由于 Docker Compose 项目名、项目目录或 volume 变化导致挂载到空数据库后仍然正常启动
更新生产环境前的检查流程
生产环境更新前建议先检查数据挂载:
cd /path/to/ipmi-monitor
bash scripts/preflight-data.sh
确认输出里的数据库统计符合预期,例如:
hosts: 107
host_groups: 41
alert_rules: 4
alert_history: 244
再更新:
git fetch origin
git pull --ff-only origin master
bash scripts/preflight-data.sh
docker compose up -d --build backend
docker compose ps
避免数据丢失的注意事项
不要在生产环境随意执行以下命令,除非已经确认备份并明确知道后果:
docker compose down -v
docker system prune --volumes
docker volume rm ...
rm -rf data/
COMPOSE_PROJECT_NAME 会影响 Docker 命名卷名称。生产环境请保持稳定,不要随意修改,否则可能会创建新的空 volume,导致页面看起来像“数据没了”。
API 文档概览
启动服务后,访问 http://your-server:8000/docs 查看完整的 Swagger UI 文档。
主要 API 端点
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/health |
健康检查 |
GET |
/api/servers |
获取所有服务器列表 |
POST |
/api/servers |
添加服务器 |
PUT |
/api/servers/{id} |
更新服务器信息 |
DELETE |
/api/servers/{id} |
删除服务器 |
POST |
/api/servers/{id}/scan |
立即扫描服务器传感器 |
GET |
/api/servers/{id}/sensors |
获取服务器传感器数据 |
GET |
/api/servers/{id}/metrics |
获取历史指标数据 |
GET |
/api/metrics/temperature |
获取所有服务器温度数据 |
GET |
/api/metrics/fan |
获取所有服务器风扇数据 |
GET |
/api/metrics/power |
获取所有服务器功耗数据 |
GET |
/api/alerts |
获取告警列表 |
PUT |
/api/alerts/config |
更新告警配置 |
GET |
/api/dashboard |
获取仪表盘汇总数据 |
告警配置说明
告警触发条件
- 温度告警: 当任意温度传感器读数超过
ALERT_TEMP_THRESHOLD时触发 - 风扇告警: 当风扇转速低于
ALERT_FAN_THRESHOLD时触发(设为 0 禁用) - 功耗告警: 当功耗超过
ALERT_POWER_THRESHOLD时触发(设为 0 禁用)
告警通知渠道
邮件通知
在 .env 中配置 SMTP 信息即可启用:
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-password
ALERT_EMAIL_FROM=your-email@gmail.com
ALERT_EMAIL_TO=admin1@example.com,admin2@example.com
Webhook 通知
支持标准 Webhook 格式,可对接以下平台:
- Slack: 填入 Slack Incoming Webhook URL
- 钉钉: 填入钉钉机器人 Webhook URL
- 企业微信: 填入企业微信机器人 Webhook URL
- 自定义: 填入任意 Webhook URL,POST JSON 格式通知
WEBHOOK_URL=https://hooks.slack.com/services/xxx/yyy/zzz
截图
仪表盘
📸 仪表盘页面
展示所有服务器的概览信息,包括:
- 服务器在线/离线状态
- 关键温度指标
- 风扇运行状态
- 实时功耗统计
- 最近告警摘要
服务器详情
📸 服务器详情页面
单台服务器的详细监控数据:
- 所有传感器列表及当前读数
- 温度趋势图(1h / 6h / 24h / 7d)
- 风扇转速历史图表
- 电压稳定性图表
- 功耗变化趋势
告警管理
📸 告警管理页面
告警记录和配置管理:
- 历史告警列表
- 告警阈值配置
- 通知渠道设置
- 告警确认/静默操作
服务器管理
📸 服务器管理页面
添加和管理监控服务器:
- 服务器列表(名称、IP、状态)
- 添加/编辑/删除服务器
- 连接测试
- 批量操作
常见问题
ipmitool 无法连接服务器
- 确认目标服务器 IPMI/BMC 已启用
- 确认网络连通性:
ping <ipmi-ip> - 确认 IPMI 凭据正确
- 检查防火墙规则(默认端口 623/UDP)
Docker 部署后无法访问
- 检查容器状态:
docker compose ps - 查看日志:
docker compose logs backend - 确认端口未被占用:
ss -tlnp | grep 8000
数据采集失败
- 确认后端容器已安装 ipmitool
- 确认容器网络可达 IPMI 地址
- 查看后端日志排查具体错误
License
This project is licensed under the MIT License. See the LICENSE file for details.
MIT License
Copyright (c) 2024 IPMI Monitor Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Description
Languages
Vue
47.6%
Python
47%
Shell
3.2%
JavaScript
1.7%
Dockerfile
0.4%
Other
0.1%