<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>杨洋的小站</title><description>慢慢来，比较快</description><link>https://v2yy.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.16.8</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年9月28日 18:09:31</lastBuildDate><item><title>Hermes Agent 踩坑实录：从安装到多端消息、服务器与 Cloudflare 全记录</title><link>https://v2yy.com/posts/hermes-pitfalls/</link><guid isPermaLink="true">https://v2yy.com/posts/hermes-pitfalls/</guid><description>把安装 Hermes Agent 以来真实踩过的坑按「安装环境 / 模型凭证 / 消息通道 / 浏览器工具 / 远程运维 / Pages 迁移」分类整理，每一条都带症状、根因和解法。</description><pubDate>Mon, 28 Sep 2026 19:30:00 GMT</pubDate><content:encoded>&lt;p&gt;这台机器上的 Hermes Agent 已经陪我跑了两个月，从 macOS 本机到 Vultr VPS，从 Telegram/企业微信/微信多通道到 Cloudflare Pages。中间踩的坑不少，有的查了一小时才发现是”错误提示在骗人”。这篇按分类整理成清单，症状 → 根因 → 解法，遇到同款问题时直接对号入座。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、安装与本机环境&lt;a href=&quot;#一安装与本机环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 安装体积到底多大？&lt;a href=&quot;#1-安装体积到底多大&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;~/.hermes&lt;/code&gt; 实测 &lt;strong&gt;8.5G&lt;/strong&gt;，看着吓人但大头都有出处：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes-agent/&lt;/code&gt; 5.6G：本体源码，其中 &lt;code&gt;.git&lt;/code&gt; 2.5G（升级历史）、&lt;code&gt;node_modules&lt;/code&gt; 1.0G（桌面端/TUI）、&lt;code&gt;venv&lt;/code&gt; 927M（Python 运行时）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/&lt;/code&gt; 972M：自动下载的 chromium、独立 node、cua-driver 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state.db&lt;/code&gt; 304M：&lt;strong&gt;会话数据库，删了整个聊天记录就没了&lt;/strong&gt;，别当缓存清&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;真正能安全回收的只有 &lt;code&gt;cache/scratch&lt;/code&gt; 和各种日志，软件本体约 7.5G 属正常水平。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. npm 全局装包 EACCES&lt;a href=&quot;#2-npm-全局装包-eacces&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;macOS 下往 &lt;code&gt;/usr/local&lt;/code&gt; 写全局包会权限报错。统一改用独立 prefix：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;pkg&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.npm-global&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# PATH 里加 ~/.npm-global/bin（写在 ~/.zprofile）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;另一个坑：有些 CLI 自带的 &lt;code&gt;xxx update&lt;/code&gt; 不认你的 prefix（比如 chatlab-cli），升级仍要回到 &lt;code&gt;npm i -g --prefix ~/.npm-global &amp;lt;pkg&amp;gt;@latest&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Node 版本大一统&lt;a href=&quot;#3-node-版本大一统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;机器上同时躺着 brew node、nvm node、pkg 安装的 node 时，脚本会以谁先入 PATH 说了算，构建行为玄学。收敛方案：nvm 设 default 版本 + 全局 CLI 全部搬进 &lt;code&gt;~/.npm-global&lt;/code&gt;，然后卸掉 brew 版 node。系统残留的 &lt;code&gt;/usr/local/bin/node&lt;/code&gt;（pkg 装的）最后要么删掉要么确保 PATH 顺序。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、模型 Provider 与凭证&lt;a href=&quot;#二模型-provider-与凭证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. “No usable credentials” 的假警报（经典陷阱）&lt;a href=&quot;#1-no-usable-credentials-的假警报经典陷阱&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;症状：&lt;code&gt;Could not resolve credentials for provider X: No usable credentials found&lt;/code&gt;，提示你去设环境变量。&lt;/p&gt;&lt;p&gt;真相：&lt;strong&gt;key 可能完全有效&lt;/strong&gt;。凭证池 &lt;code&gt;~/.hermes/auth.json&lt;/code&gt; 的 &lt;code&gt;credential_pool.&amp;lt;provider&amp;gt;&lt;/code&gt; 每项带 &lt;code&gt;last_status&lt;/code&gt; / &lt;code&gt;failure_reason&lt;/code&gt; 状态字段，一次 402（billing）会把它标成 &lt;code&gt;exhausted&lt;/code&gt;，之后即使账户恢复，Hermes 仍按标记判定”无可用凭证”。&lt;/p&gt;&lt;p&gt;处理流程：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 先证伪：直接拿 key 调一次 provider API，200 就说明 key 是好的&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 备份后重置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.hermes/auth.json&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.hermes/auth.json.bak&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reset&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;provider&amp;gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# 实测可能不彻底，必须回读文件确认&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 不彻底就手改 JSON：把 last_status / failure_reason / last_error_* 全部置 null，request_count 归零&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 4. 验证：hermes auth status + 实跑一次，输出里没有 &quot;Switched to fallback&quot; 才算过&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. CLI 通了、gateway 还在报错&lt;a href=&quot;#2-cli-通了gateway-还在报错&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;gateway 是常驻进程，凭证状态在内存里；CLI 每次新进程读磁盘。清完磁盘状态后如果 gateway 仍报错，需要 &lt;code&gt;hermes gateway restart&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;重启多 profile 时别用裸 &lt;code&gt;--replace&lt;/code&gt;——它会误杀默认网关（web-ui 托管会自动拉起的那个），要按 pid 文件精确 kill 再启动对应 profile。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 自定义 provider 的模型在 /model 里看不到&lt;a href=&quot;#3-自定义-provider-的模型在-model-里看不到&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;hermes model&lt;/code&gt; 选择器只管官方 portal，自定义模型用别名暴露：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model_aliases.&amp;lt;name&amp;gt;.model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&amp;lt;model-id&amp;gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model_aliases.&amp;lt;name&amp;gt;.provider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&amp;lt;provider&amp;gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 之后 /model &amp;lt;name&amp;gt; 任意平台可切&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;坑：一次性命令 &lt;code&gt;hermes chat -m &amp;lt;alias&amp;gt;&lt;/code&gt; 在已有默认 provider 时&lt;strong&gt;不会解析用户别名&lt;/strong&gt;，会静默归一化到默认模型。走 &lt;code&gt;/model&lt;/code&gt; 或环境变量 &lt;code&gt;HERMES_INFERENCE_PROVIDER&lt;/code&gt; 才可靠。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 图像生成：Web UI 端点没起来怎么办&lt;a href=&quot;#4-图像生成web-ui-端点没起来怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;走 &lt;code&gt;apikey-image-gen&lt;/code&gt; 那条路时如果本机 8648 端口压根没监听（Web UI 没跑），不要死等——直接用 provider 的 &lt;strong&gt;chat completions 多模态路由&lt;/strong&gt;生成图像。注意百炼这类中转端的响应是非标准结构：图片 URL 藏在 &lt;code&gt;output.choices[0].message.content[0].image&lt;/code&gt;，不是 OpenAI 标准的 &lt;code&gt;choices&lt;/code&gt; 顶层。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、消息通道（Telegram / 企业微信 / 微信）&lt;a href=&quot;#三消息通道telegram--企业微信--微信&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. “通道显示已连接，但消息永远不回”——先查 home_channel&lt;a href=&quot;#1-通道显示已连接但消息永远不回先查-home_channel&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最高优先级的静默故障：profile 的 &lt;code&gt;home_channel&lt;/code&gt; 缺 &lt;code&gt;platform&lt;/code&gt; 键 → &lt;code&gt;load_gateway_config()&lt;/code&gt; 抛 &lt;code&gt;KeyError: &apos;platform&apos;&lt;/code&gt; → &lt;strong&gt;该 profile 所有适配器直接不启动&lt;/strong&gt;，但界面上看着一切正常。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;platforms.wecom.home_channel.platform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wecom&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 然后重启 gateway；修完一个 profile 记得扫一遍所有 profile，同病往往成串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 第二高频：发送者没配对&lt;a href=&quot;#2-第二高频发送者没配对&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;日志里出现 &lt;code&gt;Unauthorized user ... on wecom&lt;/code&gt; 且对方收到 “pairing code: XXXX”，批准即可：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pairing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;approve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wecom&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 群消息永远不回 ≠ DM 配对问题&lt;a href=&quot;#3-群消息永远不回--dm-配对问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;group_policy: pairing&lt;/code&gt;（默认）会&lt;strong&gt;丢弃全部群流量&lt;/strong&gt;。逐群放行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;platforms.wecom.group_policy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allowlist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;platforms.wecom.group_allow_from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;[&quot;&amp;lt;chatid&amp;gt;&quot;]&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 改完要 gateway restart（这项在适配器构造期读取）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 白名单类环境变量必须放全局 .env&lt;a href=&quot;#4-白名单类环境变量必须放全局-env&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;WECOM_ALLOW_ALL_USERS=1&lt;/code&gt; 这类开关由 gateway 进程 &lt;code&gt;os.getenv()&lt;/code&gt; 读取，而 &lt;strong&gt;profile 的 .env 永远不会合并进 os.environ&lt;/strong&gt;。写在 profile &lt;code&gt;.env&lt;/code&gt; 里静默无效，只有 &lt;code&gt;~/.hermes/.env&lt;/code&gt; 生效。&lt;/p&gt;&lt;p&gt;验证也别看 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/environ&lt;/code&gt;——那是 exec 时快照，dotenv 启动后的改动看不见。以行为或 gateway.log 为准。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 企微/微信刷屏 ”💻 Running …”&lt;a href=&quot;#5-企微微信刷屏--running-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这些平台不能编辑已发送消息，工具进度每条都会变成新气泡。顶层 &lt;code&gt;display.tool_progress: all&lt;/code&gt; 在桌面端很香，但会压过平台默认的静默档：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;display.platforms.wecom.tool_progress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# display 配置每回合解析，不用重启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 微信 iLink 通道连发丢消息&lt;a href=&quot;#6-微信-ilink-通道连发丢消息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;同账号 30 秒内连发多条消息/媒体会被冷却丢弃，批量交付时要&lt;strong&gt;间隔发送&lt;/strong&gt;，不要一个回合甩十条。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、浏览器自动化与多媒体工具&lt;a href=&quot;#四浏览器自动化与多媒体工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 连主人自己的 Chrome：走 CDP，别拷 profile&lt;a href=&quot;#1-连主人自己的-chrome走-cdp别拷-profile&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;云浏览器拿不到登录态时，优先 &lt;code&gt;browser.cdp_url = http://127.0.0.1:9222&lt;/code&gt; 直连本机开调试端口的 Chrome。&lt;code&gt;use_real_profile&lt;/code&gt;（拷贝真实 profile）在 Chrome 运行中必然被写锁卡死。切标签的 &lt;code&gt;Target.activateTarget&lt;/code&gt; 不可靠，用 &lt;code&gt;new_tab()&lt;/code&gt; 开新标签自带登录态。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. macOS 图片处理两连坑&lt;a href=&quot;#2-macos-图片处理两连坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sips -s format webp&lt;/code&gt; 在部分系统版本直接报 &lt;code&gt;Can&apos;t write format&lt;/code&gt; → 改走 ffmpeg 或 PIL&lt;/li&gt;
&lt;li&gt;ffmpeg 想编码 &lt;strong&gt;avif&lt;/strong&gt; 需要 &lt;code&gt;libaom/encoder&lt;/code&gt;，常见发行版没带 → 目标 &lt;code&gt;.avif&lt;/code&gt; 时先试，失败退回 PNG 交给构建工具优化&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 二维码裁剪：OpenCV 有边界，视觉模型补位&lt;a href=&quot;#3-二维码裁剪opencv-有边界视觉模型补位&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;cv2.QRCodeDetector&lt;/code&gt; 能解标准方形 QR（裁完还能解码自证），但对&lt;strong&gt;微信赞赏码这种圆形太阳码&lt;/strong&gt;完全无效——它根本不是 QR 格式。可行流程：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;标准 QR：&lt;code&gt;detect()&lt;/code&gt; 拿四角坐标 → 裁方块 + 白边静区 → &lt;code&gt;detectAndDecode&lt;/code&gt; 验证解出的链接和原图一致&lt;/li&gt;
&lt;li&gt;太阳码：&lt;code&gt;vision_analyze&lt;/code&gt; 让多模态模型估圆心半径 → 按几何裁剪 → 再用视觉复检”无切边、无残留文字”&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;最后从&lt;strong&gt;线上 URL&lt;/strong&gt; 拉回来做一次端到端解码/复检，防 CDN 给你旧图。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. giscus 评论报 “app is not installed on this repository”&lt;a href=&quot;#4-giscus-评论报-app-is-not-installed-on-this-repository&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;仓库开了 Discussions 也会报——&lt;strong&gt;giscus 这个 GitHub App 必须单独安装授权&lt;/strong&gt;：&lt;code&gt;github.com/apps/giscus&lt;/code&gt; → 只选博客仓库 → Install and Authorize（会要求 passkey 二次验证）。装完不用改任何代码，刷新页面评论区就出来了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、远程服务器运维（VPS / SSH）&lt;a href=&quot;#五远程服务器运维vps--ssh&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 海外 VPS 的 SSH 玄学超时&lt;a href=&quot;#1-海外-vps-的-ssh-玄学超时&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vultr 东京机从国内连经常 &lt;code&gt;Connection timed out during banner exchange&lt;/code&gt;，但 443 端口 curl 秒通。结论：&lt;strong&gt;线路抖动，不是机器死了&lt;/strong&gt;，别上机排查——套一层 2~3 次重试循环即可。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 内联 ssh 命令是引号地狱，永远走脚本 + stdin&lt;a href=&quot;#2-内联-ssh-命令是引号地狱永远走脚本--stdin&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;bash -s&apos;&lt;/span&gt;&lt;span&gt; &amp;lt; &lt;/span&gt;&lt;span&gt;/tmp/probe.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;内联字符串里出现中文括号、&lt;code&gt;%{...}&lt;/code&gt;、嵌套引号、&lt;code&gt;python3 -c&lt;/code&gt; 时必炸。长命令还有 &lt;code&gt;Argument list too long&lt;/code&gt; 风险。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 构建类长任务要完全脱离 ssh 会话&lt;a href=&quot;#3-构建类长任务要完全脱离-ssh-会话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;直接 &lt;code&gt;nohup ... &amp;amp;&lt;/code&gt; 挂在 ssh 里，ssh 断开仍可能带走子进程：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;cd /opt/x &amp;amp;&amp;amp; (setsid nohup bash -c &quot;pnpm run build &amp;amp;&amp;amp; ...; echo EXIT=\$?&quot; &amp;gt;&amp;gt; build.log 2&amp;gt;&amp;amp;1 &amp;lt; /dev/null &amp;amp;); echo started&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 之后另开连接 tail build.log 轮询&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;反面教材：&lt;code&gt;pkill -f xxx&lt;/code&gt; 的匹配串也会命中你 ssh 命令自己，把会话杀死——用字符类打断如 &lt;code&gt;pkill -f &quot;kev[.]serve&quot;&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. nginx 的 403 不是 404&lt;a href=&quot;#4-nginx-的-403-不是-404&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;静态站上「目录存在但没有 index.html」返回 403。写了 &lt;code&gt;error_page 403 404 /404.html;&lt;/code&gt; 状态码&lt;strong&gt;仍然是 403&lt;/strong&gt;（原始码透传），必须加等号强制改写：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;error_page &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=404&lt;/span&gt;&lt;span&gt; /404.html;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. Cloudflare 橙云下的证书与缓存&lt;a href=&quot;#5-cloudflare-橙云下的证书与缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;HTTP-01 验证可以穿过 CF 代理正常签 Let’s Encrypt，源站选 &lt;strong&gt;Full&lt;/strong&gt; 模式；但代理会把静态资源边缘缓存 4h，&lt;strong&gt;换图后 URL 加版本号&lt;/strong&gt;（&lt;code&gt;alipay.png?v=20260928&lt;/code&gt;）是最省事的破缓存手段，比登录后台刷缓存快&lt;/li&gt;
&lt;li&gt;域名 NS 在 CF、解析走橙云时，&lt;code&gt;dig&lt;/code&gt; 到的是 CF 边缘 IP 而不是你的 VPS——这是特性不是解析失败&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 本机 DNS 会骗人&lt;a href=&quot;#6-本机-dns-会骗人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;家庭网络装了分流代理时，&lt;code&gt;dig&lt;/code&gt; 本机可能返回 &lt;code&gt;198.18.x.x&lt;/code&gt; 这类假 IP。验证公网解析一律走 DoH：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://dns.google/resolve?name=example.com&amp;amp;type=A&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、静态站迁 Cloudflare Pages（本博客就是例子）&lt;a href=&quot;#六静态站迁-cloudflare-pages本博客就是例子&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Astro 静态站从 VPS 搬 Pages 的完整拼图：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;仓库先干净&lt;/strong&gt;：内容全部 commit + push（Pages 只认 git）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建环境&lt;/strong&gt;：Pages 里设环境变量 &lt;code&gt;NODE_VERSION=22&lt;/code&gt;；用 corepack 的话再加 &lt;code&gt;COREPACK_ENABLE_DOWNLOAD_PROMPT=0&lt;/code&gt;，否则 &lt;code&gt;pnpm install&lt;/code&gt; 会卡在交互式提问等不到人&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名绑定&lt;/strong&gt;：项目 → Domains → 设置自定义域；DNS 本来就在 CF 的域会自动把 A 记录换成 Pages CNAME&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;www/apex 跳转放在 zone 规则做，别放 &lt;code&gt;_redirects&lt;/code&gt;&lt;/strong&gt;——这个坑我们踩过：站级 &lt;code&gt;_redirects&lt;/code&gt; 会连子路径一起 301，把两个入口都当正式站访问时行为诡异；正确姿势是 zone 层 Redirect Rule：&lt;code&gt;https://www.v2yy.com/* → https://v2yy.com/${1}&lt;/code&gt; 301&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro 内容集合的日期校验&lt;/strong&gt;：frontmatter &lt;code&gt;published: 2026-09-28 17:00&lt;/code&gt; 会报 &lt;code&gt;Expected type &quot;date&quot;, received &quot;string&quot;&lt;/code&gt;——&lt;strong&gt;必须写到秒&lt;/strong&gt; &lt;code&gt;17:00:00&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;迁移后 VPS 不必退场：留一个 nginx 块把老域名 301 到新域，双轨跑一段，老链接全部无缝。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、工具层的一个隐蔽坑（写给用 AI 助手运维的人）&lt;a href=&quot;#七工具层的一个隐蔽坑写给用-ai-助手运维的人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;自动化助手往文件里写配置时，如果内容里有 &lt;code&gt;XXX_KEY = &quot;...&quot;&lt;/code&gt; 这种&lt;strong&gt;长得像凭据的行&lt;/strong&gt;，某些脱敏管线会静默把值替换成 &lt;code&gt;***&lt;/code&gt; 再落盘——语法合法但内容已废，排查半天。对策：含敏感字样的文件生成后&lt;strong&gt;回读断言&lt;/strong&gt;没有 &lt;code&gt;***&lt;/code&gt;；凭据用 argv/环境注入而不是内联字面量。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;附：一条通用心法&lt;a href=&quot;#附一条通用心法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上面一半的坑，根因都是**“表面的成功信号是假的”**：通道显示 connected 但没启动、CLI 成功但 gateway 没恢复、构建 exit 0 但产物是旧文件、dig 有返回但是代理假 IP。所以给自己立的规矩是——&lt;strong&gt;状态必须回读验证，证据必须交叉来源&lt;/strong&gt;：写完读文件、部署完 curl 线上、清凭证后实跑一次、验解析同时看 DoH 和权威 NS。&lt;/p&gt;&lt;p&gt;慢一点，但每个”完成”都是真的。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;环境：macOS + Hermes Agent、Vultr Ubuntu 24.04、Cloudflare（DNS/代理/Pages）、Astro 7 + pnpm&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>Hello World！本站开张啦</title><link>https://v2yy.com/posts/hello-world/</link><guid isPermaLink="true">https://v2yy.com/posts/hello-world/</guid><description>博客搭建完成，这里是第一篇文章，记录一下开站的想法。</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;为什么要建这个博客&lt;a href=&quot;#为什么要建这个博客&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一直想有个自己的地方，写点技术笔记、记录生活和思考。域名是 v2yy.com，v2 是新版本的意思，yy 是我的名字缩写喵～&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;本站的技术栈&lt;a href=&quot;#本站的技术栈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;主题：&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;Firefly&lt;/a&gt;（基于 Astro + Fuwari 的清新博客模板）&lt;/li&gt;
&lt;li&gt;部署：Vultr VPS 上 Astro 静态构建，nginx 托管，Cloudflare 代理 + Let’s Encrypt 证书&lt;/li&gt;
&lt;li&gt;更新方式：服务器上改内容后一键构建发布&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;慢慢来，比较快&lt;a href=&quot;#慢慢来比较快&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是给自己的座右铭。不追求日更，但求每篇都有干货。&lt;/p&gt;&lt;p&gt;接下来计划写这些方向：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;后端与运维实战踩坑记录&lt;/li&gt;
&lt;li&gt;自动化工具与效率实践&lt;/li&gt;
&lt;li&gt;一些生活随想&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;敬请期待喵～&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>