服务器监测开关机网页
| app | ||
| src | ||
| static | ||
| config_add.php | ||
| index.php | ||
| mofangidc.php | ||
| README.md | ||
| 新开发文档.md | ||
VPS Hub - 多平台VPS监控与管理系统
📋 目录
✨ 功能特性
🎯 核心功能
- 多平台支持:支持魔方平台(智简魔方)、阿里云、腾讯云等主流VPS平台
- 实时监控:每5分钟自动Ping检测所有VPS的可用性
- 自动开机:检测到VPS关机时自动执行开机操作
- 状态管理:实时显示VPS的运行状态(开机/关机/未知)
- 详细信息:展示CPU、内存、磁盘、带宽、操作系统等配置信息
🔧 管理功能
- Web管理面板:美观的响应式Web界面
- 手动刷新:一键刷新VPS列表和详细信息
- 远程控制:支持开机、关机、硬重启操作
- 配置管理:轻松添加和管理多个VPS平台配置
- 统计信息:实时统计VPS总数、运行中数量、已关机数量
📊 监控功能
- Ping检测:定期检测VPS网络可达性
- 延迟记录:记录每次Ping的延迟时间
- 状态持久化:将VPS状态保存到SQLite数据库
- 历史数据:保留30天的Ping历史记录
- 每日摘要:每天0点生成前一天的可用性统计报告
🚀 智能优化
- API调用优化:Ping成功时不调用API,减少不必要的请求
- Token缓存:JWT Token缓存2小时,避免频繁登录
- 动态更新:只更新实际变化的字段,避免数据覆盖
- 防重复机制:使用唯一约束防止重复数据
- 错误重试:开机失败后自动重试并记录真实状态
🏗️ 系统架构
┌─────────────────────────────────────────────────────┐
│ Web前端 (index.php) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ VPS列表 │ │ 操作控制 │ │ 统计信息展示 │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ HTTP POST/GET
┌──────────────────────▼──────────────────────────────┐
│ PHP后端 (mofangidc.php) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ API封装 │ │Token管理 │ │ 数据库操作 │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ SQLite
┌──────────────────────▼──────────────────────────────┐
│ 数据库层 (SQLite) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ vps.db │ │vpslist.db│ │ status.db │ │
│ │(配置) │ │ (VPS列表)│ │ (监控记录) │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ Python监控服务 (monitor.py) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Ping检测 │ │ API调用 │ │ 定时任务 │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────┘
架构特点
- 前后端分离:PHP负责Web界面和API调用,Python负责后台监控
- 多数据库设计:三个独立的SQLite数据库,职责清晰
- 混合架构:PHP处理用户交互,Python处理定时任务
- 适配器模式:支持多平台扩展,易于添加新平台
💻 技术栈
后端
- PHP 7.4+:Web服务器端逻辑
- Python 3.6+:后台监控服务
- SQLite 3:轻量级数据库
前端
- HTML5/CSS3:页面结构和样式
- JavaScript:交互逻辑
- 响应式设计:支持移动端访问
依赖库
- PHP: cURL, PDO-SQLite
- Python: requests, schedule, sqlite3
🚀 快速开始
环境要求
- PHP 7.4 或更高版本
- Python 3.6 或更高版本
- SQLite 3
- Linux/Windows/macOS
安装步骤
1. 克隆项目
git clone https://git.masonliu.com/MasonLiu/VPSHUB.git
cd VPSHUB
2. 配置Web
直接将VPSHUB文件夹下的所有文件放置于网站路径下即可
温馨提示:
请将app路径设置为禁止外网访问(或添加Basic认证)。
3. 一键快速启动
chmod 755 app/install.sh
./app/install.sh
4. 访问Web界面
浏览器访问:http://your-domain.com/
首次访问会自动跳转到配置页面,添加第一个VPS平台配置。
⚙️ 配置说明
添加VPS平台配置
-
访问
config_add.php?pass=YOUR_API_PASS -
填写配置信息:
- API标识:自定义名称(唯一)
- 网站类型:选择平台(目前支持魔方平台)
- 网站链接:API根域名(不要包含路径)
- 账户:登录账号
- API密钥:登录密码或API Key
- 自动监控:是否启用自动监控
-
点击"保存配置"
配置示例
魔方平台配置:
API标识: 核云IDC
网站类型: 魔方平台
网站链接: https://www.heyunidc.cn
账户: 邮箱或电话号码
API密钥: your_api_key
自动监控: ✓
⚠️ 重要提示:
- 网站链接只填写根域名,不要包含
/v1或/api等路径 - API标识必须唯一,不能重复
- 确保账户和密码正确
📖 使用指南
Web管理面板
查看VPS列表
访问 index.php?pass=YOUR_API_PASS,可以看到:
- 按配置分组的VPS列表
- 每个VPS的状态、IP、配置信息
- 实时统计数据
操作VPS
每个VPS卡片提供三个操作按钮:
- ⚡ 开机:启动VPS
- 🔴 关机:关闭VPS
- 🔄 硬重启:强制重启VPS
操作后会显示成功/失败提示,5秒后自动消失。
刷新VPS列表
点击顶部工具栏的 "🔄 手动刷新VPS列表" 按钮:
- 从API获取最新的VPS列表
- 更新数据库中的VPS信息
- 获取每个VPS的详细配置(CPU、内存、磁盘、带宽、系统)
监控服务
启动监控
sudo systemctl start idc_monitor
查看状态
sudo systemctl status idc_monitor
停止监控
sudo systemctl stop idc_monitor
重启监控
sudo systemctl restart idc_monitor
监控流程
每5分钟执行一次监控循环
↓
1. Ping所有VPS
├─ Ping成功 → 标记status='on',不调用API
└─ Ping失败 → 标记为abnormal,等待下一步
↓
2. 检查Ping失败的VPS
├─ 全部正常 → 跳过
└─ 有失败的 → 调用API查询真实状态
├─ 状态为'on' → 可能是禁Ping,更新数据库
└─ 状态为'off' → 执行开机操作
├─ 等待60秒
└─ 验证开机结果(最多重试2次)
↓
3. 清理30天前的旧数据
↓
等待5分钟后下一次循环
🗄️ 数据库设计
数据库文件
| 文件名 | 用途 | 主要表 |
|---|---|---|
vps.db |
存储平台配置 | configs |
vpslist.db |
存储VPS列表 | vps_list |
status.db |
存储监控记录 | ping_status, vps_summary |
表结构
configs 表 (vps.db)
CREATE TABLE configs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
api_label TEXT NOT NULL UNIQUE, -- API标识
site_type TEXT NOT NULL, -- 平台类型
site_url TEXT, -- API地址
account TEXT NOT NULL, -- 账户
api_key TEXT NOT NULL, -- API密钥
auto_monitor BOOLEAN DEFAULT 1, -- 是否自动监控
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
vps_list 表 (vpslist.db)
CREATE TABLE vps_list (
id INTEGER PRIMARY KEY AUTOINCREMENT,
config_id INTEGER NOT NULL, -- 配置ID
vps_id INTEGER NOT NULL, -- VPS平台ID
domain TEXT, -- 域名
ip_address TEXT, -- IP地址
product_name TEXT, -- 产品名称
cpu_cores INTEGER, -- CPU核数
memory_size TEXT, -- 内存大小
disk_size TEXT, -- 磁盘大小
bandwidth TEXT, -- 带宽
os_type TEXT, -- 操作系统
status TEXT, -- 状态(on/off/unknown)
section BOOLEAN DEFAULT 0, -- 是否监控
last_check TIMESTAMP, -- 最后检查时间
FOREIGN KEY (config_id) REFERENCES configs(id),
UNIQUE(config_id, vps_id)
);
ping_status 表 (status.db)
CREATE TABLE ping_status (
id INTEGER PRIMARY KEY AUTOINCREMENT,
vps_id INTEGER NOT NULL, -- VPS ID
target TEXT NOT NULL, -- 目标(IP或域名)
status TEXT NOT NULL, -- 状态(normal/abnormal)
latency_ms REAL, -- 延迟(ms)
check_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
vps_summary 表 (status.db)
CREATE TABLE vps_summary (
id INTEGER PRIMARY KEY AUTOINCREMENT,
vps_id INTEGER NOT NULL, -- VPS ID
date DATE NOT NULL, -- 日期
avg_latency_ms REAL, -- 平均延迟
max_latency_ms REAL, -- 最大延迟
min_latency_ms REAL, -- 最小延迟
count_under_100 INTEGER, -- <100ms次数
count_100_to_300 INTEGER, -- 100-300ms次数
count_300_to_500 INTEGER, -- 300-500ms次数
count_abnormal INTEGER, -- 异常次数
availability TEXT, -- 可用性评分
UNIQUE(vps_id, date)
);
📡 API文档
魔方平台API
POST /login_api?account={acc}&password={api key}- 登录获取JWT Token
以下接口通过请求头进行认证 Authorization: JWT {token}
GET /hosts?page=&limit=- 获取VPS列表GET /hosts/{id}- 获取VPS详情GET /hosts/{id}/module/status?type=host- 获取VPS状态PUT /hosts/{id}/module/on- 开机PUT /hosts/{id}/module/off- 关机PUT /hosts/{id}/module/hard_reboot- 硬重启
🔍 监控服务
配置文件
监控服务配置文件位于:/etc/systemd/system/idc_monitor.service
[Unit]
Description=VPS Hub Monitor Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/VPSHUB/app
ExecStart=/usr/bin/python3 monitor.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
日志文件
- 正常日志:
app/logs/monitor.log - 错误日志:
app/logs/error.log
定时任务
- 监控循环:每5分钟执行一次
- 每日摘要:每天00:00生成前一天的统计报告
- 数据清理:每次循环清理30天前的Ping记录
🔒 安全说明
访问控制
- API密码保护:所有页面都需要通过
?pass=API_PASS验证 - 密码文件:存储在
app/pass.php,权限设置为 600 - 数据库保护:Nginx配置禁止直接访问
.db文件,或者限制访问app路径需要basic认证
Token安全
- Token缓存:JWT Token缓存2小时,减少登录次数
- 自动刷新:Token失效时自动重新登录
- 缓存文件:
app/token.php,权限设置为 600
最佳实践
- 修改默认密码:首次使用后立即修改API密码
- HTTPS:生产环境务必使用HTTPS
- 防火墙:限制访问IP范围
- 定期备份:定期备份数据库文件
- 日志审计:定期检查日志文件
❓ 常见问题
Q1: 页面显示"0台VPS"怎么办?
A:
- 点击"手动刷新VPS列表"按钮
- 检查配置是否正确(特别是site_url不要包含路径)
- 查看PHP错误日志:
tail -f /var/log/php/error.log
Q2: 监控服务无法启动?
A:
# 检查服务状态
sudo systemctl status idc_monitor
# 查看详细日志
journalctl -u idc_monitor -n 50
# 常见原因:
# 1. Python依赖未安装:pip install -r requirements.txt
# 2. 数据库文件权限问题:chown www-data:www-data app/db/*.db
# 3. 配置文件路径错误:检查service文件中的WorkingDirectory
Q3: exec函数被禁用怎么办?
A: 系统已经做了兼容处理:
- 如果exec被禁用,会显示友好提示
- 需要手动执行安装脚本:
sudo bash app/install.sh - 监控服务仍然可以正常运行
Q4: VPS状态显示"未知"?
A: 可能原因:
- 数据库中还没有该VPS的记录
- 多次调用导致状态被覆盖(已修复)
- API返回异常
解决方法:
- 手动刷新VPS列表
- 检查日志确认API调用是否正常
- 等待下一次监控循环
Q5: 如何添加新的VPS平台?
A:
- 在
app/monitor.py中创建新的适配器类 - 继承
PlatformAdapter基类 - 实现必要的方法(login, get_vps_list, get_vps_status等)
- 在
load_configs_and_create_adapters()中添加判断逻辑
示例:
class AliyunAdapter(PlatformAdapter):
def login(self):
# 实现阿里云登录逻辑
pass
def get_vps_list(self):
# 实现获取VPS列表逻辑
pass
Q6: 数据库文件在哪里?
A:
app/db/vps.db- 配置数据库app/db/vpslist.db- VPS列表数据库app/db/status.db- 监控状态数据库
可以使用SQLite工具查看:
sqlite3 app/db/vpslist.db
.tables
SELECT * FROM vps_list;
Q7: 如何备份数据?
A:
# 备份所有数据库
cp app/db/*.db backup/$(date +%Y%m%d)/
# 或使用sqlite3导出
sqlite3 app/db/vpslist.db ".dump" > backup/vpslist.sql
📄 许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件
📧 联系方式
- 项目地址: https://git.masonliu.com/MasonLiu/VPSHUB
- 作者: MasonLiu
- 邮箱: admin@masonliu.com
🙏 致谢
感谢以下开源项目:
⭐ 如果这个项目对您有帮助,请给个Star!
Made with ❤️ by MasonLiu
