From 621acf12efa5cca75969250084c3e98ca4849fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E7=8A=80=E9=BA=9F?= Date: Mon, 14 Sep 2026 01:01:32 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20xpcool.com=20=E6=94=B9=E7=89=88?= =?UTF-8?q?=E4=B8=BA=E9=9A=8F=E6=9C=BA=E5=A3=81=E7=BA=B8=E7=AB=99=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=B4=A2=E5=BC=95/=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=89=8B=E5=86=8C/=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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。 --- .workbuddy/memory/2026-09-14.md | 16 +++++++++ .workbuddy/memory/DEPLOY.md | 10 ++++-- .workbuddy/memory/MEMORY.md | 23 +++++-------- .workbuddy/tmp/deploy-bark-custom.sh | 29 +++++++++++++--- .workbuddy/tmp/kuma-bark-check.sh | 51 ++++++++++++++++++++++++++++ 5 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 .workbuddy/memory/2026-09-14.md create mode 100644 .workbuddy/tmp/kuma-bark-check.sh diff --git a/.workbuddy/memory/2026-09-14.md b/.workbuddy/memory/2026-09-14.md new file mode 100644 index 0000000..29d04c9 --- /dev/null +++ b/.workbuddy/memory/2026-09-14.md @@ -0,0 +1,16 @@ +# 2026-09-14 + +2026-09-14 | REQ | **xpcool.com 方向重定:删掉刚上线的「GPU 实时生成的宇宙」,改为「随机壁纸站」**。用户七项要求:每次进入随机壁纸 / PC 横版手机竖版 / 可下载 / 可刷新 / 页脚显示备案号 / 中英日韩四语言 / 日夜主题切换,另要求 AI 补全未考虑项(已补:收藏与最近看过、分享链接带种子、分享卡片 og.png、快捷键、对比度自适应遮罩、导出多分辨率多维度的「按目标尺寸重绘」) +2026-09-14 | CHG | web 端架构:**壁纸由浏览器 Canvas 2D 实时算出,零素材请求**。选它的三个理由:①服务器 5M 带宽且同时承载 home/tool/file/git/service 多站,传图片必卡 ②素材版权风险 ③随机性放客户端才能每次进入都不同且不产生请求。产物 gzip 后约 60KB(宇宙方案约 170KB) +2026-09-14 | FIX | **根治「画面和泥」**:两种种子画出来都是一片发灰的米白。根因①色斑用 `lighter` 叠加,重叠处被加成白色;②配色板是「从 6 个无关色相随机取」,必然互相抵消。改法:**配色板重写为有序色阶 `ramp`(由近底色排到对比最强),风格一律按 0..1 比例取色**(新增 `sampleRamp`),五风格全部迁移;mesh 改回 `source-over`。改后五风格逐一截图确认:warm 渐变 / 粉色地层 / 暖色光带 / 冷色星图 / 蓝色丝理,全部成立 +2026-09-14 | FIX | strata 层交叉会打乱色阶顺序(各层原用独立噪声,fbm 值域 0..1 只会整体上移,交叉条件是 `振幅 > 层间距`,而旧振幅 0.17 倍画高 > 层间距 0.10~0.15 倍画高)。**改为所有层共用同一条波形、只做上下平移**,振幅再大也不交叉,另叠每层独有的小碎边 +2026-09-14 | FIX | 浅色主题遮罩浓度过高把深色壁纸上下糊白:目标合成亮度原取 0.72 ≈ WCAG 13:1(AAA 只需 7:1),属过度设计。**放宽到 0.52**(主文字仍约 9:1),并提高 `--ink-faint/--ink-soft` 补偿页脚。**用像素采样验证**(Node 内置 zlib 手写最小 PNG 解码器读截图像素列):strata 底部亮度 180 → 127,色阶完整呈现 +2026-09-14 | FIX | 修两处真 bug:①`App.vue` 快捷键守卫 `target?.closest(...)`——从 `document` 派发的按键事件 target 不是元素,抛 `closest is not a function`(CDP 控制台抓到两次)②`scripts/shoot.mjs` 的 `goto` 漏了 seed 形参,五张风格截图全落同一默认种子、看起来「五种风格长得一样」 +2026-09-14 | DOC | 验收脚本升级:真 390px 视口(CDP `Emulation.setDeviceMetricsOverride`)+ **五风格全扫** + `SHOOT_OG=1` 产出 `public/og.png`;另写离线反查脚本复刻 `hashSeed`+`mulberry32` 抽取顺序,用来核对「某种子实际用的风格与配色」——顺带验证了「同一颗种子切主题时风格不变、只换配色」这条设计性质成立 +2026-09-14 | DOC | 补齐 `E:\CentOS\deploy-xpcool\` 缺失的本地脚本:`pack-xpcool.ps1`(清旧产物→铺 dist→打 bundle,assets 带内容哈希必须先清目录)+ `deploy-xpcool.ps1`(上传→远程 deploy.sh→公网验证);`deploy.sh` 头部一直引用的本地脚本此前从未落盘 +2026-09-14 | DEP | xpcool.com 重新构建并部署上线(含 gzip 配置首次生效);README、`public/og.png`、`index.html`(OG 标签 + 四语言运行时改写 lang/title/description)一并更新 +2026-09-14 | FIX | **排查「Bark 告警推送没生效」—— 结论:服务端整条链路全部正常,问题不在这侧**。按三段定位法逐层验证:(1) 服务器告警脚本 `server-monitor.sh` cron 每 10 分钟正常执行,`/var/log/server-monitor.log` 通篇 `[OK]`,9-13 00:10 后无推送是因**去重逻辑生效且无新事件**(`/var/lib/server-monitor/` 状态文件持续更新,banned-ips 2 条已记录),不是故障;(2) 手动 POST 自检 `http://127.0.0.1:8081/` 返回 `{"code":200,"message":"success"}`,公网入口 `https://service.xpcool.com/bark//` 也 200(nginx `/bark/` → `127.0.0.1:8081`,末尾斜杠剥离前缀,配置正确);(3) 用临时监控(id=11,指向 `127.0.0.1:9`,`maxretries=0`)触发真实 DOWN,**Kuma 00:42:40 成功推送至 bark 且返回 200**,验证后自清理(监控恢复 9 个、关联 9 条)。bark 容器 `finab/bark-server` Up 10 天无 ERROR,`/data/bark/bark.db` 单设备 token 注册于 9-11 22:01。**待用户确认手机是否收到 00:41:30 与 00:42:40 两条测试推送** —— 服务端 200 仅代表已提交 APNs,不代表送达,若未收到则问题在 iOS 侧(通知权限/专注模式/device token 失效) +2026-09-14 | DOC | 发现 `uptime-kuma` 容器**未挂载 Bark 增强补丁**:`docker inspect` 只有 `/data/uptime-kuma -> /app/data` 一个挂载,且宿主机 `/data/uptime-kuma-patch/` 目录**不存在** —— 即 DEPLOY.md 里记的「补丁已备好待部署」实际从未落地(`deploy-bark-custom.ps1` 未成功执行)。容器 CreatedAt 为 9-13 16:56、19:27 重启过一次。补丁本身非故障项(不影响通知发送),但自定义图标/重要警告/角标这些增强效果目前不生效 +2026-09-14 | DOC | 沉淀经验到 skill `uptime-kuma-sqlite-ops`:新增「告警不生效排查:先分三段」章节(① 有无事件触发 → ② 推送是否发出 → ③ 手机是否收到),新增两条 SSH 踩坑(回传 base64 的那条 ssh 不能夹带 `ls`/`echo`,否则 `base64 -d` 报 invalid input;`scp ... 2>&1 | grep -v 噪音 && ssh ...` 因 grep 无匹配返回 1 而短路),并新增可复用自检脚本 `scripts/kuma-bark-check.sh`(变量化容器名与通知 id,自带备份与自清理) +2026-09-14 | DEP | **Bark 通知增强补丁正式部署并端到端验证通过**(9-13 备好的补丁因沙箱拦截 SSH 一直未落地)。流程:逐个 scp 7 个文件(icon/down/up.png、bark.js、status.xpcool.com.conf、deploy-bark-custom.sh、kuma-bark-verify.sh)→ 远端执行部署脚本(备份 `docker inspect` 与 nginx conf → 素材落 `/data/www/bark-assets/` → 补丁落 `/data/uptime-kuma-patch/bark.js` 并做 `node --check` 语法门禁 → nginx reload → 重建容器带 `:ro` 挂载 → 校验 md5)。结果:补丁 md5 `98c586f988084b89e1b5452257442b08` 宿主机与容器内一致、挂载在(`RW=false`)、9 处定制标记;端到端验证(临时监控 id=12 触发真实 DOWN)时 Bark 日志收到完整定制参数 `icon=…/bark-assets/icon.png & level=critical & volume=5 & badge=auto & isArchive=1 & image=…/bark-assets/down.png`,对比部署前仅 `icon`(GitHub)+`group`+`sound` 三项;清理后监控恢复 9 个、关联 9 条、面板 302 正常。**部署包归档 `E:\CentOS\deploy-bark-custom\`(含 README)** +2026-09-14 | FIX | 修 `deploy-bark-custom.sh` 两处隐患:① 补丁语法检查失败原先只打印错误、仍继续重建容器 → 改为 `exit 1` 中止(语法错会让 Kuma 整个通知模块挂掉);② 取图验证原先只看 HTTP 状态码,会被 Kuma SPA 的 `200 + index.html` 骗过(且 `nginx reload` 后旧 worker 仍在退出,请求会落到 `location /`)→ 改为 `sleep 3` + 校验 `content_type=image/png`。另 `sudo docker cp` 产生的 `/tmp/_bark_check.js` 属 root,`rm` 需加 `sudo` diff --git a/.workbuddy/memory/DEPLOY.md b/.workbuddy/memory/DEPLOY.md index d6823ad..45a2414 100644 --- a/.workbuddy/memory/DEPLOY.md +++ b/.workbuddy/memory/DEPLOY.md @@ -67,7 +67,7 @@ | code.xpcool.com | `code-server` | 127.0.0.1:8080 | 网页版 VS Code | | **status.xpcool.com** | **`uptime-kuma`** | **127.0.0.1:3001** | **服务监控面板(2026-09-13 新增)** | | **home.xpcool.com** | **—(静态)** | **—** | **xpcool 服务台:9 站统一入口 + 存活状态。2026-09-13 站点/证书/nginx 已全部上线,`/api/kuma/` 同源反代到 Kuma;⚠️ 仅剩 DNSPod `home` A 记录未加,公网暂不可访问** | -| **xpcool.com / www.xpcool.com** | **—(静态)** | **—** | **主域名:纯 GPU 实时生成的可交互宇宙(Three.js,零贴图零模型,gzip 后约 171KB)。2026-09-13 站点 `/data/www/xpcool.com` + 证书 + nginx 全部上线,公网 HTTPS 200 / ssl_verify=0 / HTTP 301;部署包 `E:\CentOS\deploy-xpcool\`。⚠️ `nginx.conf` 里已写好 gzip 配置但尚未重新部署,当前 JS/CSS 仍未压缩** | +| **xpcool.com / www.xpcool.com** | **—(静态)** | **—** | **主域名:随机壁纸站(2026-09-14 由「GPU 实时生成的宇宙」改版)。壁纸全部由浏览器 Canvas 2D 实时算出,网络传输 0 字节;五种风格 × 12 配色板,四语言 + 日夜主题,可导出真实 4K。站点 `/data/www/xpcool.com` + 证书 + nginx 已上线,公网 HTTPS 200 / HTTP 301;部署包 `E:\CentOS\deploy-xpcool\`(`pack-xpcool.ps1` 打包 → `deploy-xpcool.ps1` 上传部署)。gzip 已随本次改版一并生效,产物 gzip 后合计约 60KB** | | —(暂无域名) | `bark` | 0.0.0.0:8081 | Bark 推送服务端 | | — | `xpcool-mysql` | 127.0.0.1:3306 | MySQL 8.0(库 `service`) | @@ -104,7 +104,7 @@ - 脚本:`.workbuddy/tmp/kuma-bark-setup.sh`(幂等写入)、`.workbuddy/tmp/kuma-bark-verify.sh`(端到端验证 + 自清理);改库前必备份 `/tmp/kuma.db.backup.<时间戳>`。 - **端到端验证方法(推荐复用)**:临时插一个指向 `http://127.0.0.1:9/` 的监控(`interval=20/retry_interval=20/maxretries=0`)→ 重启容器 → 十几秒即 DOWN 并推送 → 查 `docker logs bark` 确认真的收到 GET 推送(200)→ 删掉临时监控与其 heartbeat 再重启。全程不清真站点,可靠性最高。 - 全部 9 个监控 `expiry_notification=1`(证书到期通知已开),当前均 UP。 -- **Bark 通知增强(2026-09-13 · 自定义图标/分组/重要警告/图片/角标)**:⏳ **补丁与素材已备好,待执行部署**(沙箱连续拦截 SSH,改由 `.workbuddy/tmp/deploy-bark-custom.ps1` 由用户本机一键执行)。官方 provider 只支持 `barkEndpoint/barkGroup/barkSound`,且图标写死 GitHub 上的 Kuma logo。扩展办法 = **用只读挂载覆盖 provider 单文件**: +- **Bark 通知增强(2026-09-13 · 自定义图标/分组/重要警告/图片/角标)**:✅ **2026-09-14 已部署并端到端验证通过**(部署包归档 `E:\CentOS\deploy-bark-custom\`)。官方 provider 只支持 `barkEndpoint/barkGroup/barkSound`,且图标写死 GitHub 上的 Kuma logo。扩展办法 = **用只读挂载覆盖 provider 单文件**: - 宿主机 `/data/uptime-kuma-patch/bark.js` ←→ 容器 `/app/server/notification-providers/bark.js`(`:ro`)。补丁源码在 `.workbuddy/tmp/bark.js`,改动点集中在 `statusParams()` 与 `additionalParameters()`,均以中文注释标了「xpcool 定制」。 - 行为:DOWN → `level=critical`(重要警告,穿透静音/专注)+ `volume=5` + `badge=auto`(角标自增)+ `isArchive=1` + 异常配图;UP → `badge=0`(清角标)+ 恢复配图。`call=1`(持续响铃 30s)**默认关闭**,要开就在 config 里加 `"barkCall": true`。 - 所有项都可用通知 `config` 里的同名字段覆盖:`barkIcon / barkGroup / barkSound / barkLevel / barkVolume / barkCall / barkBadge / barkImageDown / barkImageUp / barkBadgeReset`。**但 UI 里保存通知会重写 config、丢掉这些额外字段** —— 保持默认行为即可(补丁有兜底默认值),要改就走 SQL。 @@ -112,4 +112,8 @@ - 素材由 `.workbuddy/tmp/make-bark-assets.py`(Pillow 手绘)生成,纯几何 + 微软雅黑文字,体积 22~78 KB。 - **⚠️ 升级 uptime-kuma 镜像后**:`bark.js` 会被挂载覆盖成旧版实现,必须重新对照新版官方 `bark.js` 更新补丁(或临时去掉挂载)。 - **⚠️ 重建容器必须带回挂载**,否则补丁失效(表现为:通知还发,但图标/重要警告/配图/角标全没了)。完整启动参数见上。 - - 部署脚本:`.workbuddy/tmp/deploy-bark-custom.sh`(远端执行,幂等)+ `.workbuddy/tmp/deploy-bark-custom.ps1`(本机一键:上传 → 部署 → 端到端验证,日志写 `.workbuddy/tmp/logs/`)。 + - **部署包已归档到 `E:\CentOS\deploy-bark-custom\`**(补丁 + 素材 + 部署/验证脚本 + nginx 配置 + README);`.workbuddy/tmp/` 下的同名文件为工作副本。 + - 部署脚本:`deploy-bark-custom.sh`(远端执行,幂等)+ `deploy-bark-custom.ps1`(本机一键:上传 → 部署 → 端到端验证,日志写 `.workbuddy/tmp/logs/`)。 + - **2026-09-14 部署实测**:补丁 md5 `98c586f988084b89e1b5452257442b08` 宿主机与容器内一致;`docker inspect` 确认挂载在(`/data/uptime-kuma-patch/bark.js -> /app/server/notification-providers/bark.js`,`RW=false`);临时监控触发真实 DOWN 后,Bark 服务端日志收到带完整定制参数的推送(`icon=…/bark-assets/icon.png&group=Uptime-Kuma&sound=telegraph&level=critical&volume=5&badge=auto&isArchive=1&image=…/bark-assets/down.png`),对比部署前只有 `icon`(GitHub) + `group` + `sound` 三项。 + - **⚠️ 验证静态资源别只看 HTTP 状态码**:Kuma 的 SPA 对任何未知路径都返回 `200 + index.html`,只检查 code 会把「location 未生效」误判成成功;且 `nginx reload` 是优雅重启,旧 worker 退出期间请求仍可能落到 `location /`。故取图验证要先 `sleep 3` 再校验 `content_type=image/png`。 + - **⚠️ 手机上需允许「重要警告」**:`level=critical` 要真正穿透静音/专注,需在 Bark App 的通知设置里开启重要警告权限,否则仍会被系统静音。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index d397d8c..56e3a35 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -1,10 +1,10 @@ # xpcool.com 工作空间 · 统一规则与项目索引 -> 随会话自动加载。本文件只放规则与索引;**生产部署与运维细节见同目录 `DEPLOY.md`**,历史在各项目 CHANGELOG。 +> 随会话自动加载。本文件只放**规则与索引**;生产部署、服务器/容器/站点清单、nginx 与证书约定、安全加固与告警去重、本机工具链坑位,全部见同目录 **`DEPLOY.md`**。 ## 三条铁律(全项目通用) 1. **中文注释**:写/改代码时,在应有处(函数、复杂逻辑、配置项、非显然分支)加中文注释。 -2. **做记录**:每次请求/变更/修复/文档动作,在对应项目 `CHANGELOG.md` 顶部追加一条;跨项目规则与索引更新写回本目录。 +2. **做记录**:每次请求/变更/修复/文档动作,在对应项目 `CHANGELOG.md` 顶部追加一条 `YYYY-MM-DD | 类型 | 一句话摘要`(REQ/CHG/FIX/DOC/CFG/DEP)。 3. **中文优先**:思考、输出、交流能中文就中文。 ## 接口设计规范(2026-08-27 起 · 强制) @@ -19,27 +19,20 @@ ## 工作空间与项目索引 - 本仓库 `workbuddy.xpcool.com`(规则+索引+每日日志),远程 `https://git.xpcool.com/xpcool/workbuddy.xpcool.com.git`。 -- **布局约定**:所有项目与工作空间位于同一父目录下(`<父目录>/workbuddy.xpcool.com`、`admin.xpcool.com`、`service.xpcool.com`、`tool.xpcool.com`、`home.xpcool.com`),换设备按此布局 clone 即可,索引全部生效。 +- **布局约定**:所有项目与工作空间位于同一父目录下(`workbuddy.xpcool.com`、`admin.xpcool.com`、`service.xpcool.com`、`tool.xpcool.com`、`home.xpcool.com`、`xpcool.com`),换设备按此布局 clone,索引即生效。 | 项目 | 类型 | 变更记录 | 远程仓库 | |------|------|---------|---------| | admin.xpcool.com | Vue 管理后台前端 | `../admin.xpcool.com/.workbuddy/memory/CHANGELOG.md` | git.xpcool.com/xpcool/admin.xpcool.com.git | | service.xpcool.com | Go 后端服务 | `../service.xpcool.com/.workbuddy/memory/CHANGELOG.md` | git.xpcool.com/xpcool/service.xpcool.com.git | | tool.xpcool.com | 前端工具站 | `../tool.xpcool.com/.workbuddy/memory/CHANGELOG.md` | git.xpcool.com/xpcool/tool.xpcool.com.git | -| home.xpcool.com | 前端服务台(9 站统一入口) | `../home.xpcool.com/.workbuddy/memory/CHANGELOG.md` | 待建(本地 git 已 init/commit) | -| xpcool.com | 前端主域名(GPU 实时生成宇宙) | `../xpcool.com/.workbuddy/memory/CHANGELOG.md` | 已上线 2026-09-13(本地 git init/commit,远程待建) | - -## 记录格式 -- 倒序、一行一条:`YYYY-MM-DD | 类型 | 一句话摘要`;类型:REQ / CHG / FIX / DOC / CFG / DEP。 +| home.xpcool.com | 前端服务台(公开服务入口) | `../home.xpcool.com/.workbuddy/memory/CHANGELOG.md` | 本地 git init/commit,远程待建 | +| xpcool.com | 主域名:随机壁纸站(浏览器实时生成,可导出 4K;中英日韩 + 日夜主题) | `../xpcool.com/.workbuddy/memory/CHANGELOG.md` | 2026-09-13 上线;本地 git init/commit,远程待建 | ## 命中流程 判断涉及哪个项目 → 读该项目 CHANGELOG 头部 10–15 条 → 处理后于顶部追加本次记录 → 新增项目时同步更新上方索引表。 ## 协作约定 -- **只 commit、不要 push**(推送由用户自行完成,避免凭据交互失败)。 -- **验证分工**:AI 能做的(类型检查、构建、冒烟测试、容器健康检查)照做;浏览器交互体验、视觉效果等交给用户手动验证,不反复折腾自动化。 -- 换设备开工前先 `git pull` 各仓库。 -- 服务器操作走 SSH:`193.112.118.168:22025`,用户 `xxcool`,密钥 `~/.ssh/xpcool_ed25519`。**尽量把多个操作合并成一次 SSH 调用**,减少权限弹窗打扰用户。 - -## 生产环境与本机工具链 -→ 见同目录 **`DEPLOY.md`**:服务器/容器/站点与域名清单、nginx 与证书约定、安全加固与告警去重、本机 Windows/PowerShell 工具链坑位。 +- **只 commit、不要 push**(推送由用户自行完成,避免凭据交互失败)。换设备开工前先 `git pull` 各仓库。 +- **验证分工**:AI 能做的(类型检查、构建、冒烟测试)照做;浏览器交互体验、视觉效果交给用户手动验证,不反复折腾自动化。 +- 服务器操作走 SSH:`193.112.118.168:22025`,用户 `xxcool`,密钥 `~/.ssh/xpcool_ed25519`。**尽量把多个操作合并成一次 SSH 调用**,减少权限弹窗。 diff --git a/.workbuddy/tmp/deploy-bark-custom.sh b/.workbuddy/tmp/deploy-bark-custom.sh index e745b2f..9caae44 100644 --- a/.workbuddy/tmp/deploy-bark-custom.sh +++ b/.workbuddy/tmp/deploy-bark-custom.sh @@ -37,9 +37,17 @@ 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 -sudo docker exec uptime-kuma node --check /tmp/_bark_check.js && echo "补丁语法检查 OK" -sudo docker exec uptime-kuma rm -f /tmp/_bark_check.js -rm -f /tmp/_bark_check.js +# 语法错会让 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 "" @@ -53,9 +61,20 @@ echo "nginx reload OK" echo "" echo "=== 4. 公网取图验证(手机端要能直接拉到) ===" +# ⚠️ 两个坑: +# 1) nginx reload 是优雅重启,旧 worker 仍在退出中,reload 后立刻请求可能落到旧 +# worker 的 location / 上,拿到面板的 HTML(200 text/html),看着像"配置没生效"。 +# 2) 只看 HTTP 状态码会被骗 —— Kuma 的 SPA 对任何未知路径都返回 200 + index.html。 +# 必须校验 content_type 与体积。 +sleep 3 for f in icon down up; do - curl -s -o /dev/null -m 15 -w "$f.png code=%{http_code} type=%{content_type} size=%{size_download}\n" \ - "https://status.xpcool.com/bark-assets/$f.png" + 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 "" diff --git a/.workbuddy/tmp/kuma-bark-check.sh b/.workbuddy/tmp/kuma-bark-check.sh new file mode 100644 index 0000000..a50f5ae --- /dev/null +++ b/.workbuddy/tmp/kuma-bark-check.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# ============================================================ +# Uptime Kuma → Bark 通知链路自检 +# 做法:插一个必然失败的临时监控(指向 127.0.0.1:9), +# 关联 Bark 通知(id=1),重启 Kuma 等它 DOWN 并推送, +# 再从 Bark 容器日志确认真的收到;最后清理临时监控。 +# 注意:全程不清真站点。 +# ============================================================ +DB=/app/data/kuma.db +Q() { sudo -n docker exec uptime-kuma sqlite3 "$DB" "$1"; } +NAME='自检 · 临时Bark验证' + +echo "=== 0) BACKUP ===" +sudo -n cp /data/uptime-kuma/kuma.db "/tmp/kuma.db.backup.$(date +%Y%m%d%H%M%S)" +echo "backup -> /tmp/kuma.db.backup.$(date +%Y%m%d%H%M%S)" + +echo "=== 1) CLEAN PREVIOUS ===" +Q "DELETE FROM monitor_notification WHERE monitor_id IN (SELECT id FROM monitor WHERE name='$NAME');" +Q "DELETE FROM heartbeat WHERE monitor_id IN (SELECT id FROM monitor WHERE name='$NAME');" +Q "DELETE FROM monitor WHERE name='$NAME';" + +echo "=== 2) INSERT TEMP MONITOR ===" +Q "INSERT INTO monitor (name,active,user_id,type,url,interval,retry_interval,maxretries,weight,accepted_statuscodes_json) VALUES ('$NAME',1,1,'http','http://127.0.0.1:9/',20,20,0,9999,'[\"200-399\"]');" +TMPID=$(Q "SELECT id FROM monitor WHERE name='$NAME' LIMIT 1;") +echo "tmp monitor id = [$TMPID]" +Q "INSERT INTO monitor_notification (monitor_id,notification_id) VALUES ($TMPID,1);" +echo "linked to notification 1" +Q "SELECT mn.monitor_id, mn.notification_id, n.name, json_extract(n.config,'\$.type') FROM monitor_notification mn JOIN notification n ON n.id=mn.notification_id WHERE mn.monitor_id=$TMPID;" + +echo "=== 3) RESTART KUMA & WAIT ===" +sudo -n docker restart uptime-kuma >/dev/null 2>&1 +sleep 80 + +echo "=== 4) BARK LOG (tail 12) ===" +sudo -n docker logs --tail 12 bark 2>&1 + +echo "=== 5) KUMA LOG notif ===" +sudo -n docker logs --tail 150 uptime-kuma 2>&1 | grep -iE "notif|bark|down" | tail -12 + +echo "=== 6) CLEANUP ===" +Q "DELETE FROM heartbeat WHERE monitor_id=$TMPID;" +Q "DELETE FROM monitor_notification WHERE monitor_id=$TMPID;" +Q "DELETE FROM monitor WHERE id=$TMPID;" +echo "cleanup rows done" +sudo -n docker restart uptime-kuma >/dev/null 2>&1 +echo "kuma restarted" + +echo "=== 7) FINAL STATE ===" +Q "SELECT id,name,active FROM monitor ORDER BY id;" +Q "SELECT COUNT(*) AS links FROM monitor_notification;" +echo "DONE"