workbuddy.xpcool.com/.workbuddy/tmp/deploy-bark-custom.sh
夏犀麟 621acf12ef docs: xpcool.com 改版为随机壁纸站,同步索引/部署手册/日志
- MEMORY.md 索引:xpcool.com 的描述由「主域名(品牌首页)」改为
  「随机壁纸站(浏览器实时生成,可导出 4K;中英日韩 + 日夜主题)」。
- DEPLOY.md 站点表:同步 xpcool.com 一行的定位与产物体积,
  并记上部署脚本改为 pack-xpcool.ps1 + deploy-xpcool.ps1 两步走。
- 2026-09-14 日志:追加本次改版的完整记录,含三处根因分析
  (画面和泥、strata 层交叉、遮罩浓度过激)与两处真 bug。

顺带记录本次部署踩到的两个坑(已修进脚本,值得复用):
1. 新写的 .ps1 必须带 UTF-8 BOM,否则本机 PowerShell 5.1 按 GBK 解码,
   中文被截断导致解析失败 —— 用字节级前置 EF BB BF 修,不能用
   Get-Content -Raw + Out-File(会不可逆地破坏中文)。
2. deploy-xpcool.ps1 在 $ErrorActionPreference='Stop' 下,ssh 回传的
   nginx -t / openssl 正常输出走 stderr,被 PowerShell 当成终止性错误抛出,
   于是「远端其实跑通了、本地却中途退出」,表现为配置已装但没 reload 的
   半个部署。原生调用前后临时切回 Continue,成败只认 $LASTEXITCODE。
2026-09-14 01:01:32 +08:00

105 lines
4.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 为 Uptime Kuma 的 Bark 通知启用:自定义图标 / 消息分组 / 重要警告 / 图片推送 / 角标
# 2026-09-13
# 前置:以下文件需先 scp 到 /tmp单个文件逐个传多文件 scp 会静默丢文件)
# /tmp/bark-icon.png /tmp/bark-down.png /tmp/bark-up.png
# /tmp/bark.js /tmp/status.xpcool.com.conf
# 幂等:可重复执行
ASSET_DIR=/data/www/bark-assets
PATCH_DIR=/data/uptime-kuma-patch
IMAGE=louislam/uptime-kuma:2.5.3
TS=$(date +%Y%m%d%H%M%S)
echo "=== 0. 备份当前容器配置与 nginx 配置(便于回滚) ==="
sudo docker inspect uptime-kuma > "/tmp/kuma-inspect.$TS.json"
echo "inspect 已存 /tmp/kuma-inspect.$TS.json"
sudo docker inspect uptime-kuma --format 'restart={{json .HostConfig.RestartPolicy}} mem={{.HostConfig.Memory}}B port={{json .HostConfig.PortBindings}} env={{json .Config.Env}}'
sudo cp -a /data/nginx/conf.d/status.xpcool.com.conf "/data/nginx/conf.d/status.xpcool.com.conf.bak.$TS"
echo ""
echo "=== 1. 部署 Bark 素材 ==="
sudo mkdir -p "$ASSET_DIR" "$PATCH_DIR"
for f in icon down up; do
if [ -f "/tmp/bark-$f.png" ]; then
sudo mv -f "/tmp/bark-$f.png" "$ASSET_DIR/$f.png"
fi
done
sudo chmod 644 "$ASSET_DIR"/*.png
sudo chmod 755 "$ASSET_DIR"
ls -l "$ASSET_DIR"
echo ""
echo "=== 2. 安装 provider 补丁 ==="
if [ -f /tmp/bark.js ]; then
sudo mv -f /tmp/bark.js "$PATCH_DIR/bark.js"
fi
sudo chmod 644 "$PATCH_DIR/bark.js"
sudo cp -f "$PATCH_DIR/bark.js" /tmp/_bark_check.js
sudo docker cp /tmp/_bark_check.js uptime-kuma:/tmp/_bark_check.js > /dev/null
# 语法错会让 Kuma 整个通知模块挂掉,必须在重建容器之前拦住并中止
if sudo docker exec uptime-kuma node --check /tmp/_bark_check.js; then
echo "补丁语法检查 OK"
else
echo "!! 补丁语法检查失败,已中止部署(容器未改动,补丁仍在 $PATCH_DIR"
sudo docker exec uptime-kuma rm -f /tmp/_bark_check.js > /dev/null 2>&1
sudo rm -f /tmp/_bark_check.js
exit 1
fi
sudo docker exec uptime-kuma rm -f /tmp/_bark_check.js > /dev/null 2>&1
sudo rm -f /tmp/_bark_check.js # sudo docker cp 出的文件属 root必须 sudo 删
echo "补丁 md5$(md5sum "$PATCH_DIR/bark.js" | cut -d' ' -f1)"
echo ""
echo "=== 3. 部署 nginx 配置(新增 /bark-assets/ 静态位置) ==="
if [ -f /tmp/status.xpcool.com.conf ]; then
sudo mv -f /tmp/status.xpcool.com.conf /data/nginx/conf.d/status.xpcool.com.conf
fi
sudo nginx -t
sudo systemctl reload nginx
echo "nginx reload OK"
echo ""
echo "=== 4. 公网取图验证(手机端要能直接拉到) ==="
# ⚠️ 两个坑:
# 1) nginx reload 是优雅重启,旧 worker 仍在退出中reload 后立刻请求可能落到旧
# worker 的 location / 上,拿到面板的 HTML200 text/html看着像"配置没生效"。
# 2) 只看 HTTP 状态码会被骗 —— Kuma 的 SPA 对任何未知路径都返回 200 + index.html。
# 必须校验 content_type 与体积。
sleep 3
for f in icon down up; do
R=$(curl -s -o /dev/null -m 15 -w "%{http_code} %{content_type} %{size_download}" \
"https://status.xpcool.com/bark-assets/$f.png")
echo "$f.png -> $R"
case "$R" in
*image/png*) echo " OK $f.png 已公网可取" ;;
*) echo "$f.png 未返回 PNG检查 /data/www/bark-assets/ 与 nginx location" ;;
esac
done
echo ""
echo "=== 5. 重建容器以挂载补丁(数据卷 /data/uptime-kuma 不变) ==="
sudo docker rm -f uptime-kuma > /dev/null 2>&1
sudo docker run -d --name uptime-kuma --restart unless-stopped \
-p 127.0.0.1:3001:3001 \
-e TZ=Asia/Shanghai \
-v /data/uptime-kuma:/app/data \
-v /data/uptime-kuma-patch/bark.js:/app/server/notification-providers/bark.js:ro \
--memory 512m \
"$IMAGE" > /dev/null
sleep 20
sudo docker ps --filter name=uptime-kuma --format '{{.Names}} | {{.Status}} | {{.Ports}}'
echo ""
echo "=== 6. 确认补丁确实生效 ==="
echo -n "宿主机补丁 md5 : "; md5sum "$PATCH_DIR/bark.js" | cut -d' ' -f1
echo -n "容器内文件 md5 : "; sudo docker exec uptime-kuma md5sum /app/server/notification-providers/bark.js 2>&1 | cut -d' ' -f1
echo -n "定制标记行数 : "; sudo docker exec uptime-kuma grep -c "xpcool 定制" /app/server/notification-providers/bark.js 2>&1
echo -n "图标常量 : "; sudo docker exec uptime-kuma grep -m1 "barkNotificationAvatar =" /app/server/notification-providers/bark.js 2>&1
echo ""
echo "=== 7. 面板可用性 ==="
curl -s -o /dev/null -m 10 -w "panel=%{http_code}\n" http://127.0.0.1:3001/
sudo docker exec uptime-kuma sqlite3 /app/data/kuma.db "SELECT id,name,active,json_extract(config,'\$.type') FROM notification;"
echo "DONE"