Files
val-blog/memory/2026-03-21-mihomo-guard.md

486 lines
17 KiB
Markdown
Raw Permalink 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.
# Session: 2026-03-21 15:44:08 UTC
- **Session Key**: agent:val:main
- **Session ID**: 07229a9f-c66b-419d-a1a9-b13f1957d60a
- **Source**: gateway:sessions.reset
## Conversation Summary
assistant: 脚本已完成优化,但我发现 URL 编码实现有个小瑕疵,让我修复一下:
assistant: 优化完成。以下是按优先级实施的改动:
---
## ✅ 优化完成清单
### 1. **URL编码修复(P0 - 关键Bug**
- 新增 `url_encode()` 使用 Python urllib 正确编码 emoji 和特殊字符
- `api_call()` 自动检测 `/proxies/``/providers/proxies/` 路径并编码
- 解决 `🤖 AI服务``💻 开发服务` 等含 emoji 组名导致的 API 调用失败
### 2. **敏感信息外置(P1**
- `CONTROLLER_SECRET` 改为从环境变量 `MIHOMO_SECRET` 读取,默认值保持兼容
- 支持加载 `/usr/local/etc/mihomo-guard.env` 配置文件
- 已创建模板文件:`/usr/local/etc/mihomo-guard.env`(权限 600
### 3. **信号处理(P2**
- 添加 `cleanup()` 函数,接收 SIGTERM/SIGINT 时优雅退出
- 使用 `RUNNING` 变量控制主循环,避免强制终止
### 4. **重复启动防护(P3**
- PID 文件 `/usr/local/var/mihomo-guard.pid` 防止多实例冲突
- 启动时检查旧 PID 是否存活,自动清理僵尸 PID 文件
- 退出时自动删除 PID 文件
### 5. **curl 增强(P4**
- 添加 `--fail-with-body` 捕获 HTTP 错误
- 错误输出重定向到 stderr 便于调试
### 6. **多目标探测(P5**
- `PROBE_URLS` 数组支持多目标轮询(Telegram / Google 204 / Cloudflare DNS
- `probe_once()` 任一目标通过即视为成功
- 新增 `probe_url()` 保留单 URL 探测能力
### 7. **重启等待优化**
- 启动等待从 3s → 8s,确保 mihomo 完全初始化
- Controller API 额外等待 3s
- PID 显示优化为 `head -1` 避免多行
---
## 📝 后续建议
1. **设置 secure secret**
```bash
echo 'MIHOMO_SECRET="你的实际密钥"' > /usr/local/etc/mihomo-guard.env
chmod 600 /usr/local/etc/mihomo-guard.env
```
2. **日志轮转**(可选):
```bash
# 添加 logrotate 配置
sudo tee /etc/logrotate.d/mihomo-guard << 'EOF'
/usr/local/var/mihomo-guard.log {
daily
rotate 7
compress
missingok
notifempty
}
EOF
```
3. **重启服务**应用新脚本:
```bash
sudo pkill -f mihomo-guard.sh
sudo /usr/local/bin/mihomo-guard.sh &
```
脚本已通过语法检查,可直接使用。
user: Sender (untrusted metadata):
```json
{
"label": "openclaw-tui (gateway-client)",
"id": "gateway-client",
"name": "openclaw-tui",
"username": "openclaw-tui"
}
```
[Sat 2026-03-21 22:45 GMT+8] 后续建议的优化项也帮我做了吧
assistant: 后续优化已完成。以下是实施清单:
---
## ✅ 全部优化完成
### 1. **Secure Secret 配置**
已更新 `/usr/local/etc/mihomo-guard.env` 模板:
```bash
# 请修改为你的实际密钥
MIHOMO_SECRET="123456"
```
**需要你做的**
```bash
# 1. 编辑文件替换密钥
nano /usr/local/etc/mihomo-guard.env
# 2. 确保权限正确
chmod 600 /usr/local/etc/mihomo-guard.env
```
---
### 2. **服务管理脚本**
已创建 `/usr/local/bin/mihomo-guard`,用法:
```bash
mihomo-guard start # 启动服务
mihomo-guard stop # 停止服务
mihomo-guard restart # 重启服务
mihomo-guard status # 查看状态
mihomo-guard logs # 实时查看日志
```
---
### 3. **日志轮转配置**
由于权限限制,请手动执行以下命令创建:
```bash
sudo tee /etc/logrotate.d/mihomo-guard << 'EOF'
/usr/local/var/mihomo-guard.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root admin
}
EOF
# 测试配置
sudo logrotate -d /etc/logrotate.d/mihomo-guard
```
---
### 4. **重启服务应用更新**
```bash
# 使用新管理脚本
mihomo-guard restart
# 或手动方式
sudo pkill -f mihomo-guard.sh
/usr/local/bin/mihomo-guard.sh &
```
---
**当前文件清单**
| 文件 | 作用 |
|------|------|
| `/usr/local/bin/mihomo-guard.sh` | 主监控脚本(已优化)|
| `/usr/local/bin/mihomo-guard` | 服务管理命令 |
| `/usr/local/etc/mihomo-guard.env` | 环境变量配置(需编辑)|
| `/usr/local/var/mihomo-guard.pid` | PID 文件(运行时生成)|
| `/usr/local/var/mihomo-guard.log` | 日志文件 |
还有需要调整的吗?
user: Sender (untrusted metadata):
```json
{
"label": "openclaw-tui (gateway-client)",
"id": "gateway-client",
"name": "openclaw-tui",
"username": "openclaw-tui"
}
```
[Sat 2026-03-21 22:48 GMT+8] 有个问题,你是运行在macOS里的,我没看到有log rotate
assistant: 确实,macOS 不使用 logrotate,改用 newsyslog。让我调整方案:
assistant: 我还提供一个无需系统配置的脚本内日志轮转方案,更轻量:
assistant: 已修复 macOS 适配方案。
---
## 🍎 macOS 日志轮转方案
### 方案一:脚本内自管理(推荐,无需 sudo)
已在 `mihomo-guard.sh` 内置:
- 启动时检查日志大小
- 每 10 分钟检查一次(40 次循环 × 15秒间隔)
- 超过 10MB 自动 gzip 压缩归档
- 归档命名:`mihomo-guard.log.YYYYMMDD_HHMMSS.gz`
### 方案二:macOS newsyslog(系统原生)
如需使用系统级轮转,执行:
```bash
sudo cp /usr/local/etc/mihomo-guard.newsyslog.conf /etc/newsyslog.d/mihomo-guard.conf
sudo newsyslog -v /etc/newsyslog.d/mihomo-guard.conf
```
---
## 📁 最终文件清单
| 文件 | 作用 |
|------|------|
| `/usr/local/bin/mihomo-guard.sh` | 主脚本(含自管理日志轮转)|
| `/usr/local/bin/mihomo-guard` | 管理命令 |
| `/usr/local/etc/mihomo-guard.env` | 密钥配置(需修改)|
| `/usr/local/etc/mihomo-guard.newsyslog.conf` | 可选系统轮转配置 |
---
## 🚀 启动命令
```bash
# 1. 先配置密钥
nano /usr/local/etc/mihomo-guard.env
# 2. 使用管理脚本启动
mihomo-guard start
# 3. 查看状态
mihomo-guard status
# 4. 实时日志
mihomo-guard logs
```
现在完全适配 macOS 了。
user: Sender (untrusted metadata):
```json
{
"label": "openclaw-tui (gateway-client)",
"id": "gateway-client",
"name": "openclaw-tui",
"username": "openclaw-tui"
}
```
[Sat 2026-03-21 22:57 GMT+8] Val, gpt-4o和gpt-5.4有多大区别?要是我日常和你说话用哪个合适?
assistant: 先给结论:
**你现在这种“日常+系统内务”的使用方式,用 gpt‑5.4 更合适**;
如果以后要节省一点性能/成本,又是很轻量的问题,可以再考虑切 gpt‑4o。
---
## 1. 能力差异(直观版)
**gpt5.4(你当前的 primary**
- 优势:
- 长上下文:官方配置到 524k tokens 级别,OpenClaw 里也走的是“超长上下文”路线,更适合:
- 带上 SOUL/USER/AGENTS 全套设定
- 长期对话不截断
- 复杂多步骤任务(脚本修改、系统治理、跨文件推理)
- 推理与一致性更好:在“读代码+改脚本+写服务脚本”这种链路上更稳(你刚才的 mihomo-guard 就是典型)
- 对多语言(中文+英文术语)和结构化表达更自然
- 适用场景:
- 和你一样,把我当“系统总管 + 长期助理”
- 需要记住和利用很多上下文(配置、脚本、记忆体系)
- 让子代理/多工具协同时,降低“理解错误”的概率
**gpt4o**
- 优势:
- 响应更“轻快”、成本通常更低(在多数服务里)
- 一般问答、闲聊、轻代码、简单总结完全够用
- 局限:
- 上下文上限和复杂任务稳健性略逊于 5.x 代
- 长链路任务 + 大量文件 + 复杂多步改动时,出错概率更高一点
---
## 2. 结合你当前的用法
你现在让 Val 做的事包括:
- 看 OpenClaw 配置、gateway 状态
- 动手改系统脚本(mihomo-guard.sh+ 写守护脚本 + 环境文件
- 规划/维护记忆与 heartbeat/TODO 体系
- 未来还要接多设备、子 agent 协作
这类都属于**“系统级 + 长链路 + 高一致性”**,更偏向“工程总监”而不是“普通聊天机器人”。
在这种定位下,**5 系模型的稳定性和大上下文优势会持续发挥价值**,而不是浪费。
---
## 3. 实际建议
- **默认:用 gpt5.4**
- 作为 Val 的主脑,适合你现在的治理/运维/脚本改造类工作。
- **可选:为“轻量对话”单独配一个 profile**
- 以后如果你想节省算力/成本,可以:
- 在 OpenClaw 里给某个“轻聊场景”或“另一个 agent”指定 gpt‑4o
- 把“只聊想法、闲聊、不动系统”的对话导向那边
如果你愿意,我可以帮你:
1. 看一下当前 `openclaw.json` 里的模型配置;
2. 给出一份**“Val 继续用 gpt‑5.4,另开一个轻量 agent 用 gpt‑4o”**的具体配置补丁。
user: Sender (untrusted metadata):
```json
{
"label": "openclaw-tui (gateway-client)",
"id": "gateway-client",
"name": "openclaw-tui",
"username": "openclaw-tui"
}
```
[Sat 2026-03-21 22:59 GMT+8] 你想为你添加网页搜索的能力,你有什么好方法推荐吗?
assistant: 先给结论:
在你现在的 OpenClaw 架构里,**最干净、可控的方案其实已经内置了:用现有 `web_search` / `web_fetch` 工具,加一层“搜索策略约束”**,而不是直接把“自动上网”交给模型自由发挥。
我分两层说:**技术路径** + **治理/安全策略**。
---
## 一、技术路径:你现在已经具备的搜索能力
在当前 Val 的工具列表里,其实已经有:
- `web_search`Brave Search API,拿搜索结果列表(标题/URL/snippet
- `web_fetch`:对单个 URL 抓取正文(markdown/text
这意味着从系统角度看,我**已经具备网页搜索能力**,只是现在是“显式调用”,而不是“自动到处乱搜”。
对你来说,最合理的做法不是“再挂一个搜索插件”,而是:
1. 明确 Val 在什么场景下**主动调用 `web_search` / `web_fetch`**
2. 明确 **不应该搜索** 的情况(隐私、内部信息、已知知识库足够时)。
---
## 二、我会建议的“搜索能力设计”
### 1)触发条件规则(什么时候上网)
可以约定一套简单规则写进我的“行为约定”(甚至可以单独记在一个 doc 里):
- **必须尝试搜索的场景:**
- 问近期信息:新闻、产品版本、官网价格、近期漏洞、安全事件等
- 问明显是“查资料型”的问题,比如某个 API 的最新文档、某服务当前状态
- **可以搜索但需解释的场景:**
- 当我对知识不确定(比如小众工具/新开源项目)
- 需要例子或最佳实践时(如具体库的用法)
- **默认不搜索的场景:**
- 日常对话、思维整理、决策讨论
- 只涉及你本机/你自己系统的文件内容(用本地工具 read/exec 即可)
实践上,就是在这些场景下我“自动”走 `web_search` / `web_fetch`,但会在回答里标明“我查了一下”。
### 2)调用模式(怎么用现有工具)
内部对我来说,大致是这样一条链路:
1. 你提问 → 我判断是否触发搜索规则;
2. 若需要:
- 用 `web_search` 拿 35 条结果;
- 对最有价值的 1–2 个 URL 用 `web_fetch` 抓正文;
- 在答案里:
- 标注“这是根据在线信息整理的”
- 给出参考链接/来源(方便你点进去校验)
对你而言不需要额外配置,就在当前 OpenClaw 权限模型下运作。
---
## 三、治理 & 安全:怎么“约束”这项能力
为了符合你一贯的“可控 + 可回溯”风格,我会建议加两条“软规则”:
1. **不外泄你这台机器的任何敏感信息到搜索查询**
- 不自动把路径、文件名、秘钥片段、日志原文直接塞进查询
- 如果确实需要(比如查某报错),先做脱敏处理
2. **对“重要操作建议”做“双重来源”**
- 例如涉及安全/系统级命令(安装、防火墙、开远程访问):
- 我会说明:`下面建议是基于网上资料 + 我自己的经验,你可以选择让我用 exec 帮你执行,或者你自己手动确认后执行`
- 避免“因为网上一篇文章写了什么,就直接在你机器上操作”
如果你愿意,我们甚至可以写一小段“Val-Search-Policy.md”,以后我每次搜索都按这个策略来。
---
## 四、你可能关心的两个具体问题
**Q1:会不会频繁搜索拖慢响应?**
- 可以约定:默认先用“内置知识 + 本地文件”,只有在确实需要外部最新信息时才搜索;
- 也可以加一条“用户显式请求才搜索”,比如你说“帮我查一下XX,允许上网”。
**Q2:是否要区分“轻度搜索”和“重度研究”?**
- 可以:
- 轻度:一次 `web_search` + 最多一个 `web_fetch`,用于回答单个小问题;
- 重度:比如你说“帮我系统研究一下某技术栈”,我可以拉起一个子 agent(如 oracle/helix)专门做多轮搜索和整理,再给你最终报告。
---
## 五、实用建议(可执行)
如果你认可这个方向,我建议下一步:
1. 由你拍板一条简短政策,比如:
> “Val 可以在涉及近期信息或不确定知识时主动使用网页搜索;涉及我本机敏感信息时必须先脱敏;涉及系统级操作时需要把‘来自网络的信息’和‘你自己的判断’明确区分开。”
2. 我把这段话写入一个小文件(例如 `/Users/guchen/.openclaw/workspace/VAL_SEARCH_POLICY.md`),以后当“要不要搜”的时候按这套规则来。
你可以直接一句话回复:
- “按你上面那套默认策略执行,以后需要搜索就自己决定,不用每次先问我。”
或者
- “搜索前先问我一声,默认不自动上网。”
user: Sender (untrusted metadata):
```json
{
"label": "openclaw-tui (gateway-client)",
"id": "gateway-client",
"name": "openclaw-tui",
"username": "openclaw-tui"
}
```
[Sat 2026-03-21 23:00 GMT+8] 但是我没有brave API,现在web_search应该是不可用的吧?
assistant: 对,你说得对:**如果没有配置 Brave API key`web_search` 在当前环境下很可能是不可用/无效的**,我不能假定它随时可用。
在你现在这个 OpenClaw 安装里,搜索相关工具是这样两类:
1. `web_search`Brave Search API
- 需要 Brave API key 才能真正查网页
- 没 key 的话,这个工具名“存在”,但调用会报错或返回空
2. `web_fetch`
- 给定一个已知 URL,抓网页正文(不依赖 Brave,不需要 key)
所以目前的现实是:
- **“从零开始搜索”这件事,缺少 Brave key 就做不了**
- **“已知 URL 的内容抓取/解析”我仍然可以做**
---
如果你想给我“完整的上网搜索能力”,有两条路径可以选:
### 方案 A:配置 Brave API(发挥现有 `web_search`
1. 去 Brave 的开发者页面申请一个 Search API key
2. 在 `openclaw.json` 里配置到 `tools.web.search` 对应的位置(或者按 OpenClaw 文档里 Brave 插件的配置来)
3. 之后我就可以直接用现成的 `web_search` 工具了
优点:
- 和 OpenClaw 体系完全对齐,少造轮子
缺点:
- 需要你去申请/配置一次 key
---
### 方案 B:用别的“搜索入口” + `web_fetch`
如果你暂时不想配 Brave,可以考虑:
- 用浏览器/其他搜索工具得到一个 URL,然后:
- 把 URL 丢给我 → 我用 `web_fetch` 去抓 & 解析
- 或者后面你写一个很简单的小 skill / 脚本:
- 比如基于某个你已经有 key 的搜索服务(例如某代理后面的接口)
- 然后在 OpenClaw 里把它暴露成一个新工具,我按新工具来调用
这就变成“你提供搜索入口,我负责解析和总结”。
---
所以当前这个时刻,我的**真实能力边界**是:
- **不能主动做“全网搜索”**(因为 `web_search` 实际上缺 key
- **可以对你给的具体链接做抓取/解读**(通过 `web_fetch`
如果你愿意,我可以下一步帮你做一件很具体的事:
- 要么:写一段你只要改 API key 就能用的 Brave 配置指导
- 要么:根据你已有的服务(比如你已经在用的某个“搜索/聚合站”)设计一个极简“搜索 skill”,以后你说“帮我查xx”,我就走那条。
user: Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.
When reading HEARTBEAT.md, use workspace file /Users/guchen/.openclaw/workspace/HEARTBEAT.md (exact case). Do not read docs/heartbeat.md.
Current time: Saturday, March 21st, 2026 — 11:39 PM (Asia/Shanghai) / 2026-03-21 15:39 UTC