---
name: atri_server_health
description: 通过SSH查询服务器运行状态,生成格式化健康报告,支持QQ和邮件双通道发送。涵盖系统负载、内存、磁盘、Docker容器、网络连通性等关键指标的状态判定。
---
# 📡 ATRI Server Health Report Skill
**Skill名称**:`atri_server_health`
**版本**:v2.0
**创建时间**:2026-04-27
**最后更新**:2026-04-29(新增T2I渲染流程)
---
## 🎯 Purpose
通过SSH查询服务器运行状态,生成美观的结构化健康报告。支持QQ文本发送和T2I图片渲染两种输出方式。
---
## ⚡ Triggers
- 主人指令:"检查服务器""服务器状态""健康报告""server status"
- 定时监控任务触发时
- 需要向主人报告服务器概况时
---
## 🛠️ Dependencies
| 依赖 | 说明 |
|:---|:---|
| **ssh_exec** | 用于在宿主机执行远程命令获取服务器数据 |
| **T2I服务** | `http://T2I服务地址:8999` 本地部署的HTML转图片服务 |
| **send_message_to_user** | 发送QQ消息/图片 |
---
## 📋 Procedure
### Step 1: 通过SSH获取实时服务器数据
调用 `ssh_exec` 采集以下数据:
```bash
# 主机名
hostname
# CPU核心数
nproc
# 系统负载
uptime | awk -F'load average:' '{print $2}'
# 运行时间(短格式)
uptime -p | sed 's/up //'
# 运行时间(天)
cat /proc/uptime | awk '{printf "%d", $1/86400}'
# 内存
free -h | awk 'NR==2{print $2" "$3" "$4}'
# Swap
free -h | awk 'NR==3{printf $2" "$3}'
# 磁盘
df -h / | tail -1 | awk '{print $2" "$3" "$4" "$5}'
# T2I服务状态
curl -s -o /dev/null -w "%{http_code}" http://localhost:8999/text2img/generate -X POST -d '{}'
# NapCat状态
docker ps --filter "name=napcat" --format "{{.Status}}"
# Docker容器数量
docker ps -q | wc -l
# 监听端口数
ss -tlnp | grep -c "LISTEN"
```
### Step 2: 填充HTML模板
将采集到的数据填入以下HTML模板:
```html
📡
服务器状态报告
{{HOSTNAME}}
CPU负载
{{LOAD_1M}} / {{LOAD_5M}} / {{LOAD_15M}}({{CPU_CORES}}核)
占用约{{LOAD_PERCENT}}%,{{LOAD_STATUS}}
内存
{{MEM_TOTAL}} / {{MEM_USED}}({{MEM_PERCENT}}%)
Swap {{SWAP_TOTAL}}/{{SWAP_USED}},{{MEM_STATUS}}
磁盘
{{DISK_TOTAL}} / {{DISK_USED}}({{DISK_PERCENT}}%)
可用{{DISK_AVAIL}} · {{DISK_NOTE}}
运行
{{UPTIME_SHORT}}
{{UPTIME_DAYS}}天连续运行 · 稳定
Docker:{{DOCKER_COUNT}}个容器全部运行 ✓
astrbot · napcat · 博客 · OJ · Nacos · MySQL · Redis
网络:{{PORTS}}端口监听 · T2I{{T2I_STATUS}} · NapCat{{NAPCAT_STATUS}}
代理:{{PROXY_STATUS}}
🤖 ATRI 🥕 {{TIME}} · 数据实时采集
```
### Step 3: 通过T2I渲染为图片
```python
import urllib.request, json
# 将填充好数据的HTML通过T2I渲染
html_content = "填充数据后的HTML"
data = json.dumps({
"html": html_content, "json": True,
"options": {"type": "png", "full_page": True, "viewport_width": 1200}
}).encode()
req = urllib.request.Request(
"http://172.17.0.1:8999/text2img/generate",
data=data, headers={"Content-Type":"application/json"}
)
with urllib.request.urlopen(req, timeout=30) as resp:
r = json.loads(resp.read())
img_name = r["data"]["id"].replace("data/", "")
# 下载图片到容器本地
with urllib.request.urlopen(
f"http://172.17.0.1:8999/text2img/data/{img_name}", timeout=30
) as resp:
img_data = resp.read()
local_path = f"/AstrBot/data/temp/server_report_{timestamp}.png"
with open(local_path, 'wb') as f:
f.write(img_data)
```
### Step 4: 发送图片到QQ
```python
send_message_to_user(messages=[{
"type": "image",
"path": local_path
}])
```
### Step 5: 备用方案(QQ离线时发邮件)
如果QQ不可用,调用 `smtp_send_html_email` 将报告作为HTML邮件发送到主人邮箱。
---
## ✅ Success Criteria
- [ ] SSH数据采集完整(CPU、内存、磁盘、Docker、T2I等)
- [ ] HTML模板正确填充实时数据
- [ ] T2I渲染成功返回图片ID
- [ ] 图片下载并成功发送到QQ
- [ ] 所有指标附带状态判定(🟢正常/🟡注意/🔴危险)
---
## 📝 状态判定标准
| 指标 | 🟢 正常 | 🟡 注意 | 🔴 危险 |
|:---|:---:|:---:|:---:|
| 内存使用率 | <70% | 70~85% | >85% |
| 磁盘使用率 | <75% | 75~90% | >90% |
| 系统负载(1min) | 2倍 |
| Docker容器 | 全部Up | 部分重启中 | 有Exited |
---
*创建者:ATRI(含主人亲自设计的精美HTML模板🥕)*
*最后更新:2026-04-29 01:12*