--- name: atri_server_health description: 通过SSH查询服务器运行状态,生成格式化健康报告,支持QQ和邮件双通道发送。涵盖系统负载、内存、磁盘、Docker容器、网络连通性等关键指标的状态判定。 --- # 📡 ATRI Server Health Report Skill **Skill名称**:`atri_server_health` **版本**:v2.1 **创建时间**:2026-04-27 **最后更新**:2026-05-03(修复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}' # 磁盘(数据盘/www) df -h /www 2>/dev/null | tail -1 | awk '{print $2" "$3" "$4" "$5}' || echo "无" # 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}}
磁盘(数据)
{{DATA_DISK_TOTAL}} / {{DATA_DISK_USED}}({{DATA_DISK_PERCENT}}%)
可用{{DATA_DISK_AVAIL}} · Docker数据盘
运行
{{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渲染 # 注意:viewport_width=1200会因模板scale(2.0)被截断,必须用1920+ultra html_content = "填充数据后的HTML" data = json.dumps({ "html": html_content, "json": True, "options": { "type": "png", "full_page": True, "viewport_width": 1920, "device_scale_factor_level": "ultra" } }).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*