#!/bin/bash # 为 Uptime Kuma 配置 Bark 通知渠道,并挂到全部监控(2026-09-13) # 幂等:重复执行不会产生重复行 set -e DB=/app/data/kuma.db KEY="sm5WnyANWx89GgLtFnRXhk" KCONF="/data/uptime-kuma/kuma.db" TS=$(date +%Y%m%d%H%M%S) echo "=== 0. 备份数据库 ===" sudo cp "$KCONF" "/tmp/kuma.db.backup.$TS" ls -l "/tmp/kuma.db.backup.$TS" echo "" echo "=== 1. 用 Kuma 的 URL 格式在容器内实测一次(含 icon/group/sound 参数) ===" sudo docker exec uptime-kuma sh -c "curl -s -o /dev/null -m 15 -w 'kuma_style_url=%{http_code}\n' 'http://172.17.0.1:8081/$KEY/UptimeKuma%20Monitor%20Down/test-from-kuma-container?icon=https%3A%2F%2Fgithub.com%2Flouislam%2Fuptime-kuma%2Fraw%2Fmaster%2Fpublic%2Ficon.png&group=Uptime-Kuma&sound=telegraph'" echo "" echo "=== 2. 写入 Bark 通知(若不存在) ===" NAME='Bark 手机推送' CONFIG='{"type":"Bark","name":"Bark 手机推送","barkEndpoint":"http://172.17.0.1:8081/sm5WnyANWx89GgLtFnRXhk","barkGroup":"Uptime-Kuma","apiVersion":"v1","isDefault":true,"active":true,"applyExisting":false}' EXIST=$(sudo docker exec uptime-kuma sqlite3 "$DB" "SELECT COUNT(*) FROM notification WHERE name='$NAME';") if [ "$EXIST" = "0" ]; then sudo docker exec uptime-kuma sqlite3 "$DB" "INSERT INTO notification (name, active, user_id, is_default, config) VALUES ('$NAME', 1, 1, 1, '$CONFIG');" echo "已新增通知渠道" else sudo docker exec uptime-kuma sqlite3 "$DB" "UPDATE notification SET active=1, is_default=1, config='$CONFIG' WHERE name='$NAME';" echo "已更新既有通知渠道" fi echo "--- JSON 合法性校验 ---" sudo docker exec uptime-kuma sqlite3 "$DB" "SELECT id, json_valid(config) AS json_ok, json_extract(config,'\$.type') AS type, json_extract(config,'\$.barkEndpoint') AS endpoint FROM notification;" NID=$(sudo docker exec uptime-kuma sqlite3 "$DB" "SELECT id FROM notification WHERE name='$NAME' LIMIT 1;") echo "notification_id=$NID" echo "" echo "=== 3. 挂到全部监控(幂等) ===" sudo docker exec uptime-kuma sqlite3 "$DB" "INSERT INTO monitor_notification (monitor_id, notification_id) SELECT m.id, $NID FROM monitor m WHERE NOT EXISTS (SELECT 1 FROM monitor_notification mn WHERE mn.monitor_id = m.id AND mn.notification_id = $NID);" echo "--- 关联结果 ---" sudo docker exec uptime-kuma sqlite3 "$DB" "SELECT mn.monitor_id, m.name, mn.notification_id FROM monitor_notification mn JOIN monitor m ON m.id = mn.monitor_id ORDER BY mn.monitor_id;" echo "" echo "=== 4. 重启容器加载配置 ===" sudo docker restart uptime-kuma > /dev/null sleep 15 sudo docker ps --filter name=uptime-kuma --format '{{.Names}} | {{.Status}}' curl -s -o /dev/null -m 10 -w "panel_http=%{http_code}\n" http://127.0.0.1:3001/ echo "" echo "=== 5. 复核 ===" sudo docker exec uptime-kuma sqlite3 "$DB" "SELECT id,name,active,is_default FROM notification;" sudo docker exec uptime-kuma sqlite3 "$DB" "SELECT COUNT(*) AS linked FROM monitor_notification;" echo "=== 容器日志尾部(看有无通知相关报错) ===" sudo docker logs --tail 20 uptime-kuma 2>&1 | grep -i -E "error|notification|bark" || echo "(无相关日志)" echo "DONE"