# VPS Hub - 多平台VPS监控与管理系统

**一个强大的多平台VPS监控、管理和自动重启系统**
[功能特性](#-功能特性) • [快速开始](#-快速开始) • [架构设计](#-架构设计) • [API文档](#-api文档) • [常见问题](#-常见问题)
---
## 📋 目录
- [功能特性](#-功能特性)
- [系统架构](#-系统架构)
- [技术栈](#-技术栈)
- [快速开始](#-快速开始)
- [配置说明](#-配置说明)
- [使用指南](#-使用指南)
- [数据库设计](#-数据库设计)
- [API文档](#-api文档)
- [监控服务](#-监控服务)
- [安全说明](#-安全说明)
- [常见问题](#-常见问题)
- [许可证](#-许可证)
---
## ✨ 功能特性
### 🎯 核心功能
- **多平台支持**:支持魔方平台(智简魔方)、阿里云、腾讯云等主流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调用 │ │ 定时任务 │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────┘
```
### 架构特点
1. **前后端分离**:PHP负责Web界面和API调用,Python负责后台监控
2. **多数据库设计**:三个独立的SQLite数据库,职责清晰
3. **混合架构**:PHP处理用户交互,Python处理定时任务
4. **适配器模式**:支持多平台扩展,易于添加新平台
---
## 💻 技术栈
### 后端
- **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. 克隆项目
```bash
git clone https://git.masonliu.com/MasonLiu/VPSHUB.git
cd VPSHUB
```
#### 2. 配置Web
直接将VPSHUB文件夹下的所有文件放置于网站路径下即可
**温馨提示**:
请将app路径设置为禁止外网访问(或添加Basic认证)。
#### 3. 一键快速启动
```bash
chmod 755 app/install.sh
./app/install.sh
```
#### 4. 访问Web界面
浏览器访问:`http://your-domain.com/`
首次访问会自动跳转到配置页面,添加第一个VPS平台配置。
---
## ⚙️ 配置说明
### 添加VPS平台配置
1. 访问 `config_add.php?pass=YOUR_API_PASS`
2. 填写配置信息:
- **API标识**:自定义名称(唯一)
- **网站类型**:选择平台(目前支持魔方平台)
- **网站链接**:API根域名(不要包含路径)
- **账户**:登录账号
- **API密钥**:登录密码或API Key
- **自动监控**:是否启用自动监控
3. 点击"保存配置"
### 配置示例
**魔方平台配置**:
```
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列表" 按钮:
1. 从API获取最新的VPS列表
2. 更新数据库中的VPS信息
3. 获取每个VPS的详细配置(CPU、内存、磁盘、带宽、系统)
### 监控服务
#### 启动监控
```bash
sudo systemctl start idc_monitor
```
#### 查看状态
```bash
sudo systemctl status idc_monitor
```
#### 停止监控
```bash
sudo systemctl stop idc_monitor
```
#### 重启监控
```bash
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)
```sql
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)
```sql
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)
```sql
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)
```sql
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`
```ini
[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
### 最佳实践
1. **修改默认密码**:首次使用后立即修改API密码
2. **HTTPS**:生产环境务必使用HTTPS
3. **防火墙**:限制访问IP范围
4. **定期备份**:定期备份数据库文件
5. **日志审计**:定期检查日志文件
---
## ❓ 常见问题
### Q1: 页面显示"0台VPS"怎么办?
**A**:
1. 点击"手动刷新VPS列表"按钮
2. 检查配置是否正确(特别是site_url不要包含路径)
3. 查看PHP错误日志:`tail -f /var/log/php/error.log`
---
### Q2: 监控服务无法启动?
**A**:
```bash
# 检查服务状态
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**:
可能原因:
1. 数据库中还没有该VPS的记录
2. 多次调用导致状态被覆盖(已修复)
3. API返回异常
解决方法:
- 手动刷新VPS列表
- 检查日志确认API调用是否正常
- 等待下一次监控循环
---
### Q5: 如何添加新的VPS平台?
**A**:
1. 在 `app/monitor.py` 中创建新的适配器类
2. 继承 `PlatformAdapter` 基类
3. 实现必要的方法(login, get_vps_list, get_vps_status等)
4. 在 `load_configs_and_create_adapters()` 中添加判断逻辑
示例:
```python
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工具查看:
```bash
sqlite3 app/db/vpslist.db
.tables
SELECT * FROM vps_list;
```
---
### Q7: 如何备份数据?
**A**:
```bash
# 备份所有数据库
cp app/db/*.db backup/$(date +%Y%m%d)/
# 或使用sqlite3导出
sqlite3 app/db/vpslist.db ".dump" > backup/vpslist.sql
```
---
## 📄 许可证
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件
---
## 📧 联系方式
- **项目地址**: [https://git.masonliu.com/MasonLiu/VPSHUB](https://git.masonliu.com/MasonLiu/VPSHUB)
- **作者**: MasonLiu
- **邮箱**: admin@masonliu.com
---
## 🙏 致谢
感谢以下开源项目:
- [PHP](https://www.php.net/)
- [Python](https://www.python.org/)
- [SQLite](https://www.sqlite.org/)
- [智简魔方财务系统](https://www.idcsmart.com/)
---
**⭐ 如果这个项目对您有帮助,请给个Star!**
Made with ❤️ by MasonLiu