2026-01-04 16:49:22 +08:00
|
|
|
|
# 服务状态监控系统
|
|
|
|
|
|
|
|
|
|
|
|
## 项目概述
|
|
|
|
|
|
|
|
|
|
|
|
这是一个基于Django框架开发的服务状态监控系统,用于实时监控各种服务的运行状态,支持多种检测方式,并提供Web界面和REST API接口。
|
|
|
|
|
|
|
|
|
|
|
|
## 主要功能
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 服务管理
|
|
|
|
|
|
- 支持服务分组管理
|
|
|
|
|
|
- 可添加多种类型的服务监控:
|
|
|
|
|
|
- Ping检测:通过ICMP ping检查主机可达性
|
|
|
|
|
|
- TCP端口检测:检查指定主机的TCP端口是否开放
|
|
|
|
|
|
- HTTP请求:发送HTTP请求检查Web服务状态
|
|
|
|
|
|
- 自定义脚本:支持通过自定义脚本进行服务检测
|
|
|
|
|
|
- 支持服务启用/禁用功能
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 状态监控
|
|
|
|
|
|
- 实时记录服务状态变化
|
|
|
|
|
|
- 保存服务检测历史记录
|
|
|
|
|
|
- 记录响应时间和错误信息
|
|
|
|
|
|
- 自动更新服务状态
|
|
|
|
|
|
|
|
|
|
|
|
### 3. Web界面
|
|
|
|
|
|
- 服务列表展示
|
|
|
|
|
|
- 服务详细信息查看
|
|
|
|
|
|
- 检测记录历史查询
|
|
|
|
|
|
- 直观的状态可视化
|
|
|
|
|
|
|
|
|
|
|
|
### 4. REST API
|
|
|
|
|
|
- 提供完整的API接口
|
|
|
|
|
|
- 支持服务信息查询
|
|
|
|
|
|
- 支持检测记录查询
|
|
|
|
|
|
- 支持API文档浏览
|
|
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
- **后端框架**:Django 4.2
|
|
|
|
|
|
- **API框架**:Django REST Framework
|
|
|
|
|
|
- **数据库**:SQLite(默认),支持扩展到MySQL/PostgreSQL
|
|
|
|
|
|
- **语言**:Python 3.8+
|
|
|
|
|
|
- **前端**:Django模板系统
|
|
|
|
|
|
|
|
|
|
|
|
## 安装部署
|
|
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
### 1. 环境准备(Ubuntu 22.04/24.04)
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-04 16:56:37 +08:00
|
|
|
|
# 更新系统包
|
|
|
|
|
|
sudo apt update && sudo apt upgrade -y
|
|
|
|
|
|
|
|
|
|
|
|
# 安装Python3和pip
|
|
|
|
|
|
sudo apt install python3 python3-pip python3-venv python3-dev -y
|
|
|
|
|
|
|
|
|
|
|
|
# 安装Git
|
|
|
|
|
|
sudo apt install git -y
|
|
|
|
|
|
|
|
|
|
|
|
# 克隆项目(示例路径,根据实际情况调整)
|
|
|
|
|
|
cd /opt
|
|
|
|
|
|
sudo git clone https://your-repo-url/statuspage.git
|
|
|
|
|
|
cd statuspage
|
|
|
|
|
|
|
|
|
|
|
|
# 创建虚拟环境
|
|
|
|
|
|
sudo python3 -m venv venv
|
|
|
|
|
|
|
|
|
|
|
|
# 激活虚拟环境
|
|
|
|
|
|
source venv/bin/activate
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
# 安装依赖
|
2026-01-04 16:56:37 +08:00
|
|
|
|
pip install --upgrade pip
|
2026-01-04 16:49:22 +08:00
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 数据库迁移
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-04 16:56:37 +08:00
|
|
|
|
# 激活虚拟环境(如果未激活)
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 执行数据库迁移(使用自定义settings文件)
|
|
|
|
|
|
python manage.py migrate --settings=statuspage.生产系统settings
|
|
|
|
|
|
|
|
|
|
|
|
# 创建超级用户(用于后台管理)
|
|
|
|
|
|
python manage.py createsuperuser --settings=statuspage.生产系统settings
|
2026-01-04 16:49:22 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
### 3. 收集静态文件
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-04 16:56:37 +08:00
|
|
|
|
# 激活虚拟环境(如果未激活)
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 收集静态文件(使用自定义settings文件)
|
|
|
|
|
|
python manage.py collectstatic --noinput --settings=statuspage.生产系统settings
|
2026-01-04 16:49:22 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
### 4. 开发服务器(仅用于测试)
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
# 激活虚拟环境(如果未激活)
|
|
|
|
|
|
source venv/bin/activate
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
# 启动开发服务器(仅本地访问,使用自定义settings文件)
|
|
|
|
|
|
python manage.py runserver --settings=statuspage.生产系统settings
|
|
|
|
|
|
|
|
|
|
|
|
# 或允许外部访问(开发环境)
|
|
|
|
|
|
python manage.py runserver 0.0.0.0:8000 --settings=statuspage.生产系统settings
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
访问地址:http://your-server-ip:8000
|
|
|
|
|
|
|
|
|
|
|
|
### 5. 生产环境部署(Ubuntu)
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.1 安装Gunicorn和Nginx
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-04 16:56:37 +08:00
|
|
|
|
# 激活虚拟环境
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
2026-01-04 16:49:22 +08:00
|
|
|
|
# 安装Gunicorn
|
|
|
|
|
|
pip install gunicorn
|
|
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
# 退出虚拟环境
|
|
|
|
|
|
deactivate
|
|
|
|
|
|
|
|
|
|
|
|
# 安装Nginx
|
|
|
|
|
|
sudo apt install nginx -y
|
2026-01-04 16:49:22 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
#### 5.2 创建Gunicorn系统服务
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建服务文件
|
|
|
|
|
|
sudo nano /etc/systemd/system/statuspage.service
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
在文件中添加以下内容:
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
[Unit]
|
|
|
|
|
|
Description=Gunicorn instance to serve statuspage
|
|
|
|
|
|
After=network.target
|
|
|
|
|
|
|
|
|
|
|
|
[Service]
|
|
|
|
|
|
User=www-data
|
|
|
|
|
|
Group=www-data
|
|
|
|
|
|
WorkingDirectory=/opt/statuspage
|
|
|
|
|
|
Environment="PATH=/opt/statuspage/venv/bin"
|
|
|
|
|
|
Environment="DJANGO_SETTINGS_MODULE=statuspage.生产系统settings"
|
|
|
|
|
|
ExecStart=/opt/statuspage/venv/bin/gunicorn --workers 3 --bind unix:/opt/statuspage/statuspage.sock statuspage.wsgi:application
|
|
|
|
|
|
|
|
|
|
|
|
[Install]
|
|
|
|
|
|
WantedBy=multi-user.target
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
启动并启用服务:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 重新加载systemd
|
|
|
|
|
|
sudo systemctl daemon-reload
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
|
|
|
|
|
sudo systemctl start statuspage
|
|
|
|
|
|
|
|
|
|
|
|
# 开机自启
|
|
|
|
|
|
sudo systemctl enable statuspage
|
|
|
|
|
|
|
|
|
|
|
|
# 查看服务状态
|
|
|
|
|
|
sudo systemctl status statuspage
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.3 配置Nginx
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建Nginx配置文件
|
|
|
|
|
|
sudo nano /etc/nginx/sites-available/statuspage
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
添加以下配置:
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
```nginx
|
|
|
|
|
|
server {
|
|
|
|
|
|
listen 80;
|
2026-01-04 16:56:37 +08:00
|
|
|
|
server_name your-domain.com www.your-domain.com;
|
|
|
|
|
|
charset utf-8;
|
2026-01-04 16:49:22 +08:00
|
|
|
|
|
|
|
|
|
|
location / {
|
2026-01-04 16:56:37 +08:00
|
|
|
|
include proxy_params;
|
|
|
|
|
|
proxy_pass http://unix:/opt/statuspage/statuspage.sock;
|
2026-01-04 16:49:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
location /static/ {
|
2026-01-04 16:56:37 +08:00
|
|
|
|
alias /opt/statuspage/static/;
|
|
|
|
|
|
expires 30d;
|
2026-01-04 16:49:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
location /media/ {
|
2026-01-04 16:56:37 +08:00
|
|
|
|
alias /opt/statuspage/media/;
|
|
|
|
|
|
expires 30d;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 错误页面配置
|
|
|
|
|
|
error_page 404 /404.html;
|
|
|
|
|
|
error_page 500 502 503 504 /500.html;
|
|
|
|
|
|
location = /500.html {
|
|
|
|
|
|
root /opt/statuspage/static;
|
2026-01-04 16:49:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:56:37 +08:00
|
|
|
|
启用站点并重启Nginx:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 启用站点
|
|
|
|
|
|
sudo ln -s /etc/nginx/sites-available/statuspage /etc/nginx/sites-enabled/
|
|
|
|
|
|
|
|
|
|
|
|
# 测试Nginx配置
|
|
|
|
|
|
sudo nginx -t
|
|
|
|
|
|
|
|
|
|
|
|
# 重启Nginx
|
|
|
|
|
|
sudo systemctl restart nginx
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.4 配置防火墙
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 允许SSH、HTTP和HTTPS流量
|
|
|
|
|
|
sudo ufw allow ssh
|
|
|
|
|
|
sudo ufw allow 'Nginx Full'
|
|
|
|
|
|
|
|
|
|
|
|
# 启用防火墙
|
|
|
|
|
|
sudo ufw enable
|
|
|
|
|
|
|
|
|
|
|
|
# 查看防火墙状态
|
|
|
|
|
|
sudo ufw status
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.5 配置HTTPS(推荐)
|
|
|
|
|
|
|
|
|
|
|
|
使用Certbot获取免费SSL证书:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 安装Certbot
|
|
|
|
|
|
sudo apt install certbot python3-certbot-nginx -y
|
|
|
|
|
|
|
|
|
|
|
|
# 获取并配置SSL证书
|
|
|
|
|
|
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
|
|
|
|
|
|
|
|
|
|
|
|
# 配置自动续约
|
|
|
|
|
|
sudo certbot renew --dry-run
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 6. 部署验证
|
|
|
|
|
|
|
|
|
|
|
|
访问以下地址验证部署:
|
|
|
|
|
|
- Web界面:http://your-domain.com 或 https://your-domain.com
|
|
|
|
|
|
- Django后台:http://your-domain.com/admin
|
|
|
|
|
|
- API文档:http://your-domain.com/api/docs/
|
|
|
|
|
|
|
|
|
|
|
|
## 7. 生产环境配置注意事项
|
|
|
|
|
|
|
|
|
|
|
|
在生产环境部署前,务必修改以下配置项:
|
|
|
|
|
|
|
|
|
|
|
|
### 7.1 修改配置文件
|
|
|
|
|
|
|
|
|
|
|
|
编辑 `statuspage/生产系统settings.py` 文件,修改以下关键配置:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 1. 关闭DEBUG模式
|
|
|
|
|
|
DEBUG = False
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 设置允许的主机名或IP地址
|
|
|
|
|
|
ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com', 'your-server-ip']
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 生成新的SECRET_KEY
|
|
|
|
|
|
# 可以使用Django提供的密钥生成工具:
|
|
|
|
|
|
# python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
|
|
|
|
|
SECRET_KEY = 'your-new-secret-key-here'
|
|
|
|
|
|
|
|
|
|
|
|
# 4. 可选:配置更安全的数据库(如PostgreSQL或MySQL)
|
|
|
|
|
|
# DATABASES = {
|
|
|
|
|
|
# 'default': {
|
|
|
|
|
|
# 'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
|
|
|
|
|
# 'NAME': 'statuspage',
|
|
|
|
|
|
# 'USER': 'dbuser',
|
|
|
|
|
|
# 'PASSWORD': 'dbpassword',
|
|
|
|
|
|
# 'HOST': 'localhost',
|
|
|
|
|
|
# 'PORT': '5432',
|
|
|
|
|
|
# }
|
|
|
|
|
|
# }
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 7.2 重启服务
|
|
|
|
|
|
|
|
|
|
|
|
修改配置后,需要重启Gunicorn服务:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
sudo systemctl restart statuspage
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:49:22 +08:00
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
.
|
|
|
|
|
|
├── status/ # 主应用目录
|
|
|
|
|
|
│ ├── migrations/ # 数据库迁移文件
|
|
|
|
|
|
│ ├── templates/ # HTML模板
|
|
|
|
|
|
│ │ └── status/ # 状态相关模板
|
|
|
|
|
|
│ ├── __init__.py
|
|
|
|
|
|
│ ├── admin.py # Django后台管理
|
|
|
|
|
|
│ ├── api_urls.py # API路由配置
|
|
|
|
|
|
│ ├── api_views.py # API视图
|
|
|
|
|
|
│ ├── apps.py # 应用配置
|
|
|
|
|
|
│ ├── models.py # 数据模型
|
|
|
|
|
|
│ ├── serializers.py # API序列化器
|
|
|
|
|
|
│ ├── tests.py # 测试文件
|
|
|
|
|
|
│ ├── urls.py # Web路由配置
|
|
|
|
|
|
│ ├── utils.py # 工具函数
|
|
|
|
|
|
│ └── views.py # Web视图
|
|
|
|
|
|
├── statuspage/ # 项目配置目录
|
|
|
|
|
|
│ ├── __init__.py
|
|
|
|
|
|
│ ├── asgi.py # ASGI配置
|
|
|
|
|
|
│ ├── urls.py # 根路由配置
|
|
|
|
|
|
│ ├── wsgi.py # WSGI配置
|
|
|
|
|
|
│ └── 生产系统settings.py # 生产环境配置
|
|
|
|
|
|
├── .gitignore
|
|
|
|
|
|
├── db.sqlite3 # SQLite数据库文件
|
|
|
|
|
|
├── manage.py # Django管理脚本
|
|
|
|
|
|
└── requirements.txt # 项目依赖
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 使用说明
|
|
|
|
|
|
|
|
|
|
|
|
### Web界面
|
|
|
|
|
|
|
|
|
|
|
|
1. **服务列表**:访问首页查看所有服务的状态
|
|
|
|
|
|
2. **服务详情**:点击服务名称查看详细信息和历史记录
|
|
|
|
|
|
3. **API文档**:访问 `/api/docs/` 查看API文档
|
|
|
|
|
|
|
|
|
|
|
|
### API接口
|
|
|
|
|
|
|
|
|
|
|
|
#### 主要API端点
|
|
|
|
|
|
|
|
|
|
|
|
- `GET /api/services/` - 获取所有服务列表
|
|
|
|
|
|
- `GET /api/services/<id>/` - 获取单个服务详情
|
|
|
|
|
|
- `GET /api/services/<id>/records/` - 获取服务检测记录
|
|
|
|
|
|
- `GET /api/groups/` - 获取服务分组列表
|
|
|
|
|
|
|
|
|
|
|
|
## 开发说明
|
|
|
|
|
|
|
|
|
|
|
|
### 日志记录
|
|
|
|
|
|
|
|
|
|
|
|
项目使用loguru库进行日志记录,在关键操作处添加了日志输出,便于调试和监控。
|
|
|
|
|
|
|
|
|
|
|
|
### 扩展建议
|
|
|
|
|
|
|
|
|
|
|
|
1. 添加定时检测任务(可使用Celery或Django Q)
|
|
|
|
|
|
2. 添加告警功能(邮件、短信、微信通知等)
|
|
|
|
|
|
3. 添加服务状态统计和图表展示
|
|
|
|
|
|
4. 实现更完善的权限管理
|
|
|
|
|
|
5. 添加服务依赖关系管理
|
|
|
|
|
|
|
|
|
|
|
|
## 许可证
|
|
|
|
|
|
|
|
|
|
|
|
MIT License
|