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。
This commit is contained in:
夏犀麟 2026-09-14 01:01:32 +08:00
parent df607384ed
commit 621acf12ef
5 changed files with 106 additions and 23 deletions

View File

@ -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:1AAA 只需 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→打 bundleassets 带内容哈希必须先清目录)+ `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/<key>` 返回 `{"code":200,"message":"success"}`,公网入口 `https://service.xpcool.com/bark/<key>/` 也 200nginx `/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`

View File

@ -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 的通知设置里开启重要警告权限,否则仍会被系统静音。

View File

@ -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 头部 1015 条 → 处理后于顶部追加本次记录 → 新增项目时同步更新上方索引表。
## 协作约定
- **只 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 调用**,减少权限弹窗。

View File

@ -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 / 上,拿到面板的 HTML200 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 ""

View File

@ -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"