OpenClaw 服务器自动化监控方案(Web + 数据库 + 故障自愈 + 钉钉 / 企微告警)
一、整体架构说明
- 监控主体
:OpenClaw(开源轻量服务器监控工具,支持进程、端口、URL、自定义脚本监控) - 监控对象
-
Web 服务:Nginx/Apache/Tomcat 端口、HTTP/HTTPS 访问可用性 -
数据库:MySQL/PostgreSQL/Redis 进程、端口、连接测试 - 故障流程
检测异常 → 自动执行故障排查脚本 → 收集故障日志 → 调用钉钉 / 企业微信机器人推送告警 - 恢复流程
检测服务恢复正常 → 推送恢复通知,附带故障持续时长 - 部署方式
:OpenClaw 单机部署(被监控服务器本地)或中控机集中监控多台服务器
二、环境准备
1. 安装 OpenClaw
# CentOS/RHELyum install -y wget unzipwget https://github.com/OpenClawMonitor/openclaw/releases/latest/download/openclaw-linux-amd64.zipunzip openclaw-linux-amd64.zipchmod +x openclawmv openclaw /usr/local/bin/# Ubuntu/Debianapt install wget unzipwget https://github.com/OpenClawMonitor/openclaw/releases/latest/download/openclaw-linux-amd64.zipunzip openclaw-linux-amd64.zipchmod +x openclawmv openclaw /usr/local/bin/
2. 创建钉钉 / 企业微信机器人
钉钉机器人
-
钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义机器人 -
复制 Webhook 地址,设置安全关键词(如 服务器告警)
企业微信机器人
-
企微群 → 群机器人 → 添加机器人,获取 Webhook
三、核心文件目录规划
/etc/openclaw/├── config.yaml # OpenClaw主监控配置├── scripts/│ ├── check_web.sh # Web服务可用性检测│ ├── check_db.sh # 数据库检测│ ├── fault_diag.sh # 自动故障排查脚本│ ├── notify_ding.sh # 钉钉推送脚本│ └── notify_wecom.sh # 企业微信推送脚本└── log/ # 故障日志存储
四、推送通知脚本(可二选一)
1. 钉钉推送 scripts/notify_ding.sh
#!/bin/bashWEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的token"TITLE="$1"CONTENT="$2"curl -s $WEBHOOK \-H "Content-Type: application/json" \-d "{\"msgtype\": \"markdown\",\"markdown\": {\"title\": \"$TITLE\",\"text\": \"## $TITLE\n$CONTENT\n`$(date '+%Y-%m-%d %H:%M:%S')`\"}}"
2. 企业微信推送 scripts/notify_wecom.sh
#!/bin/bashWEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"TITLE="$1"CONTENT="$2"curl -s $WEBHOOK \-H "Content-Type: application/json" \-d "{\"msgtype\": \"markdown\",\"markdown\": {\"content\": \"## $TITLE\n$CONTENT\n> 时间:$(date '+%Y-%m-%d %H:%M:%S')\"}}"
赋予执行权限:
chmod +x /etc/openclaw/scripts/*.sh
五、自动故障排查脚本 scripts/fault_diag.sh
作用:服务异常时自动收集端口、进程、日志、磁盘、内存信息,用于告警详情
#!/bin/bashHOSTNAME=$(hostname)IP=$(hostname -I | awk '{print $1}')TMP_LOG=/tmp/fault_log.txt> $TMP_LOGecho "===== 服务器基础信息 =====" >> $TMP_LOGecho "主机名:$HOSTNAME" >> $TMP_LOGecho "IP:$IP" >> $TMP_LOGecho "当前时间:$(date)" >> $TMP_LOGecho -e "\n===== 端口监听检查 =====" >> $TMP_LOG# Web端口 80/443,数据库3306示例ss -tulpn | grep -E "80|443|3306" >> $TMP_LOGecho -e "\n===== 进程状态 =====" >> $TMP_LOGps -ef | grep -E "nginx|mysqld|redis" | grep -v grep >> $TMP_LOGecho -e "\n===== 磁盘/内存负载 =====" >> $TMP_LOGdf -h >> $TMP_LOGfree -h >> $TMP_LOGecho -e "\n===== Web服务日志尾部 =====" >> $TMP_LOGtail -20 /var/log/nginx/error.log 2>/dev/null >> $TMP_LOGecho -e "\n===== 数据库日志尾部 =====" >> $TMP_LOGtail -20 /var/log/mysql/error.log 2>/dev/null >> $TMP_LOG# 输出完整排查结果cat $TMP_LOG
六、Web / 数据库检测脚本
1. Web 检测 scripts/check_web.sh
#!/bin/bash# 待监控Web地址WEB_URL="http://127.0.0.1"# 超时3秒STATUS=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 3 $WEB_URL)if [ "$STATUS" -ne 200 ];thenecho "FAIL: Web服务访问失败,状态码$STATUS"exit 1elseecho "OK: Web服务正常"exit 0fi
2. MySQL 数据库检测 scripts/check_db.sh
#!/bin/bash# 数据库连通性测试mysql -h127.0.0.1 -uroot -p数据库密码 -e "select 1;" >/dev/null 2>&1if [ $? -ne 0 ];thenecho "FAIL: 数据库连接失败"exit 1elseecho "OK: 数据库正常"exit 0fi
七、OpenClaw 核心配置 /etc/openclaw/config.yaml
OpenClaw 支持自定义脚本监控、故障触发钩子、状态恢复钩子,核心逻辑:
-
定时执行检测脚本 -
连续 N 次失败判定故障 -
故障触发:执行故障排查 → 推送告警 -
恢复后自动推送恢复通知
global:interval: 10s # 每10秒检测一次retry: 2 # 连续2次失败才触发告警,避免瞬时抖动log_path: /etc/openclaw/log/claw.log# 监控项1:Web服务tasks:- name: web_server_monitortype: scriptscript_path: /etc/openclaw/scripts/check_web.sh# 故障触发钩子on_fault: |diag_info=$(/etc/openclaw/scripts/fault_diag.sh)/etc/openclaw/scripts/notify_ding.sh "【严重告警】Web服务故障" "服务器IP:$(hostname -I)\n故障排查详情:\n```$diag_info```"# 恢复触发钩子on_recover: |/etc/openclaw/scripts/notify_ding.sh "【恢复通知】Web服务已修复" "Web页面访问恢复正常,业务恢复可用"# 监控项2:数据库- name: mysql_db_monitortype: scriptscript_path: /etc/openclaw/scripts/check_db.shon_fault: |diag_info=$(/etc/openclaw/scripts/fault_diag.sh)/etc/openclaw/scripts/notify_ding.sh "【严重告警】数据库连接失败" "服务器IP:$(hostname -I)\n故障排查详情:\n```$diag_info```"on_recover: |/etc/openclaw/scripts/notify_ding.sh "【恢复通知】数据库连接正常" "数据库访问恢复,读写业务正常"
如需切换企业微信通知,将脚本替换为
notify_wecom.sh即可。
八、后台运行 OpenClaw 服务
1. 前台测试启动
openclaw run -c /etc/openclaw/config.yaml
2. Systemd 托管开机自启
创建 /etc/systemd/system/openclaw.service
[Unit]Description=OpenClaw Server MonitorAfter=network.target[Service]Type=simpleExecStart=/usr/local/bin/openclaw run -c /etc/openclaw/config.yamlRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target
启动并设置开机自启:
systemctl daemon-reloadsystemctl start openclawsystemctl enable openclawsystemctl status openclaw
九、功能扩展优化方案
1. 自动尝试修复(可选)
在 fault_diag.sh 末尾增加自动重启逻辑,失败后自动重启服务:
# Web自动重启systemctl restart nginx# 数据库自动重启systemctl restart mysqld
2. 多服务器集中监控
中控机部署 OpenClaw,通过 ssh 远程执行各服务器检测脚本,统一汇总告警。
3. 告警分级
-
严重:Web / 数据库完全不可用(红色告警) -
警告:响应超时、连接缓慢(降低重试阈值)
4. 告警去重
OpenClaw 默认只会在故障首次触发推送一次告警,不会循环刷屏;仅恢复时再发一条通知。
十、故障告警效果示例(钉钉 Markdown)
故障通知
【严重告警】Web 服务故障
服务器 IP:192.168.1.100故障排查详情:
===== 服务器基础信息 =====主机名:web01IP:192.168.1.100当前时间:2026-07-06 15:30:22===== 端口监听检查 =====无80端口监听===== 进程状态 =====nginx进程不存在===== Web日志 =====nginx启动失败:端口被占用
时间:2026-07-06 15:30:22
恢复通知
【恢复通知】Web 服务已修复
Web 页面访问恢复正常,业务恢复可用时间:2026-07-06 15:35:10
十一、常见问题解决
- 机器人推送失败
:检查 Webhook 地址、安全关键词、服务器出口网络是否放行 443 端口 - 检测误报
:调大 retry重试次数、延长检测间隔interval - 数据库脚本密码明文
:改用配置文件免密登录 mysql,避免密码暴露 - 权限不足
:给 OpenClaw 授权查看系统进程、日志权限,root 运行或配置 sudo 免密
十二、一件安装脚本
一键安装脚本 install_openclaw_monitor.sh
#!/bin/bashset -e############################################################################### OpenClaw 服务器监控一键部署脚本# 功能:Web服务监控 + MySQL数据库监控 + 自动故障采集 + 钉钉/企业微信告警# 故障触发:自动收集进程/端口/磁盘/日志,推送告警# 恢复触发:推送恢复通知############################################################################### ====================== 【请修改此处配置】======================# 1. 监控Web地址WEB_URL="http://127.0.0.1"# 2. MySQL连接信息MYSQL_HOST="127.0.0.1"MYSQL_USER="root"MYSQL_PASS="你的数据库密码"# 3. 机器人webhook(二选一,不用的留空)DING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=替换钉钉token"WECOM_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=替换企业微信key"# 4. 监控检测间隔CHECK_INTERVAL="10s"# 连续2次失败才告警,防止抖动FAIL_RETRY=2# ==============================================================# 工作目录BASE_DIR="/etc/openclaw"SCRIPT_DIR="${BASE_DIR}/scripts"LOG_DIR="${BASE_DIR}/log"TMP_FAULT="/tmp/fault_diag_info.log"echo "==================== 开始部署 OpenClaw 监控 ===================="# 1. 安装依赖echo "[1] 安装系统依赖 wget unzip curl"if [ -f /etc/redhat-release ]; thenyum install -y wget unzip curlelseapt update && apt install -y wget unzip curlfi# 2. 下载安装 openclawecho "[2] 下载并安装 OpenClaw"wget -q https://github.com/OpenClawMonitor/openclaw/releases/latest/download/openclaw-linux-amd64.zip -O /tmp/openclaw.zipunzip -o /tmp/openclaw.zip -d /tmp/chmod +x /tmp/openclawmv /tmp/openclaw /usr/local/bin/rm -rf /tmp/openclaw.zip# 3. 创建目录echo "[3] 创建配置目录"mkdir -p ${SCRIPT_DIR} ${LOG_DIR}# ====================== 脚本1:钉钉通知 ======================cat > ${SCRIPT_DIR}/notify_ding.sh <<'EOF'#!/bin/bashWEBHOOK="$1"TITLE="$2"MSG="$3"curl -s $WEBHOOK \-H "Content-Type: application/json" \-d "{\"msgtype\": \"markdown\",\"markdown\": {\"title\": \"$TITLE\",\"text\": \"## $TITLE\n$MSG\n> 触发时间:$(date '+%Y-%m-%d %H:%M:%S')\"}}"EOFchmod +x ${SCRIPT_DIR}/notify_ding.sh# ====================== 脚本2:企业微信通知 ======================cat > ${SCRIPT_DIR}/notify_wecom.sh <<'EOF'#!/bin/bashWEBHOOK="$1"TITLE="$2"MSG="$3"curl -s $WEBHOOK \-H "Content-Type: application/json" \-d "{\"msgtype\": \"markdown\",\"markdown\": {\"content\": \"## $TITLE\n$MSG\n> 触发时间:$(date '+%Y-%m-%d %H:%M:%S')\"}}"EOFchmod +x ${SCRIPT_DIR}/notify_wecom.sh# ====================== 脚本3:自动故障排查采集 ======================cat > ${SCRIPT_DIR}/fault_diag.sh <<EOF#!/bin/bash> ${TMP_FAULT}HOST=\$(hostname)IP=\$(hostname -I | awk '{print \$1}')echo "===== 服务器基础信息 =====" >> ${TMP_FAULT}echo "主机名:\$HOST" >> ${TMP_FAULT}echo "IP地址:\$IP" >> ${TMP_FAULT}echo "当前时间:\$(date)" >> ${TMP_FAULT}echo -e "\n===== 监听端口(80/443/3306) =====" >> ${TMP_FAULT}ss -tulpn | grep -E "80|443|3306" >> ${TMP_FAULT} 2>/dev/nullecho -e "\n===== Web/数据库进程 =====" >> ${TMP_FAULT}ps -ef | grep -E "nginx|httpd|mysqld|mariadb" | grep -v grep >> ${TMP_FAULT}echo -e "\n===== 磁盘&内存负载 =====" >> ${TMP_FAULT}df -h >> ${TMP_FAULT}free -h >> ${TMP_FAULT}echo -e "\n===== Nginx错误日志尾部20行 =====" >> ${TMP_FAULT}tail -n20 /var/log/nginx/error.log 2>/dev/null >> ${TMP_FAULT}echo -e "\n===== MySQL错误日志尾部20行 =====" >> ${TMP_FAULT}tail -n20 /var/log/mysql/error.log /var/log/mariadb/mariadb.log 2>/dev/null >> ${TMP_FAULT}cat ${TMP_FAULT}EOFchmod +x ${SCRIPT_DIR}/fault_diag.sh# ====================== 脚本4:Web可用性检测 ======================cat > ${SCRIPT_DIR}/check_web.sh <<EOF#!/bin/bashURL="${WEB_URL}"CODE=\$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 3 \$URL)if [ "\$CODE" != "200" ];thenecho "FAIL Web访问失败 HTTP状态码:\$CODE"exit 1elseecho "OK Web服务正常"exit 0fiEOFchmod +x ${SCRIPT_DIR}/check_web.sh# ====================== 脚本5:MySQL连通性检测 ======================cat > ${SCRIPT_DIR}/check_db.sh <<EOF#!/bin/bashmysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASS} -e "SELECT 1;" >/dev/null 2>&1if [ \$? -ne 0 ];thenecho "FAIL MySQL数据库连接失败"exit 1elseecho "OK MySQL数据库正常"exit 0fiEOFchmod +x ${SCRIPT_DIR}/check_db.sh# ====================== 生成主配置 config.yaml ======================cat > ${BASE_DIR}/config.yaml <<EOFglobal:interval: ${CHECK_INTERVAL}retry: ${FAIL_RETRY}log_path: ${LOG_DIR}/claw.logtasks:- name: web_server_monitortype: scriptscript_path: ${SCRIPT_DIR}/check_web.shon_fault: |diag=\$(${SCRIPT_DIR}/fault_diag.sh)msg="服务器IP: \$(hostname -I)\n故障详情:\n\`\`\`\$diag\`\`\`"EOF# 拼接通知逻辑if [ -n "${DING_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_ding.sh "${DING_WEBHOOK}" "【严重告警】Web服务不可访问" "\$msg"EOFfiif [ -n "${WECOM_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_wecom.sh "${WECOM_WEBHOOK}" "【严重告警】Web服务不可访问" "\$msg"EOFficat >> ${BASE_DIR}/config.yaml <<EOFon_recover: |EOFif [ -n "${DING_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_ding.sh "${DING_WEBHOOK}" "【恢复通知】Web服务已恢复" "Web页面访问正常,业务恢复"EOFfiif [ -n "${WECOM_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_wecom.sh "${WECOM_WEBHOOK}" "【恢复通知】Web服务已恢复" "Web页面访问正常,业务恢复"EOFfi# 数据库监控任务cat >> ${BASE_DIR}/config.yaml <<EOF- name: mysql_db_monitortype: scriptscript_path: ${SCRIPT_DIR}/check_db.shon_fault: |diag=\$(${SCRIPT_DIR}/fault_diag.sh)msg="服务器IP: \$(hostname -I)\n故障详情:\n\`\`\`\$diag\`\`\`"EOFif [ -n "${DING_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_ding.sh "${DING_WEBHOOK}" "【严重告警】MySQL数据库连接失败" "\$msg"EOFfiif [ -n "${WECOM_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_wecom.sh "${WECOM_WEBHOOK}" "【严重告警】MySQL数据库连接失败" "\$msg"EOFficat >> ${BASE_DIR}/config.yaml <<EOFon_recover: |EOFif [ -n "${DING_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_ding.sh "${DING_WEBHOOK}" "【恢复通知】MySQL数据库已恢复" "数据库读写连接正常"EOFfiif [ -n "${WECOM_WEBHOOK}" ];thencat >> ${BASE_DIR}/config.yaml <<EOF${SCRIPT_DIR}/notify_wecom.sh "${WECOM_WEBHOOK}" "【恢复通知】MySQL数据库已恢复" "数据库读写连接正常"EOFfi# ====================== 创建systemd服务 ======================cat > /etc/systemd/system/openclaw.service <<EOF[Unit]Description=OpenClaw Web&DB MonitorAfter=network.target[Service]Type=simpleExecStart=/usr/local/bin/openclaw run -c ${BASE_DIR}/config.yamlRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.targetEOF# 重载服务、开机自启systemctl daemon-reloadsystemctl enable openclawecho "==================== 部署完成 ===================="echo "1. 请先修改脚本顶部配置:Web地址、MySQL账号、机器人webhook"echo "2. 测试监控:openclaw run -c ${BASE_DIR}/config.yaml"echo "3. 后台启动监控:systemctl start openclaw"echo "4. 查看运行状态:systemctl status openclaw"echo "5. 监控日志:tail -f ${LOG_DIR}/claw.log"echo "脚本目录:${SCRIPT_DIR}"echo "配置文件:${BASE_DIR}/config.yaml"
使用步骤
1. 编辑配置
vim install_openclaw_monitor.sh
修改脚本顶部配置区:
-
WEB_URL 你的网站地址 -
MYSQL_HOST/USER/PASS 数据库账号密码 -
DING_WEBHOOK / WECOM_WEBHOOK 填入机器人链接,不用的填空
2. 赋予执行权限并执行安装
chmod +x install_openclaw_monitor.sh./install_openclaw_monitor.sh
3. 测试监控(前台运行,看输出是否报错)
openclaw run -c /etc/openclaw/config.yaml
4. 后台常驻运行
systemctl start openclaw# 查看状态systemctl status openclaw# 实时日志tail -f /etc/openclaw/log/claw.log
可选扩展:故障自动重启服务
如需故障时自动重启 Nginx/MySQL,修改 fault_diag.sh,末尾添加:
# 自动重启Websystemctl restart nginx httpd 2>/dev/null# 自动重启数据库systemctl restart mysqld mariadb 2>/dev/null
安全优化建议
-
MySQL 密码明文风险:创建 /root/.my.cnf免密登录,删除脚本内明文密码 -
机器人安全:钉钉机器人设置关键词、IP 白名单,防止恶意调用 -
权限限制:脚本目录权限设为 700,仅 root 可读 -
告警降噪:调高 FAIL_RETRY=3,连续 3 次失败再告警,避免瞬时波动
故障触发逻辑说明
-
每 10 秒执行一次检测脚本 -
连续 2 次检测失败 → 判定故障 -
执行 fault_diag.sh采集全量故障信息 -
调用钉钉 / 企微机器人发送 markdown 告警 -
后续检测恢复正常 → 立即发送恢复通知 -
故障期间不会重复刷屏,仅首次故障推送一次告警
夜雨聆风