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

17 KiB
Raw Permalink Blame History

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

    echo 'MIHOMO_SECRET="你的实际密钥"' > /usr/local/etc/mihomo-guard.env
    chmod 600 /usr/local/etc/mihomo-guard.env
    
  2. 日志轮转(可选):

    # 添加 logrotate 配置
    sudo tee /etc/logrotate.d/mihomo-guard << 'EOF'
    /usr/local/var/mihomo-guard.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
    }
    EOF
    
  3. 重启服务应用新脚本:

    sudo pkill -f mihomo-guard.sh
    sudo /usr/local/bin/mihomo-guard.sh &
    

脚本已通过语法检查,可直接使用。 user: Sender (untrusted metadata):

{
  "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 模板:

# 请修改为你的实际密钥
MIHOMO_SECRET="123456"

需要你做的

# 1. 编辑文件替换密钥
nano /usr/local/etc/mihomo-guard.env

# 2. 确保权限正确
chmod 600 /usr/local/etc/mihomo-guard.env

2. 服务管理脚本

已创建 /usr/local/bin/mihomo-guard,用法:

mihomo-guard start     # 启动服务
mihomo-guard stop      # 停止服务
mihomo-guard restart   # 重启服务
mihomo-guard status    # 查看状态
mihomo-guard logs      # 实时查看日志

3. 日志轮转配置

由于权限限制,请手动执行以下命令创建:

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. 重启服务应用更新

# 使用新管理脚本
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):

{
  "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(系统原生)

如需使用系统级轮转,执行:

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 可选系统轮转配置

🚀 启动命令

# 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):

{
  "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 用 gpt4o”**的具体配置补丁。 user: Sender (untrusted metadata):
{
  "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_searchBrave 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 条结果;
    • 对最有价值的 12 个 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):
{
  "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 keyweb_search 在当前环境下很可能是不可用/无效的,我不能假定它随时可用。

在你现在这个 OpenClaw 安装里,搜索相关工具是这样两类:

  1. web_searchBrave Search API

    • 需要 Brave API key 才能真正查网页
    • 没 key 的话,这个工具名“存在”,但调用会报错或返回空
  2. web_fetch

    • 给定一个已知 URL,抓网页正文(不依赖 Brave,不需要 key)

所以目前的现实是:

  • “从零开始搜索”这件事,缺少 Brave key 就做不了
  • “已知 URL 的内容抓取/解析”我仍然可以做

如果你想给我“完整的上网搜索能力”,有两条路径可以选:

  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