<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HY博客</title><description>一个孤独的地方，散落着一个人的人生碎片</description><link>https://www.bcd.moe/</link><language>zh-CN</language><atom:link href="https://www.bcd.moe/rss.xml" rel="self" type="application/rss+xml"/><image><url>https://www.bcd.moe/favicon.png</url><title>HY博客</title><link>https://www.bcd.moe/</link></image><item><title>OpenClaw 安装、卸载与更新：一篇带你学会</title><link>https://www.bcd.moe/blog/openclaw-install-uninstall-update-guide</link><guid isPermaLink="true">https://www.bcd.moe/blog/openclaw-install-uninstall-update-guide</guid><description>一篇讲清 OpenClaw 的安装、卸载与更新流程，适合新手快速上手，并附常见问题与排查思路。</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本教程采用 &lt;strong&gt;Linux 服务器&lt;/strong&gt;部署方式。&lt;/p&gt;
&lt;p&gt;不建议把 OpenClaw 作为“常用 Windows 桌面软件”来安装运行：一方面 Windows 环境下的网络/权限/守护进程模型更复杂；另一方面聊天/网关类服务通常涉及密钥与持久化数据，&lt;strong&gt;更推荐放在独立服务器或 WSL2&lt;/strong&gt; 中集中管理，降低日常桌面环境的意外风险。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;推荐服务器（示例）&lt;/h2&gt;
&lt;p&gt;如果你需要一台长期运行的网关主机，可以参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;腾讯云春季活动：&lt;a href=&quot;https://cloud.tencent.com/act/pro/spring2026&quot;&gt;https://cloud.tencent.com/act/pro/spring2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;阿里云轻量应用服务器活动：&lt;a href=&quot;https://www.aliyun.com/benefit/scene/swas&quot;&gt;https://www.aliyun.com/benefit/scene/swas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;选型建议：优先选择干净的 Ubuntu LTS / Debian 基础镜像，不要用第三方“魔改一键镜像”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;安装（macOS/Linux/WSL2 统一采用 install.sh）&lt;/h2&gt;
&lt;p&gt;我们采用官方脚本安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后建议运行新手引导（会配置认证、Gateway，并可安装守护进程/服务）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw onboard --install-daemon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查网关状态：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw gateway status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开控制面板（最快开始聊天/调试）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw dashboard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次真正跑 &lt;code&gt;openclaw onboard --install-daemon&lt;/code&gt; 时，还会经历一轮交互式配置。首次安装时，通常可以按下面这套思路来选：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;personal-by-default ... Continue?&lt;/code&gt; → 选 &lt;code&gt;Yes&lt;/code&gt;，按个人使用场景继续。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Onboarding mode&lt;/code&gt; → 选 &lt;code&gt;QuickStart&lt;/code&gt;，先把主流程跑通，细节后面再配。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Model/auth provider&lt;/code&gt; → 如果你用的是 Z.AI，就选 &lt;code&gt;Z.AI&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Z.AI auth method&lt;/code&gt; → 选 &lt;code&gt;CN (Z.AI CN / open.bigmodel.cn)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;How do you want to provide this API key?&lt;/code&gt; → 选 &lt;code&gt;Paste API key now&lt;/code&gt;，直接写入配置，适合个人 VPS；但不要泄露 API Key。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完成后，建议立刻用下面几条命令确认网关是否真的起来了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw status
openclaw gateway status
ss -lntp | grep 18789
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要看到 &lt;code&gt;127.0.0.1:18789&lt;/code&gt; 处于监听状态，就说明 Gateway 已经在本机跑起来了。&lt;/p&gt;
&lt;h3&gt;配置渠道&lt;/h3&gt;
&lt;h4&gt;Dashboard&lt;/h4&gt;
&lt;p&gt;如果 OpenClaw 安装在远程 Linux 服务器上，Dashboard 默认只监听本机回环地址，也就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;127.0.0.1:18789&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着 Dashboard 默认不会直接暴露到公网。最常见、也最安全的访问方式，是先在服务器上拿到 Dashboard 地址，再通过 SSH 隧道转发到自己电脑上访问。&lt;/p&gt;
&lt;p&gt;先在服务器上执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw dashboard --no-open
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你会看到类似下面的输出：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Dashboard URL: http://127.0.0.1:18789/#token=xxxxxxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你是在自己电脑上访问这台远程服务器，就先建立端口转发：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -N -L 18789:127.0.0.1:18789 root@你的服务器IP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在本地浏览器打开：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;http://localhost:18789/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者直接打开带 token 的完整链接：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;http://localhost:18789/#token=xxxxxxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里最容易搞混的一点是：&lt;strong&gt;远程服务器上的 &lt;code&gt;127.0.0.1&lt;/code&gt;，并不是你本地电脑浏览器里的 &lt;code&gt;127.0.0.1&lt;/code&gt;。&lt;/strong&gt; 所以只要是“远程部署 + 本地浏览器访问”的场景，通常都要先走 SSH 隧道。&lt;/p&gt;
&lt;p&gt;另外，页面如果要求手动填写 token，建议直接复制 &lt;code&gt;openclaw dashboard --no-open&lt;/code&gt; 输出的完整 URL，不要手敲，避免少字符、多空格，或者复制时漏掉一截。&lt;/p&gt;
&lt;h4&gt;飞书&lt;/h4&gt;
&lt;p&gt;如果你要把 OpenClaw 接到飞书，QuickStart 里直接选择 &lt;code&gt;Feishu/Lark (飞书)&lt;/code&gt; 即可。随后它会要求你填写飞书应用的 &lt;code&gt;App ID&lt;/code&gt; 和 &lt;code&gt;App Secret&lt;/code&gt;，并自动安装对应插件。&lt;/p&gt;
&lt;p&gt;除了填凭据，飞书应用本身也要在开放平台里配完整，至少确认以下几项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建的是 &lt;strong&gt;企业自建应用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;已开启 &lt;strong&gt;机器人能力&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;配置机器人权限：JSON 文件可批量导入 &lt;a href=&quot;https://uee.ee/feishu&quot;&gt;https://uee.ee/feishu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;事件订阅使用 &lt;strong&gt;长连接（WebSocket）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;已添加事件：&lt;code&gt;im.message.receive_v1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;应用已经 &lt;strong&gt;发布&lt;/strong&gt;，而不是只保存在草稿态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果这些没配好，就很容易出现“机器人已经加进群了，但就是不回消息”的情况。&lt;/p&gt;
&lt;p&gt;还有一个首次接通时经常碰到的现象：你私聊机器人后，它没有直接进入对话，而是返回类似下面的提示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;access not configured
Pairing code: XXXXXXXX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这不代表飞书配置失败，恰恰说明链路已经通了，只是当前账号还没被授权。此时只需要在服务器上执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw pairing approve feishu &amp;lt;配对码&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;批准之后，再回到飞书私聊机器人发一句“你好”，通常就能正常开始对话。&lt;/p&gt;
&lt;h4&gt;微信&lt;/h4&gt;
&lt;p&gt;如果你要把 OpenClaw 接到微信，可以在运行 OpenClaw 的那台机器上执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx -y @tencent-weixin/openclaw-weixin-cli@latest install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/openclaw-install-uninstall-update-guide/wechat-step-1-plugin-doc.jpg&quot; alt=&quot;OpenClaw 连接微信文档提示&quot;&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;在微信页面里点绿色的“连接”按钮，确认把 OpenClaw 绑定到微信。&lt;/li&gt;
&lt;li&gt;连接完成后，在微信里发一条测试消息，例如 &lt;code&gt;hello world&lt;/code&gt;，确认机器人已经能正常回复。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/openclaw-install-uninstall-update-guide/wechat-step-2-terminal-install.png&quot; alt=&quot;微信插件安装与扫码登录终端输出&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/openclaw-install-uninstall-update-guide/wechat-step-3-connect-button.jpg&quot; alt=&quot;微信内点击“连接”按钮&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/openclaw-install-uninstall-update-guide/wechat-step-4-success-reply.jpg&quot; alt=&quot;微信中测试消息已成功回复&quot;&gt;&lt;/p&gt;
&lt;p&gt;按这套流程走通之后，就说明微信通道已经接入成功，可以正常通过微信和 OpenClaw 对话。&lt;/p&gt;
&lt;h4&gt;QQ&lt;/h4&gt;
&lt;p&gt;腾讯现已正式宣布 QQ 开放平台接入 OpenClaw，整体部署流程也比较直接。&lt;/p&gt;
&lt;p&gt;第一步，登录 QQ 开放平台：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://q.qq.com/&quot;&gt;https://q.qq.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;进入对应入口后创建机器人，拿到自己的 &lt;code&gt;AppID&lt;/code&gt; 和 &lt;code&gt;AppSecret&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;接入 OpenClaw 时，常用步骤可以直接概括为下面三条命令：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装 OpenClaw 社区 QQBot 插件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw plugins install @sliverp/qqbot@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;配置并绑定当前 QQ 机器人：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw channels add --channel qqbot --token &amp;quot;AppID:AppSecret&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;AppID:AppSecret&lt;/code&gt; 要替换成你自己的实际凭据，不要直接照抄示例。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;重启本地 OpenClaw 服务：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成后，就可以在 QQ 侧测试机器人是否已经能正常接收并回复消息。&lt;/p&gt;
&lt;h3&gt;基础使用教程&lt;/h3&gt;
&lt;h4&gt;OpenClaw 安装后的基本结构&lt;/h4&gt;
&lt;p&gt;OpenClaw 装好之后，最常接触到的通常不是一大堆复杂目录，而是几个核心文件和路径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt;：主配置文件，渠道、模型、网关、工具权限等基本都在这里配。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.openclaw/workspace/&lt;/code&gt;：默认工作区，平时的项目、技能、文档和一些自定义内容一般都放这里。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.openclaw/workspace/MEMORY.md&lt;/code&gt;：长期记忆文件，用来记录稳定偏好、长期项目背景、关键决策。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.openclaw/workspace/memory/&lt;/code&gt;：日常记忆目录，适合按日期记录临时进展、当天事项和阶段性信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.openclaw/extensions/&lt;/code&gt;：已安装插件目录，例如飞书、微信、QQBot 这类渠道插件通常会出现在这里。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是个人使用，实际最需要先认识的就是：&lt;strong&gt;配置文件 &lt;code&gt;openclaw.json&lt;/code&gt;、工作区 &lt;code&gt;workspace/&lt;/code&gt;，以及长期记忆文件 &lt;code&gt;MEMORY.md&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;常用命令&lt;/h4&gt;
&lt;p&gt;OpenClaw 装好之后，日常最常用的命令和消息操作通常包括这些：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/new&lt;/code&gt;：开启一个新会话。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/reset&lt;/code&gt;：重置当前会话。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/status&lt;/code&gt;：查看当前状态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw status&lt;/code&gt;：查看整体状态、Gateway、渠道、会话等概况。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw gateway status&lt;/code&gt;：查看网关状态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw gateway restart&lt;/code&gt;：重启网关。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw dashboard&lt;/code&gt;：打开控制面板。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw dashboard --no-open&lt;/code&gt;：只输出 Dashboard 地址和 token，适合远程服务器场景。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw logs --follow&lt;/code&gt;：实时查看日志，排查渠道不回复、插件报错、连接失败等问题时很有用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是刚装好，最实用的一套顺序通常是：先看 &lt;code&gt;openclaw status&lt;/code&gt;，再试 &lt;code&gt;openclaw dashboard&lt;/code&gt;，最后在实际渠道里发一条消息验证是否已经能正常回复。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;更新&lt;/h2&gt;
&lt;p&gt;如果后续需要更新 OpenClaw，通常再次执行官方安装脚本即可：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行完成后，记得重启网关：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新后建议顺手确认一下当前状态：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw --version
openclaw status
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;卸载（彻底清除：包含 ~/.openclaw 数据）&lt;/h2&gt;
&lt;p&gt;在 Linux 上“彻底卸载”（包括 &lt;code&gt;~/.openclaw&lt;/code&gt; 数据目录）最省心的方法就是用 OpenClaw 自带的卸载器。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你只想删除 CLI 但保留数据，请不要运行带 &lt;code&gt;--all&lt;/code&gt; 的命令。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1) 一条命令彻底卸载（推荐）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw uninstall --all --yes --non-interactive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--all&lt;/code&gt;：卸载服务 + 删除状态/数据目录（包括 &lt;code&gt;~/.openclaw&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--yes&lt;/code&gt;：默认确认&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--non-interactive&lt;/code&gt;：非交互模式，适合在 SSH / 自动化里跑&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2) 这条命令到底删了什么？&lt;/h3&gt;
&lt;p&gt;你会看到类似输出（示例已脱敏主机名）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;🦞 OpenClaw 2026.2.17 (4134875) — Chat APIs that don&amp;#39;t require a Senate hearing.

Stopped systemd service: openclaw-gateway.service
Removed systemd service: /root/.config/systemd/user/openclaw-gateway.service
Removed ~/.openclaw
Removed ~/.openclaw/workspace
CLI still installed. Remove via npm/pnpm if desired.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;逐行解释：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Stopped systemd service: openclaw-gateway.service&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;停止 &lt;strong&gt;systemd 用户级&lt;/strong&gt;服务，确保网关进程不再运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Removed systemd service: /root/.config/systemd/user/openclaw-gateway.service&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除该服务的 unit 文件。&lt;/li&gt;
&lt;li&gt;结果：以后不会再自动启动 Gateway。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Removed ~/.openclaw&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除 OpenClaw 的默认&lt;strong&gt;状态目录&lt;/strong&gt;（state dir）。&lt;/li&gt;
&lt;li&gt;这里通常包含配置、运行状态、日志、插件数据、缓存等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Removed ~/.openclaw/workspace&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除 OpenClaw 默认工作区（智能体文件、技能、以及你放在其中的项目文件等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;CLI still installed...&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;说明：卸载器帮你把“服务”和“数据”清了，但 &lt;code&gt;openclaw&lt;/code&gt; 这个命令本体还在（通常是通过 npm 全局安装的）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3) 把 CLI 也卸载掉（真正“一个不剩”）&lt;/h3&gt;
&lt;p&gt;脚本安装（install.sh）一般会通过 npm 全局安装 CLI，直接执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm rm -g openclaw
hash -r
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;为什么是两个命令？&lt;code&gt;hash -r&lt;/code&gt; 是什么？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm rm -g openclaw&lt;/code&gt;：卸载 OpenClaw CLI（从 npm 全局目录移除）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hash -r&lt;/code&gt;：让当前 shell 清空“命令路径缓存”，避免出现刚卸载完却还提示能找到命令的错觉。&lt;ul&gt;
&lt;li&gt;不想执行 &lt;code&gt;hash -r&lt;/code&gt; 也可以：重新开一个终端再验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4) 验证是否卸载干净&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;command -v openclaw || echo &amp;quot;openclaw not found&amp;quot;
openclaw --version
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;command -v openclaw&lt;/code&gt; 输出为空并打印 &lt;code&gt;openclaw not found&lt;/code&gt;：说明 PATH 下已找不到命令。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openclaw --version&lt;/code&gt; 报 &lt;code&gt;command not found&lt;/code&gt;：这是预期结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5) 常见坑与补充&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多 Profile 情况&lt;/strong&gt;：如果你使用过 &lt;code&gt;--profile&lt;/code&gt; / &lt;code&gt;OPENCLAW_PROFILE&lt;/code&gt;，状态目录可能是 &lt;code&gt;~/.openclaw-&amp;lt;profile&amp;gt;&lt;/code&gt;，需要对每个 profile 目录分别清理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远程模式&lt;/strong&gt;：状态目录在运行 Gateway 的那台机器上；卸载也需要在那台机器上操作。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>Vaultwarden（Docker）怎么查看版本并升级？一套可复制的更新流程</title><link>https://www.bcd.moe/blog/vaultwarden-docker-upgrade-version-check-and-update-guide</link><guid isPermaLink="true">https://www.bcd.moe/blog/vaultwarden-docker-upgrade-version-check-and-update-guide</guid><description>以 Docker Compose 部署为例，讲清 Vaultwarden 如何查看当前版本、pull 最新镜像、重建容器完成升级，并处理 compose version 过时与 ADMIN_TOKEN 明文告警。</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;域名、主机名、真实目录、容器 ID、时间戳、Token/密钥等信息均已替换为示例值。&lt;/li&gt;
&lt;li&gt;命令输出为示例输出，仅用于帮助你识别成功/失败状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vaultwarden（非官方 Bitwarden 服务端实现）用 Docker/Compose 部署后，升级维护的核心目标只有三个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;版本可核对&lt;/strong&gt;（升级前后都能确认版本变化）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据不丢&lt;/strong&gt;（卷挂载目录可备份、可恢复）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变更可回滚&lt;/strong&gt;（至少能退回到上一个镜像/配置）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面按一套“可复制”的流程来做。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;0）前提：确认你有 Docker 权限&lt;/h2&gt;
&lt;p&gt;先试：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;能输出容器列表：权限 OK&lt;/li&gt;
&lt;li&gt;若报 &lt;code&gt;permission denied&lt;/code&gt;：用 &lt;code&gt;sudo&lt;/code&gt; 或切 root&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用（切 root）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo -i
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;1）进入 compose 目录&lt;/h2&gt;
&lt;p&gt;找到放着 &lt;code&gt;docker-compose.yml&lt;/code&gt; 的目录（示例：&lt;code&gt;/opt/vaultwarden&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /opt/vaultwarden
ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般会看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vw-data/&lt;/code&gt;（Vaultwarden 数据目录，示例名）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;你的实际数据目录以 compose 里 &lt;code&gt;volumes:&lt;/code&gt; 挂载为准。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;2）查看 Vaultwarden 与 Web-Vault 版本（最准确）&lt;/h2&gt;
&lt;p&gt;直接在容器里查：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker exec -it vaultwarden /vaultwarden --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例输出：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Vaultwarden 1.35.3
Web-Vault 2026.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Vaultwarden&lt;/code&gt;：后端服务版本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Web-Vault&lt;/code&gt;：网页端静态资源版本&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;3）（强烈建议）升级前备份数据目录&lt;/h2&gt;
&lt;p&gt;如果你是这样挂载的（示意）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;volumes:
  - ./vw-data:/data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么在 compose 目录下打包备份即可：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tar -czf vw-data-backup-$(date +%F).tgz vw-data
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;升级通常很稳，但备份是“低成本保险”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;4）拉取最新镜像&lt;/h2&gt;
&lt;p&gt;如果你的 compose 使用 &lt;code&gt;latest&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  vaultwarden:
    image: vaultwarden/server:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么更新时拉取最新镜像：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose pull
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;常见提示：&lt;code&gt;version is obsolete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;你可能会看到：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;the attribute `version` is obsolete, it will be ignored
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这表示 Docker Compose v2 不再需要顶层 &lt;code&gt;version: &amp;quot;3&amp;quot;&lt;/code&gt;，会忽略它。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不影响运行&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;想消除提示：把 &lt;code&gt;docker-compose.yml&lt;/code&gt; 顶层的 &lt;code&gt;version: &amp;quot;3&amp;quot;&lt;/code&gt; 删除即可&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;5）用新镜像重建并后台启动&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出里出现 &lt;code&gt;Recreated&lt;/code&gt; / &lt;code&gt;Started&lt;/code&gt;，通常表示已成功用新镜像重建。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;6）验收：看日志 + 再查一次版本&lt;/h2&gt;
&lt;p&gt;看启动日志（示例取最后 50 行）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker logs -n 50 vaultwarden
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很多版本会在启动 banner 里显示，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Starting Vaultwarden
Version 1.35.4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再查一次版本确认：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker exec -it vaultwarden /vaultwarden --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Vaultwarden 1.35.4
Web-Vault 2026.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;7）（可选）清理旧镜像，释放磁盘&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker image prune -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会清理“未被引用”的镜像层，不影响正在运行的容器。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;8）安全加固：把 ADMIN_TOKEN 从明文改为 Argon2 哈希（推荐）&lt;/h2&gt;
&lt;p&gt;如果日志出现类似提示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;You are using a plain text ADMIN_TOKEN which is insecure.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明你在 compose 里配置了明文管理员 Token。建议改为 &lt;strong&gt;Argon2 PHC 哈希&lt;/strong&gt;，降低配置泄露风险。&lt;/p&gt;
&lt;h3&gt;8.1 生成 Argon2 哈希&lt;/h3&gt;
&lt;p&gt;在服务器上执行（会提示你输入原始 token；&lt;strong&gt;不要把 token/哈希粘贴到公开场合&lt;/strong&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker exec -it vaultwarden /vaultwarden hash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会输出形如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;$argon2id$v=19$m=65540,t=3,p=4$...$...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.2 替换 compose 里的 ADMIN_TOKEN&lt;/h3&gt;
&lt;p&gt;把（示意）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;environment:
  ADMIN_TOKEN: &amp;quot;你的明文token&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;替换为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;environment:
  ADMIN_TOKEN: &amp;quot;$argon2id$...&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后应用变更：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;9）最小化“升级 SOP”（你可以贴到运维手册里）&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /opt/vaultwarden

docker exec -it vaultwarden /vaultwarden --version

tar -czf vw-data-backup-$(date +%F).tgz vw-data

docker compose pull
docker compose up -d

docker logs -n 50 vaultwarden
docker exec -it vaultwarden /vaultwarden --version
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;10）常见故障：升级后突然打不开（ERR_TIMED_OUT / 只看到 SYN 没有 SYN-ACK）&lt;/h2&gt;
&lt;p&gt;这一类问题&lt;strong&gt;非常像应用挂了&lt;/strong&gt;，但实际上经常是「云厂商的安全 sysctl 配置 + Docker 端口转发」组合导致的网络层问题。&lt;/p&gt;
&lt;p&gt;典型症状：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器访问 &lt;code&gt;https://pass.example.com&lt;/code&gt; 直接 &lt;strong&gt;ERR_TIMED_OUT&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;服务器本机 &lt;code&gt;curl -I https://127.0.0.1 -H &amp;#39;Host: pass.example.com&amp;#39;&lt;/code&gt; 能返回 200（说明 nginx/Vaultwarden 正常）&lt;/li&gt;
&lt;li&gt;抓包只看到外网 &lt;code&gt;SYN&lt;/code&gt; 进来，但服务器没有回 &lt;code&gt;SYN-ACK&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10.1 快速定位思路（建议按顺序走）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;确认容器与端口监听&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps
ss -lntp | egrep &amp;#39;:80|:443&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;确认本机（内网 IP）443 正常&lt;/strong&gt;（以云主机网卡 IP 为例）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -kIv https://10.0.0.2 --connect-timeout 3
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;确认 DNAT 是否在工作&lt;/strong&gt;（外网访问一次后看计数器是否增长）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;nft list chain ip nat DOCKER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果 &lt;code&gt;tcp dport 443 ... dnat to 172.xx.xx.xx:443&lt;/code&gt; 的 &lt;code&gt;counter packets&lt;/code&gt; 会增长，说明外网请求已到达并进入 DNAT。&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;strong&gt;抓包判断是否回 SYN-ACK&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tcpdump -ni &amp;lt;nic&amp;gt; &amp;#39;tcp port 443 and (tcp[tcpflags] &amp;amp; (tcp-syn|tcp-ack) != 0)&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有 &lt;code&gt;SYN&lt;/code&gt; 没有 &lt;code&gt;SYN-ACK&lt;/code&gt;，基本就是系统层转发/过滤问题。&lt;/p&gt;
&lt;h3&gt;10.2 云主机常见根因：&lt;code&gt;ip_forward=0&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;不少云镜像会通过安全策略把 IPv4 转发关掉（例如存在类似 &lt;code&gt;60-*-network-security.conf&lt;/code&gt; 的 sysctl 文件），而 Docker 的端口转发/桥接依赖它。&lt;/p&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sysctl net.ipv4.ip_forward
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出是 &lt;code&gt;net.ipv4.ip_forward = 0&lt;/code&gt;，就会出现「DNAT 计数器涨，但流量进不了容器网桥」的情况，外网访问自然超时。&lt;/p&gt;
&lt;p&gt;临时修复（立刻生效，无需重启）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sysctl -w net.ipv4.ip_forward=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果系统没有 &lt;code&gt;/proc/sys/net/bridge/*&lt;/code&gt; 相关项，说明 &lt;code&gt;br_netfilter&lt;/code&gt; 未加载；可按需加载并启用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;modprobe br_netfilter
sysctl -w net.bridge.bridge-nf-call-iptables=1
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;永久化（推荐）&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat &amp;gt;/etc/sysctl.d/99-docker-forwarding.conf &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
EOF

sysctl --system
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以及让模块开机自动加载：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat &amp;gt;/etc/modules-load.d/br_netfilter.conf &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
br_netfilter
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：以上为公开教程示例。实际环境请结合你的安全策略评估是否需要同时启用 &lt;code&gt;bridge-nf-call-ip6tables&lt;/code&gt; 等选项。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;Vaultwarden 的 Docker 升级并不复杂，关键在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;升级前后都要 &lt;strong&gt;核对版本&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;数据卷要 &lt;strong&gt;可备份&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;对外发布文档要 &lt;strong&gt;打码&lt;/strong&gt;（域名/主机名/目录/Token 全部不要出现）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你希望更可控的升级策略（避免 &lt;code&gt;latest&lt;/code&gt; 带来不可预期变更），建议把镜像 tag 固定为明确版本号，并在测试环境验证后再滚动到生产。&lt;/p&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>SSH 连不上服务器时，几种中转方案的实战总结</title><link>https://www.bcd.moe/blog/ssh-relay-methods-summary</link><guid isPermaLink="true">https://www.bcd.moe/blog/ssh-relay-methods-summary</guid><description>总结灰云直连、Cloudflare Tunnel、SSH 跳板机与 Tailscale/WireGuard 几种常见 SSH 中转方案，结合一次本地网络受限的真实排障过程，帮助快速判断该选哪条路径。</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很多人都会遇到这种情况：服务器在线，SSH 服务看起来也正常，但本地网络就是连不上，直接 SSH 不是超时就是卡住。&lt;/p&gt;
&lt;p&gt;这次我碰到的就是一个很典型的场景：&lt;strong&gt;本地网络无法直接连接目标服务器，但通过另一台日本服务器做 SSH 跳板后成功连通&lt;/strong&gt;。顺着这次排障过程，我把几种常见的中转方案也一起梳理了一遍。&lt;/p&gt;
&lt;h2&gt;一、先说结论：问题往往不在“域名”，而在“连接路径”&lt;/h2&gt;
&lt;p&gt;很多人的第一反应是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我有 Cloudflare 域名，直接把 A 记录解析到服务器，再开代理，是不是就能 SSH 了？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;答案是：&lt;strong&gt;不行，不能直接靠普通橙云代理原生 SSH。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cloudflare 普通代理主要面向的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP&lt;/li&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;WebSocket&lt;/li&gt;
&lt;li&gt;一些 Web 协议相关流量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而 &lt;strong&gt;原生 SSH 并不是普通 Cloudflare 橙云直接代理的对象&lt;/strong&gt;。也就是说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;网站开橙云没问题&lt;/li&gt;
&lt;li&gt;SSH 不能指望开个代理就直接打通&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，很多时候问题不在“域名配没配对”，而在“你现在选的连接路径本身就不适合 SSH”。&lt;/p&gt;
&lt;h2&gt;二、方案 1：灰云直连（仅 DNS）&lt;/h2&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;你怀疑是 Cloudflare 橙云影响了直连&lt;/li&gt;
&lt;li&gt;你的本地网络本身并没有屏蔽服务器&lt;/li&gt;
&lt;li&gt;你只是想让域名直接解析到服务器 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;做法&lt;/h3&gt;
&lt;p&gt;把 Cloudflare 上对应记录从：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;已代理（橙云）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;改成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;仅 DNS（灰云）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后直接测试：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh root@your-domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本质上等价于：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh root@服务器IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;简单&lt;/li&gt;
&lt;li&gt;适合快速排查&lt;/li&gt;
&lt;li&gt;不需要额外安装工具&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不解决“本地网络屏蔽服务器”的问题&lt;/li&gt;
&lt;li&gt;22 端口仍然暴露公网&lt;/li&gt;
&lt;li&gt;安全性一般&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;结论&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;灰云只能解决“别让 Cloudflare 橙云挡住 SSH”这个问题，不能解决网络本身不通的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;三、方案 2：Cloudflare Tunnel 中转 SSH&lt;/h2&gt;
&lt;p&gt;这是更正规的做法。&lt;/p&gt;
&lt;h3&gt;原理&lt;/h3&gt;
&lt;p&gt;目标链路会变成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;本地 SSH -&amp;gt; cloudflared -&amp;gt; Cloudflare -&amp;gt; Tunnel -&amp;gt; 服务器 localhost:22
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器主动连接 Cloudflare&lt;/li&gt;
&lt;li&gt;本地通过 &lt;code&gt;cloudflared&lt;/code&gt; 接入&lt;/li&gt;
&lt;li&gt;不需要在公网暴露 22 端口&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本地网络不能直连目标服务器&lt;/li&gt;
&lt;li&gt;服务器本身可以正常出网&lt;/li&gt;
&lt;li&gt;你已经有 Cloudflare 域名&lt;/li&gt;
&lt;li&gt;想要长期、安全、规范的方案&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不必公网暴露 SSH 端口&lt;/li&gt;
&lt;li&gt;比直开 22 更安全&lt;/li&gt;
&lt;li&gt;可以结合 Cloudflare Access 做身份控制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;配置比灰云复杂&lt;/li&gt;
&lt;li&gt;服务器端和本地都要安装 &lt;code&gt;cloudflared&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;适合谁&lt;/h3&gt;
&lt;p&gt;如果你有 Cloudflare 域名，又希望把 SSH 接入做得更优雅一些，&lt;strong&gt;Cloudflare Tunnel 值得长期使用&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;四、方案 3：SSH 跳板机 / Bastion Host&lt;/h2&gt;
&lt;p&gt;这是这次实际排障里&lt;strong&gt;真正跑通&lt;/strong&gt;的方案。&lt;/p&gt;
&lt;h3&gt;原理&lt;/h3&gt;
&lt;p&gt;你的本地不能直接到目标服务器，那就先连另一台能访问的机器，再从那台机器跳过去：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;本地 -&amp;gt; 跳板机 -&amp;gt; 目标服务器
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地不能直连目标服务器&lt;/li&gt;
&lt;li&gt;但能连上另一台日本服务器&lt;/li&gt;
&lt;li&gt;日本服务器又能访问目标服务器的 22 端口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时就可以把日本服务器当作跳板机。&lt;/p&gt;
&lt;h3&gt;命令行写法&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -J user@跳板机IP root@目标服务器IP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -J root@jump-server-ip root@target-server-ip
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;图形客户端&lt;/h3&gt;
&lt;p&gt;很多 SSH 客户端都直接支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jump Host&lt;/li&gt;
&lt;li&gt;ProxyJump&lt;/li&gt;
&lt;li&gt;SSH Tunnel&lt;/li&gt;
&lt;li&gt;Bastion Host&lt;/li&gt;
&lt;li&gt;跳板机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要在目标连接里指定一台代理主机即可。&lt;/p&gt;
&lt;h3&gt;这次实测结果&lt;/h3&gt;
&lt;p&gt;通过图形 SSH 客户端把日本服务器设为跳板后，最终成功登录到目标机。验证方式包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登录来源显示为跳板机 IP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hostname&lt;/code&gt; 显示为目标服务器主机名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl ifconfig.me&lt;/code&gt; 与目标服务器公网出口对应&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就能确认：当前会话已经不在跳板机上，而是成功落到了目标服务器。&lt;/p&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;非常实用&lt;/li&gt;
&lt;li&gt;配置简单&lt;/li&gt;
&lt;li&gt;网络受限场景往往立刻见效&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需要额外一台服务器&lt;/li&gt;
&lt;li&gt;跳板机本身也要维护安全&lt;/li&gt;
&lt;li&gt;公共、陌生、免费跳板机不适合作为长期正式方案&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;结论&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;如果你手里刚好有另一台可用服务器，SSH 跳板机通常是恢复连接最快的方案。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;五、方案 4：Tailscale / WireGuard&lt;/h2&gt;
&lt;p&gt;如果你的目标不是“用域名优雅接入”，而是“先稳定连上”，那么 Tailscale 或 WireGuard 也非常值得考虑。&lt;/p&gt;
&lt;h3&gt;原理&lt;/h3&gt;
&lt;p&gt;本地和服务器都加入同一个虚拟网络：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;本地 &amp;lt;-&amp;gt; Tailscale / WireGuard &amp;lt;-&amp;gt; 服务器
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后通过分配到的内网地址 SSH。&lt;/p&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对 NAT、复杂网络环境友好&lt;/li&gt;
&lt;li&gt;不一定需要暴露 22 端口&lt;/li&gt;
&lt;li&gt;多台机器统一管理时很方便&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需要额外安装客户端&lt;/li&gt;
&lt;li&gt;对部分只想临时排障的人来说，理解成本略高&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;结论&lt;/h3&gt;
&lt;p&gt;如果你管理的不止一台服务器，&lt;strong&gt;Tailscale/WireGuard 更像是一种长期网络方案，而不是一次性的补丁。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;六、这次排障中最容易踩的误区&lt;/h2&gt;
&lt;h3&gt;误区 1：以为开橙云就等于可以代理 SSH&lt;/h3&gt;
&lt;p&gt;不是。&lt;strong&gt;普通 Cloudflare 橙云适合网站，不适合直接代理原生 SSH。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果想通过 Cloudflare 做 SSH 中转，应该用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare Tunnel&lt;/li&gt;
&lt;li&gt;Cloudflare Access / Zero Trust&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而不是只改 DNS 开关。&lt;/p&gt;
&lt;h3&gt;误区 2：以为改灰云就一定能连上&lt;/h3&gt;
&lt;p&gt;灰云只是“直接解析到服务器 IP”，它不负责解决：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地网络封锁&lt;/li&gt;
&lt;li&gt;运营商限制&lt;/li&gt;
&lt;li&gt;服务器 22 端口未开放&lt;/li&gt;
&lt;li&gt;云厂商安全组拦截&lt;/li&gt;
&lt;li&gt;服务器防火墙限制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以灰云只是排查步骤，不是万能修复。&lt;/p&gt;
&lt;h3&gt;误区 3：只盯着目标服务器，不看连接路径&lt;/h3&gt;
&lt;p&gt;这次最关键的发现就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标服务器并不是彻底不可达&lt;/li&gt;
&lt;li&gt;真正不通的是“本地到目标服务器这条路径”&lt;/li&gt;
&lt;li&gt;一旦换成“本地 -&amp;gt; 跳板机 -&amp;gt; 目标服务器”，整个链路立刻恢复&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多 SSH 故障，问题并不在服务器本身，而在“你怎么到达它”。&lt;/p&gt;
&lt;h2&gt;七、怎么选：不同场景下的建议&lt;/h2&gt;
&lt;h3&gt;1. 只是临时排查&lt;/h3&gt;
&lt;p&gt;先试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把 Cloudflare 记录改成&lt;strong&gt;仅 DNS（灰云）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;直接 SSH 测试&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适合快速确认问题是否来自 Cloudflare 代理。&lt;/p&gt;
&lt;h3&gt;2. 本地网络受限，但你有另一台服务器&lt;/h3&gt;
&lt;p&gt;直接上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SSH 跳板机&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是恢复连接最快的实战方案。&lt;/p&gt;
&lt;h3&gt;3. 你有 Cloudflare 域名，想长期正规使用&lt;/h3&gt;
&lt;p&gt;直接考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;长期看，它比直开 22 更优雅，也更安全。&lt;/p&gt;
&lt;h3&gt;4. 你管理多台服务器，希望网络统一&lt;/h3&gt;
&lt;p&gt;考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tailscale&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WireGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适合长期多机互联。&lt;/p&gt;
&lt;h2&gt;八、安全提醒：不要长期使用 root + 密码&lt;/h2&gt;
&lt;p&gt;排查 SSH 时，很多人为了快，会直接用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码登录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这虽然方便，但风险非常高，尤其在需要截图、远程协助、多次调试跳板机的场景里，密码很容易在不经意间暴露。&lt;/p&gt;
&lt;p&gt;更推荐的做法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;尽快改成 &lt;strong&gt;SSH key 登录&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;验证密钥可用后关闭密码登录&lt;/li&gt;
&lt;li&gt;跳板机也要单独做安全加固&lt;/li&gt;
&lt;li&gt;避免长期直接使用 &lt;code&gt;root + 密码&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;九、最后总结&lt;/h2&gt;
&lt;p&gt;这次排障最重要的结论其实很简单：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当 SSH 连不上时，先别急着怀疑服务器坏了，先判断是不是“连接路径”出了问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从这次实战来看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare 橙云不适合直接代理原生 SSH&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灰云只是直连解析，不解决网络封锁&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Tunnel 适合长期正规中转&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSH 跳板机是最快恢复连接的实战方案&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailscale/WireGuard 更适合长期多机互联&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而这次最终真正跑通的方案，是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;通过一台日本服务器作为 SSH 跳板机，成功连接到目标服务器。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这再次说明：&lt;strong&gt;有时候问题不在目标机，而在你怎么到达它。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;十、附：几条实用命令&lt;/h2&gt;
&lt;h3&gt;灰云直连测试&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh root@your-domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;跳板机连接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -J root@jump-server-ip root@target-server-ip
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cloudflare Tunnel 方式连接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -o ProxyCommand=&amp;quot;cloudflared access ssh --hostname ssh.example.com&amp;quot; root@ssh.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;登录后确认当前机器&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
curl ifconfig.me
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>OpenClaw 怎么安装和更新？curl脚本、npm、Docker 全对比</title><link>https://www.bcd.moe/blog/openclaw-install-methods-and-update-guide</link><guid isPermaLink="true">https://www.bcd.moe/blog/openclaw-install-methods-and-update-guide</guid><description>一文讲清 OpenClaw 的 4 种安装方式：官方脚本、npm 全局、源码、容器；并给出对应更新、回滚与排障策略。</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OpenClaw 的安装方式不止一种。选错方式，后续更新和排障会越来越痛；选对方式，升级、回滚、自动化都很顺。&lt;/p&gt;
&lt;p&gt;这篇文章按实战角度对比四类方式：&lt;strong&gt;官方脚本安装、npm 全局安装、源码运行、容器部署&lt;/strong&gt;，并补上对应的&lt;strong&gt;更新与回滚方法&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;1) 官方脚本安装（推荐新手与快速上线）&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL --proto &amp;#39;=https&amp;#39; --tlsv1.2 https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;--proto &amp;#39;=https&amp;#39;&lt;/code&gt; 与 &lt;code&gt;--tlsv1.2&lt;/code&gt; 用于强制安全链路下载，建议保留。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;更新&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw gateway stop
curl -fsSL --proto &amp;#39;=https&amp;#39; --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw gateway start
openclaw --version
openclaw status
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;追求最快上手&lt;/li&gt;
&lt;li&gt;不想折腾 Node 包管理细节&lt;/li&gt;
&lt;li&gt;单机部署与维护&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;优点：简单、快、官方路径清晰&lt;/li&gt;
&lt;li&gt;缺点：脚本入口可变，生产建议先在测试机验证&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;2) npm 全局安装（适合 Node 生态用户）&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install -g openclaw
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更新&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw gateway stop
npm install -g openclaw@latest
openclaw gateway start
openclaw --version
openclaw status
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;已有 Node/NPM 运维体系&lt;/li&gt;
&lt;li&gt;希望纳入 CI/CD 脚本&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;优点：版本控制直观（&lt;code&gt;@latest&lt;/code&gt; 或指定版本）&lt;/li&gt;
&lt;li&gt;缺点：需要关注全局路径，避免多份安装混淆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议排查命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;which openclaw
readlink -f &amp;quot;$(which openclaw)&amp;quot;
npm ls -g --depth=0 | grep -i openclaw
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;3) 源码运行（适合二次开发与调试）&lt;/h2&gt;
&lt;h3&gt;安装（示意）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/openclaw/openclaw.git
cd openclaw
npm install
npm run build
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更新&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git pull
npm install
npm run build
# 然后重启对应服务进程
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需要改源码、打补丁&lt;/li&gt;
&lt;li&gt;想深度调试内部行为&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;优点：自由度最高&lt;/li&gt;
&lt;li&gt;缺点：运维复杂度最高，需自行承担依赖兼容风险&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;4) 容器部署（适合团队与标准化运维）&lt;/h2&gt;
&lt;h3&gt;安装/运行（示意）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -d --name openclaw ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;更新&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker pull &amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt;
docker stop openclaw &amp;amp;&amp;amp; docker rm openclaw
docker run -d --name openclaw &amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;多环境一致性要求高&lt;/li&gt;
&lt;li&gt;需要可回滚、可审计、自动化发布&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;优缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;优点：环境一致、回滚方便&lt;/li&gt;
&lt;li&gt;缺点：要处理卷挂载、配置注入、日志采集、健康检查&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;如何选型？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;个人用户/首次上手&lt;/strong&gt;：官方脚本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node 运维体系&lt;/strong&gt;：npm 全局&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发调试/二开&lt;/strong&gt;：源码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队生产环境&lt;/strong&gt;：容器&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;通用更新与验收流程（推荐）&lt;/h2&gt;
&lt;p&gt;无论哪种安装方式，都建议遵循：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;升级前停止网关服务&lt;/li&gt;
&lt;li&gt;按“原安装通道”升级（脚本装就脚本升，npm 装就 npm 升）&lt;/li&gt;
&lt;li&gt;升级后立即验收&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw --version
openclaw gateway status
openclaw status
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;回滚思路&lt;/h2&gt;
&lt;h3&gt;脚本 / npm 安装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;升级前备份当前安装目录（或保留上一个可用版本）&lt;/li&gt;
&lt;li&gt;若升级异常，回滚到旧版本再重启服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;容器安装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;直接切回旧镜像 tag 并重启容器&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;Q1：更新后版本没变？&lt;/h3&gt;
&lt;p&gt;可能是已经最新，或执行的是另一套安装路径。先检查二进制指向：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;which openclaw
readlink -f &amp;quot;$(which openclaw)&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Q2：脚本安装为什么也可能看到 npm 行为？&lt;/h3&gt;
&lt;p&gt;很多安装脚本底层也会调用包管理器完成安装，这是实现细节。运维上仍建议“同路径安装同路径更新”，避免路径混乱。&lt;/p&gt;
&lt;h3&gt;Q3：安全告警如何处理？&lt;/h3&gt;
&lt;p&gt;若凭据目录权限过宽（例如 777），应立即收紧：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod 700 /root/.openclaw/credentials
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;没有“唯一正确”的安装方式，只有“最适合当前阶段”的方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重稳定：脚本或容器&lt;/li&gt;
&lt;li&gt;重可控：npm 或源码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键不在“怎么装”，而在于你是否有清晰的&lt;strong&gt;更新、验收、回滚&lt;/strong&gt;流程。&lt;/p&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>在 OpenClaw 服务器上安装并使用 Playwright + Chromium（含 Xvfb）</title><link>https://www.bcd.moe/blog/openclaw-playwright-chromium</link><guid isPermaLink="true">https://www.bcd.moe/blog/openclaw-playwright-chromium</guid><description>在无桌面 Linux 服务器上部署 Playwright + Chromium，用于访问、点击、输入与截图，并总结与 OpenClaw 的集成方式与常见坑。</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;想在服务器上让 OpenClaw 具备“能打开网页、点击、输入、截图”的能力，最稳的路径通常是：&lt;strong&gt;Playwright + Chromium + Xvfb&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这篇文章记录一套在无桌面 Linux 服务器上可复用的安装与使用流程，并顺带说明在 OpenClaw 里怎么把它用起来。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：部分网站（尤其是 Google / Cloudflare 的高级验证）对自动化访问非常敏感，可能仍需要人工或更高级的网络/代理方案。本文重点是「让环境跑通」与「可稳定截图/交互」。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. 安装 Playwright&lt;/h2&gt;
&lt;p&gt;确认 Node.js 环境可用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node -v
npm -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 Playwright（推荐安装到工作区，避免全局包路径差异）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /root/.openclaw/workspace
npm install playwright
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你更偏好全局安装（便于快速试验 CLI），也可以：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install -g playwright
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 安装 Chromium&lt;/h2&gt;
&lt;p&gt;下载 Playwright 管理的 Chromium：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx playwright install chromium
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Playwright 会把浏览器放到类似 &lt;code&gt;~/.cache/ms-playwright/&lt;/code&gt; 的目录下。&lt;/p&gt;
&lt;h2&gt;3. 安装系统依赖（关键）&lt;/h2&gt;
&lt;p&gt;无桌面服务器上，Chromium 需要一堆运行库（字体、X11/GL/GTK 相关等）。直接安装 Playwright 的依赖集合最省事：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx playwright install-deps chromium
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步通常会安装 &lt;code&gt;xvfb&lt;/code&gt; 以及各类字体与图形库依赖。&lt;/p&gt;
&lt;h2&gt;4. 用 Xvfb 运行（无桌面环境推荐做法）&lt;/h2&gt;
&lt;p&gt;即便你使用 &lt;code&gt;headless: true&lt;/code&gt;，在某些环境/网站场景里也会遇到 “Missing X server or $DISPLAY”。&lt;/p&gt;
&lt;p&gt;统一用 &lt;code&gt;xvfb-run&lt;/code&gt; 包一层，是最稳的无桌面运行方式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;xvfb-run -a node your-script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-a&lt;/code&gt; 会自动选择可用的 DISPLAY，避免冲突。&lt;/p&gt;
&lt;h2&gt;5. 最小可用脚本：访问网页并截图&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;/root/.openclaw/workspace&lt;/code&gt; 新建 &lt;code&gt;pw-shot.js&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const { chromium } = require(&amp;#39;playwright&amp;#39;);

(async () =&amp;gt; {
  const browser = await chromium.launch({
    headless: true,
    // 服务器上常见建议参数
    args: [&amp;#39;--no-sandbox&amp;#39;, &amp;#39;--disable-dev-shm-usage&amp;#39;],
  });

  const page = await browser.newPage();
  await page.goto(&amp;#39;https://example.com&amp;#39;, {
    waitUntil: &amp;#39;domcontentloaded&amp;#39;,
    timeout: 30000,
  });

  await page.waitForTimeout(1500);
  await page.screenshot({ path: &amp;#39;example.png&amp;#39;, fullPage: false });
  console.log(&amp;#39;saved example.png&amp;#39;);

  await browser.close();
})().catch((e) =&amp;gt; {
  console.error(e);
  process.exit(1);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /root/.openclaw/workspace
xvfb-run -a node pw-shot.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. 点击/输入：UI 框架页面的常见坑&lt;/h2&gt;
&lt;p&gt;很多站点使用 UI 框架（例如 Semi Design / Ant Design）封装了复选框、按钮，导致：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元素看起来可点，但点击会被某个 &lt;code&gt;span/div&lt;/code&gt; 拦截&lt;/li&gt;
&lt;li&gt;&lt;code&gt;click()&lt;/code&gt; 超时，日志里出现 “intercepts pointer events”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用应对策略：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;点击真正可点击的可视层&lt;/strong&gt;（比如 &lt;code&gt;.semi-checkbox-inner-display&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;必要时 &lt;code&gt;click({ force: true })&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;locator()&lt;/code&gt; 结合 &lt;code&gt;:has-text()&lt;/code&gt; 精准定位按钮&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 输入
await page.locator(&amp;#39;input&amp;#39;).nth(0).fill(&amp;#39;HY&amp;#39;);
await page.locator(&amp;#39;input&amp;#39;).nth(1).fill(&amp;#39;2484913990&amp;#39;);

// 勾选（点可见层 + force）
await page.locator(&amp;#39;.semi-checkbox-inner-display&amp;#39;).click({ force: true });

// 点击登录
await page.locator(&amp;#39;button:has-text(&amp;quot;登录&amp;quot;), button[type=&amp;quot;submit&amp;quot;]&amp;#39;).first().click();
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;7. 在 OpenClaw 里怎么“用起来”&lt;/h2&gt;
&lt;p&gt;如果你不想依赖本地电脑（Chrome 扩展 relay），最直接的做法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把 Playwright 脚本放在 &lt;code&gt;/root/.openclaw/workspace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;让 OpenClaw 通过 &lt;code&gt;exec&lt;/code&gt; 运行 &lt;code&gt;xvfb-run -a node xxx.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输出截图/日志到 workspace，然后由 OpenClaw 转发到 Telegram&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /root/.openclaw/workspace
xvfb-run -a node pw-shot.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就能在服务器端完成“访问 + 交互 + 截图”的闭环。&lt;/p&gt;
&lt;h2&gt;8. 结语&lt;/h2&gt;
&lt;p&gt;Playwright + Chromium + Xvfb 是服务器端自动化的一条通用路线：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能稳定跑在无桌面环境&lt;/li&gt;
&lt;li&gt;适合做截图、表单填写、点击跳转、简单抓取&lt;/li&gt;
&lt;li&gt;面对强风控验证码时需要额外策略，但不影响大多数日常自动化需求&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>从开发到分享：Docker + GitHub 完整部署指南（以 Domain Checker 为例）</title><link>https://www.bcd.moe/blog/docker-hub-github-deployment-guide</link><guid isPermaLink="true">https://www.bcd.moe/blog/docker-hub-github-deployment-guide</guid><description>详细讲解如何开发一个 Docker 应用，推送到 Docker Hub，上传到 GitHub，以及别人如何快速使用你的项目。包含完整的代码示例和最佳实践。</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;你开发了一个很棒的应用，现在想让别人也能用。但怎么分享呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接给代码？别人还要自己配置环境、安装依赖&lt;/li&gt;
&lt;li&gt;打包成可执行文件？跨平台兼容性差&lt;/li&gt;
&lt;li&gt;上传到 Docker Hub？别人一条命令就能用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这篇文章就是教你怎么做最后一种——用 Docker + GitHub 让你的应用可以被全世界使用。&lt;/p&gt;
&lt;p&gt;我们以 &lt;strong&gt;Domain Checker&lt;/strong&gt;（批量域名查询工具）为例，从零开始讲解整个流程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;第一部分：准备工作&lt;/h2&gt;
&lt;h3&gt;你需要什么&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; — 已安装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Hub 账户&lt;/strong&gt; — 免费注册：&lt;a href=&quot;https://hub.docker.com&quot;&gt;https://hub.docker.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub 账户&lt;/strong&gt; — 免费注册：&lt;a href=&quot;https://github.com&quot;&gt;https://github.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt; — 已安装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个可以工作的应用&lt;/strong&gt; — 我们用 Domain Checker 作例子&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;项目结构&lt;/h3&gt;
&lt;p&gt;一个标准的可分享项目应该是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;domain-checker/
├── docker-compose.yml      # Docker Compose 配置
├── .env.example            # 环境变量模板（给别人参考）
├── .env                    # 真实环境变量（本地用，不上传）
├── .gitignore              # Git 忽略规则
├── README.md               # 项目说明
├── Dockerfile              # Docker 镜像定义
├── requirements.txt        # Python 依赖
└── main.py                 # 应用代码
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第二部分：本地开发与测试&lt;/h2&gt;
&lt;h3&gt;1. 创建项目目录&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir domain-checker
cd domain-checker
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 编写应用代码&lt;/h3&gt;
&lt;p&gt;创建 &lt;code&gt;main.py&lt;/code&gt;（这里用一个简单的 FastAPI 应用作例子）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from fastapi import FastAPI
import os

app = FastAPI(title=&amp;quot;Domain Checker&amp;quot;)

FASTLY_TOKEN = os.getenv(&amp;quot;FASTLY_TOKEN&amp;quot;, &amp;quot;&amp;quot;)
MAX_CONCURRENCY = int(os.getenv(&amp;quot;MAX_CONCURRENCY&amp;quot;, &amp;quot;5&amp;quot;))

@app.get(&amp;quot;/&amp;quot;)
async def index():
    return {
        &amp;quot;message&amp;quot;: &amp;quot;Domain Checker API&amp;quot;,
        &amp;quot;token_configured&amp;quot;: bool(FASTLY_TOKEN),
        &amp;quot;max_concurrency&amp;quot;: MAX_CONCURRENCY
    }

@app.get(&amp;quot;/health&amp;quot;)
async def health():
    return {&amp;quot;status&amp;quot;: &amp;quot;ok&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 创建 &lt;code&gt;requirements.txt&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;fastapi==0.104.1
uvicorn==0.24.0
httpx==0.25.2
pytz==2024.1
python-multipart==0.0.6
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 创建 &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

WORKDIR /app

RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends ca-certificates &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000
CMD [&amp;quot;uvicorn&amp;quot;, &amp;quot;main:app&amp;quot;, &amp;quot;--host&amp;quot;, &amp;quot;0.0.0.0&amp;quot;, &amp;quot;--port&amp;quot;, &amp;quot;8000&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 创建 &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;version: &amp;#39;3.8&amp;#39;
services:
  domain-checker:
    image: myhywo/domain-checker:latest
    container_name: domain-checker
    restart: unless-stopped
    ports:
      - &amp;quot;22332:8000&amp;quot;
    volumes:
      - ./data:/app/data
      - ./wordlists:/app/wordlists
    environment:
      - MAX_CONCURRENCY=5
      - HTTP_TIMEOUT_SECONDS=10
      - CACHE_TTL_SECONDS=86400
      - FASTLY_TOKEN=your_fastly_api_token_here
      - FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status
      - RESET_DAY=18
      - RESET_TIMEZONE=Asia/Shanghai
networks:
  default:
    name: domain-checker-net
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6. 创建 &lt;code&gt;.env.example&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;这个文件告诉别人需要配置什么环境变量：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-env&quot;&gt;# Fastly API Configuration
FASTLY_TOKEN=your_fastly_api_token_here
FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status

# Application Settings
MAX_CONCURRENCY=5
HTTP_TIMEOUT_SECONDS=10
CACHE_TTL_SECONDS=86400

# Reset Configuration
RESET_DAY=18
RESET_TIMEZONE=Asia/Shanghai
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7. 创建 &lt;code&gt;.env&lt;/code&gt;（本地用）&lt;/h3&gt;
&lt;p&gt;这个文件放你的真实配置，&lt;strong&gt;不要上传到 GitHub&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-env&quot;&gt;FASTLY_TOKEN=your_real_token_here
FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status
MAX_CONCURRENCY=5
HTTP_TIMEOUT_SECONDS=10
CACHE_TTL_SECONDS=86400
RESET_DAY=18
RESET_TIMEZONE=Asia/Shanghai
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8. 创建 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;.env
.env.local
*.log
app/__pycache__/
app/*.pyc
data/
.DS_Store
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9. 本地测试&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 构建镜像
docker compose build

# 启动容器
docker compose up -d

# 测试应用
curl http://localhost:22332/

# 查看日志
docker compose logs -f

# 停止容器
docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第三部分：推送到 Docker Hub&lt;/h2&gt;
&lt;h3&gt;1. 登录 Docker Hub&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入你的 Docker Hub 用户名和密码。&lt;/p&gt;
&lt;h3&gt;2. 给镜像打 tag&lt;/h3&gt;
&lt;p&gt;假设你的 Docker Hub 用户名是 &lt;code&gt;myhywo&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker tag domain-checker-domain-checker myhywo/domain-checker:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 推送到 Docker Hub&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker push myhywo/domain-checker:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待上传完成。你可以在 &lt;a href=&quot;https://hub.docker.com/r/myhywo/domain-checker&quot;&gt;https://hub.docker.com/r/myhywo/domain-checker&lt;/a&gt; 看到你的镜像。&lt;/p&gt;
&lt;Warning&gt;
  **重要：** 推送前确保 `docker-compose.yml` 里的 `FASTLY_TOKEN` 是占位符（`your_fastly_api_token_here`），不是真实的 Token。真实的 Token 应该在本地的 `.env` 文件里。
&lt;/Warning&gt;

&lt;hr&gt;
&lt;h2&gt;第四部分：上传到 GitHub&lt;/h2&gt;
&lt;h3&gt;1. 在 GitHub 创建新仓库&lt;/h3&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://github.com/new%EF%BC%8C%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%96%B0%E4%BB%93%E5%BA%93%EF%BC%8C%E5%90%8D%E5%AD%97%E5%8F%AB&quot;&gt;https://github.com/new，创建一个新仓库，名字叫&lt;/a&gt; &lt;code&gt;domain-checker&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;2. 初始化本地 Git 仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd domain-checker
git init
git add .
git commit -m &amp;quot;Initial commit: domain-checker with docker-compose&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 添加远程仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin https://github.com/myhywo/domain-checker.git
git branch -M main
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入你的 GitHub 用户名和 Personal Access Token（或用 SSH 密钥）。&lt;/p&gt;
&lt;h3&gt;4. 提交并推送到 GitHub&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add README.md
git commit -m &amp;quot;Initial commit: domain-checker with docker-compose&amp;quot;
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第五部分：别人如何使用你的项目&lt;/h2&gt;
&lt;h3&gt;方式 1：从 GitHub Clone（推荐）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Clone 项目
git clone https://github.com/myhywo/domain-checker.git
cd domain-checker

# 复制环境变量模板
cp .env.example .env

# 编辑 .env，填入自己的 Fastly Token
nano .env

# 启动容器
docker compose up -d

# 访问应用
curl http://localhost:22332/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;方式 2：直接用 Docker 镜像（不需要 Clone）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -d \
  -p 22332:8000 \
  -e FASTLY_TOKEN=their_token_here \
  -e FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status \
  myhywo/domain-checker:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;方式 3：用 Docker Compose（不需要 Clone）&lt;/h3&gt;
&lt;p&gt;创建一个 &lt;code&gt;docker-compose.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  domain-checker:
    image: myhywo/domain-checker:latest
    container_name: domain-checker
    restart: unless-stopped
    ports:
      - &amp;quot;22332:8000&amp;quot;
    volumes:
      - ./app:/app
    environment:
      - MAX_CONCURRENCY=5
      - HTTP_TIMEOUT_SECONDS=10
      - CACHE_TTL_SECONDS=86400
      - FASTLY_TOKEN=their_token_here
      - FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status
      - RESET_DAY=18
      - RESET_TIMEZONE=Asia/Shanghai
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第六部分：最佳实践&lt;/h2&gt;
&lt;h3&gt;1. 版本管理&lt;/h3&gt;
&lt;p&gt;每次发布新版本时，给镜像打多个 tag：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 构建镜像
docker compose build

# 打 tag
docker tag domain-checker-domain-checker myhywo/domain-checker:latest
docker tag domain-checker-domain-checker myhywo/domain-checker:v1.0.0

# 推送
docker push myhywo/domain-checker:latest
docker push myhywo/domain-checker:v1.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;docker-compose.yml&lt;/code&gt; 里，别人可以选择用 &lt;code&gt;latest&lt;/code&gt; 或指定版本：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: myhywo/domain-checker:v1.0.0  # 指定版本
# 或
image: myhywo/domain-checker:latest  # 最新版本
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 敏感信息管理&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;永远不要在代码里硬编码 Token 或密钥。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;✅ 正确做法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;environment:
  - FASTLY_TOKEN=${FASTLY_TOKEN}  # 从 .env 读取
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;❌ 错误做法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;environment:
  - FASTLY_TOKEN=abc123xyz  # 硬编码，会泄露！
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 健康检查&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;docker-compose.yml&lt;/code&gt; 里配置健康检查，Docker 会自动监控应用状态：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;healthcheck:
  test: [&amp;quot;CMD&amp;quot;, &amp;quot;curl&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;http://localhost:8000/health&amp;quot;]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 日志管理&lt;/h3&gt;
&lt;p&gt;配置日志驱动，防止日志文件无限增长：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;logging:
  driver: &amp;quot;json-file&amp;quot;
  options:
    max-size: &amp;quot;10m&amp;quot;
    max-file: &amp;quot;3&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 资源限制&lt;/h3&gt;
&lt;p&gt;为容器设置 CPU 和内存限制，防止占用过多资源：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;deploy:
  resources:
    limits:
      cpus: &amp;#39;1&amp;#39;
      memory: 512M
    reservations:
      cpus: &amp;#39;0.5&amp;#39;
      memory: 256M
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6. 卷挂载&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码卷&lt;/strong&gt; — 用于开发时热重载：&lt;code&gt;./app:/app&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据卷&lt;/strong&gt; — 用于持久化数据：&lt;code&gt;./data:/app/data&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;volumes:
  - ./app:/app          # 代码（开发时热重载）
  - ./data:/app/data    # 数据（持久化）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第七部分：更新和维护&lt;/h2&gt;
&lt;h3&gt;更新代码后的流程&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 修改代码
nano main.py

# 2. 测试
docker compose restart
curl http://localhost:22332/

# 3. 重新构建镜像
docker compose build

# 4. 推送到 Docker Hub
docker tag domain-checker-domain-checker myhywo/domain-checker:latest
docker push myhywo/domain-checker:latest

# 5. 提交到 GitHub
git add .
git commit -m &amp;quot;Fix: improve performance&amp;quot;
git push

# 6. 创建 Release（可选）
# 在 GitHub 上创建一个新的 Release，标记版本号
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自动化推送（可选）&lt;/h3&gt;
&lt;p&gt;如果你想自动化这个流程，可以用 GitHub Actions：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/docker-push.yml
name: Build and Push Docker Image

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: myhywo/domain-checker:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;h3&gt;Q: 别人用我的镜像时，需要修改代码吗？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 不需要。所有配置都通过环境变量传入，别人只需要修改 &lt;code&gt;.env&lt;/code&gt; 文件或 &lt;code&gt;docker-compose.yml&lt;/code&gt; 里的环境变量即可。&lt;/p&gt;
&lt;h3&gt;Q: 我的 Token 会泄露吗？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 不会。只要你：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;docker-compose.yml&lt;/code&gt; 里用占位符&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;.env&lt;/code&gt; 里放真实 Token&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;.gitignore&lt;/code&gt; 里排除 &lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;就不会泄露。&lt;/p&gt;
&lt;h3&gt;Q: 别人能看到我的 Token 吗？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 不能。Token 只存在于别人的本地 &lt;code&gt;.env&lt;/code&gt; 文件里，不会上传到 GitHub 或 Docker Hub。&lt;/p&gt;
&lt;h3&gt;Q: 如何回滚到旧版本？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 在 &lt;code&gt;docker-compose.yml&lt;/code&gt; 里改镜像标签：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: myhywo/domain-checker:v1.0.0  # 改成旧版本
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后重启：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose down
docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Q: 如何在多台服务器上部署？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 在每台服务器上都运行同样的命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/myhywo/domain-checker.git
cd domain-checker
cp .env.example .env
# 编辑 .env
docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;步骤&lt;/th&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. 本地开发&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在本地测试应用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. 推送到 Docker Hub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker push myhywo/domain-checker:latest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;上传镜像&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. 上传到 GitHub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;上传代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. 别人使用&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一条命令启动&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;现在你的应用已经可以被全世界使用了。每次更新代码时，只需要重复步骤 1-3 即可。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker 官方文档：&lt;/strong&gt; &lt;a href=&quot;https://docs.docker.com/&quot;&gt;https://docs.docker.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Hub：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/&quot;&gt;https://hub.docker.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub：&lt;/strong&gt; &lt;a href=&quot;https://github.com/&quot;&gt;https://github.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose：&lt;/strong&gt; &lt;a href=&quot;https://docs.docker.com/compose/&quot;&gt;https://docs.docker.com/compose/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最佳实践：&lt;/strong&gt; &lt;a href=&quot;https://docs.docker.com/develop/dev-best-practices/&quot;&gt;https://docs.docker.com/develop/dev-best-practices/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>纯 IPv6 服务器获得 IPv4 出站能力：NAT64 DNS + Cloudflare WARP 完整指南</title><link>https://www.bcd.moe/blog/ipv6-warp-nat64-tutorial</link><guid isPermaLink="true">https://www.bcd.moe/blog/ipv6-warp-nat64-tutorial</guid><description>为纯 IPv6 服务器配置 IPv4 出站能力的实战教程。先用 NAT64 DNS 临时应急，再用 Cloudflare WARP 获得长期稳定的解决方案。</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;问题：纯 IPv6 服务器的困境&lt;/h2&gt;
&lt;p&gt;你有一台纯 IPv6 服务器，但现实很残酷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub、PyPI、Docker Hub 等主要服务还是 IPv4&lt;/li&gt;
&lt;li&gt;无法下载软件包、安装脚本&lt;/li&gt;
&lt;li&gt;即使有 IPv6 DNS，也解析不了 IPv4 资源&lt;/li&gt;
&lt;li&gt;一切都卡在&amp;quot;网络不可达&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这篇文章就是为了解决这个问题。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;解决方案：两步走&lt;/h2&gt;
&lt;h3&gt;第一步：NAT64 DNS（临时应急）&lt;/h3&gt;
&lt;p&gt;用公益 NAT64 服务器临时获得 IPv4 访问能力，这样你就能下载 wgcf。&lt;/p&gt;
&lt;h3&gt;第二步：Cloudflare WARP（长期方案）&lt;/h3&gt;
&lt;p&gt;配置 WARP 获得稳定的 IPv4 出站，然后停用 NAT64。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;第一步：配置 NAT64 DNS&lt;/h2&gt;
&lt;h3&gt;什么是 NAT64？&lt;/h3&gt;
&lt;p&gt;NAT64 是 IPv6 到 IPv4 的转换技术。通过配置 NAT64 DNS 服务器，纯 IPv6 服务器可以访问 IPv4 资源。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公益 NAT64 服务器（欧洲）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2001:67c:2b0::4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2001:67c:2b0::6&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 编辑 /etc/resolv.conf
cat &amp;gt; /etc/resolv.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
nameserver 2001:67c:2b0::4
nameserver 2001:67c:2b0::6
EOF

# 验证
cat /etc/resolv.conf

# 测试 DNS 解析
nslookup github.com

# 测试连接
curl -I https://github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;预期输出：&lt;/strong&gt; &lt;code&gt;HTTP/2 200&lt;/code&gt;&lt;/p&gt;
&lt;Warning&gt;
  **为什么只是临时方案？** NAT64 服务通常收费，免费的公益服大多在欧洲。如果你的服务器在美国，流量要先去欧洲再回来，延迟高。不适合长期使用。
&lt;/Warning&gt;

&lt;hr&gt;
&lt;h2&gt;第二步：安装 wgcf&lt;/h2&gt;
&lt;p&gt;现在网络可用了，下载 wgcf 来配置 Cloudflare WARP。&lt;/p&gt;
&lt;h3&gt;下载 wgcf&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /root
wget -6 -qO wgcf https://github.com/ViRb3/wgcf/releases/download/v2.2.30/wgcf_2.2.30_linux_amd64
chmod +x wgcf

# 验证
ls -lah wgcf
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;注册 WARP 账户&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /root
echo &amp;#39;yes&amp;#39; | ./wgcf register
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Successfully created Cloudflare Warp account
Account Id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;生成 WireGuard 配置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./wgcf generate
cat wgcf-profile.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第三步：配置 WireGuard 接口&lt;/h2&gt;
&lt;p&gt;Alpine Linux 缺少 &lt;code&gt;ip6tables-restore&lt;/code&gt;，所以我们用手动方式配置。&lt;/p&gt;
&lt;h3&gt;手动启动 WireGuard&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 复制配置文件
cp /root/wgcf-profile.conf /etc/wireguard/wgcf.conf
chmod 600 /etc/wireguard/wgcf.conf

# 2. 创建 WireGuard 接口
ip link add wgcf type wireguard

# 3. 设置私钥
wg set wgcf private-key &amp;lt;(grep PrivateKey /root/wgcf-profile.conf | awk &amp;#39;{print $3}&amp;#39;)

# 4. 配置 IP 地址（从配置文件提取）
WARP_IPV4=$(grep &amp;quot;Address = &amp;quot; /root/wgcf-profile.conf | grep -oE &amp;quot;172\.[0-9]+\.[0-9]+\.[0-9]+&amp;quot; | head -1)
WARP_IPV6=$(grep &amp;quot;Address = &amp;quot; /root/wgcf-profile.conf | grep -oE &amp;quot;2606:[0-9a-f:]+/128&amp;quot; | head -1)
ip address add ${WARP_IPV4}/32 dev wgcf
ip address add ${WARP_IPV6} dev wgcf

# 5. 设置 MTU
ip link set mtu 1280 up dev wgcf

# 6. 配置 Peer（Cloudflare WARP 服务器）
wg set wgcf peer bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo= \
  allowed-ips 0.0.0.0/0,::/0 \
  endpoint engage.cloudflareclient.com:2408

# 7. 配置路由（让所有 IPv4 流量走 WARP）
ip route add default dev wgcf

# 8. 配置 DNS
cat &amp;gt; /etc/resolv.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
nameserver 1.1.1.1
nameserver 1.0.0.1
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;验证 WireGuard 状态&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wg show wgcf
ip route show
cat /etc/resolv.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;第四步：验证 IPv4 出站能力&lt;/h2&gt;
&lt;h3&gt;测试 IPv4 连接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -4 ipinfo.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;预期输出：Cloudflare IPv4 地址&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;ip&amp;quot;: &amp;quot;104.28.197.244&amp;quot;,
  &amp;quot;org&amp;quot;: &amp;quot;AS13335 Cloudflare, Inc.&amp;quot;,
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;测试 IPv6 连接（确保不中断）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ping -c 1 2001:4860:4860::8888
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;预期：正常响应&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;第五步：清理 NAT64 DNS&lt;/h2&gt;
&lt;p&gt;现在 WARP 已经配置好，停止使用 NAT64 DNS，改用 Cloudflare DNS。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat &amp;gt; /etc/resolv.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
nameserver 1.1.1.1
nameserver 1.0.0.1
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;一键配置脚本&lt;/h2&gt;
&lt;p&gt;如果想一次性配置，用这个脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# 1. 临时配置 NAT64 DNS
echo &amp;quot;配置 NAT64 DNS...&amp;quot;
cat &amp;gt; /etc/resolv.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
nameserver 2001:67c:2b0::4
nameserver 2001:67c:2b0::6
EOF

# 2. 下载 wgcf
echo &amp;quot;下载 wgcf...&amp;quot;
cd /root
wget -6 -qO wgcf https://github.com/ViRb3/wgcf/releases/download/v2.2.30/wgcf_2.2.30_linux_amd64
chmod +x wgcf

# 3. 注册 WARP 账户
echo &amp;quot;注册 WARP 账户...&amp;quot;
echo &amp;#39;yes&amp;#39; | ./wgcf register

# 4. 生成配置
echo &amp;quot;生成 WireGuard 配置...&amp;quot;
./wgcf generate

# 5. 配置 WireGuard
echo &amp;quot;配置 WireGuard...&amp;quot;
cp /root/wgcf-profile.conf /etc/wireguard/wgcf.conf
chmod 600 /etc/wireguard/wgcf.conf

ip link add wgcf type wireguard
wg set wgcf private-key &amp;lt;(grep PrivateKey /root/wgcf-profile.conf | awk &amp;#39;{print $3}&amp;#39;)
ip address add 172.16.0.2/32 dev wgcf
ip link set mtu 1280 up dev wgcf
wg set wgcf peer bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo= \
  allowed-ips 0.0.0.0/0,::/0 \
  endpoint engage.cloudflareclient.com:2408
ip route add default dev wgcf

# 6. 配置 DNS
echo &amp;quot;配置 DNS...&amp;quot;
cat &amp;gt; /etc/resolv.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
nameserver 1.1.1.1
nameserver 1.0.0.1
EOF

# 7. 验证
echo &amp;quot;验证 IPv4 出站...&amp;quot;
curl -4 ipinfo.io

echo &amp;quot;验证 IPv6 连接...&amp;quot;
ping -c 1 2001:4860:4860::8888

echo &amp;quot;配置完成！&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;故障排查&lt;/h2&gt;
&lt;h3&gt;WireGuard 接口创建失败&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;错误：&lt;/strong&gt; &lt;code&gt;RTNETLINK answers: File exists&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ip link delete wgcf 2&amp;gt;/dev/null
ip link add wgcf type wireguard
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;DNS 无法解析&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;错误：&lt;/strong&gt; &lt;code&gt;curl: (6) Could not resolve host&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat /etc/resolv.conf
ping -c 1 2606:4700:4700::1111
nslookup github.com 2606:4700:4700::1111
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;IPv4 出站失败&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;错误：&lt;/strong&gt; &lt;code&gt;curl: (7) Failed to connect&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wg show wgcf
ip route show
wg show wgcf peers
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;IPv6 连接中断&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;症状：&lt;/strong&gt; SSH 连接断开&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 默认路由指向 wgcf，导致 IPv6 流量也走 WARP&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt; 只让 IPv4 流量走 WARP（见第三步的路由配置）&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;关键要点&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAT64 DNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;临时方案，用来下载 wgcf；不适合长期使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WARP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;长期方案，提供稳定的 IPv4 出站能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WireGuard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WARP 的底层协议，需要手动配置（Alpine 不支持 wg-quick）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS 配置&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;使用 Cloudflare DNS（IPv6 优先），确保 DNS 查询可达&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;路由配置&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;只让 IPv4 流量走 WARP，IPv6 保持原样&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;参考资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NAT64 服务列表：&lt;/strong&gt; &lt;a href=&quot;http://nat64.xyz&quot;&gt;http://nat64.xyz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare WARP：&lt;/strong&gt; &lt;a href=&quot;https://www.cloudflare.com/warp/&quot;&gt;https://www.cloudflare.com/warp/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wgcf 项目：&lt;/strong&gt; &lt;a href=&quot;https://github.com/ViRb3/wgcf&quot;&gt;https://github.com/ViRb3/wgcf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WireGuard 文档：&lt;/strong&gt; &lt;a href=&quot;https://www.wireguard.com/&quot;&gt;https://www.wireguard.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;第六步：安装 komari-agent（可选）&lt;/h2&gt;
&lt;p&gt;如果你想在那个 Alpine 服务器上安装监控代理，可以用 komari-agent。&lt;/p&gt;
&lt;h3&gt;下载并安装 komari-agent&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 下载安装脚本
wget -qO- https://raw.githubusercontent.com/komari-monitor/komari-agent/refs/heads/main/install.sh | sudo bash -s -- \
  -e https://monitor.031003.xyz \
  -t YOUR_TOKEN_HERE \
  --disable-web-ssh \
  --month-rotate 22
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;验证安装&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 检查进程
ps aux | grep komari-agent | grep -v grep

# 查看日志
tail -20 /tmp/komari-agent.log
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;故障排查进阶&lt;/h2&gt;
&lt;h3&gt;WARP Peer 握手失败&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;症状：&lt;/strong&gt; &lt;code&gt;wg show wgcf&lt;/code&gt; 显示 peer 信息，但没有 &lt;code&gt;latest handshake&lt;/code&gt; 时间&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; Peer 握手失败，WARP 连接未真正建立&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 删除旧接口
ip link delete wgcf 2&amp;gt;/dev/null

# 重新创建并配置
ip link add wgcf type wireguard
wg set wgcf private-key &amp;lt;(grep PrivateKey /root/wgcf-profile.conf | awk &amp;#39;{print $3}&amp;#39;)
ip address add 172.16.0.2/32 dev wgcf
ip link set mtu 1280 up dev wgcf
wg set wgcf peer bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo= \
  allowed-ips 0.0.0.0/0,::/0 \
  endpoint engage.cloudflareclient.com:2408
ip route add default dev wgcf

# 等待握手
sleep 5

# 验证
wg show wgcf | grep &amp;quot;latest handshake&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;komari-agent 无法连接到监控服务器&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;症状：&lt;/strong&gt; komari-agent 日志显示 &lt;code&gt;Failed to connect to WebSocket&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 网络连接不稳定或 DNS 解析失败&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 检查 DNS
cat /etc/resolv.conf
nslookup monitor.031003.xyz

# 检查 WARP 状态
wg show wgcf

# 检查路由
ip route show

# 重启 komari-agent
pkill -f komari-agent
sleep 2
nohup /opt/komari/komari-agent -e https://monitor.031003.xyz -t YOUR_TOKEN &amp;gt; /tmp/komari-agent.log 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过 NAT64 DNS + Cloudflare WARP 的组合方案，我们成功为纯 IPv6 服务器配置了 IPv4 出站能力。这个方案既解决了初期的网络问题（无法下载软件），又提供了长期稳定的解决方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下次遇到纯 IPv6 服务器，你就知道怎么办了。&lt;/strong&gt;&lt;/p&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>Google 发布 Gemini 3.1 Pro：逻辑推理能力翻倍，重塑 AI 复杂任务处理新标杆</title><link>https://www.bcd.moe/blog/google-gemini-3-1-pro-reasoning</link><guid isPermaLink="true">https://www.bcd.moe/blog/google-gemini-3-1-pro-reasoning</guid><description>Google 正式推出 Gemini 3.1 Pro 模型，在逻辑推理性能上提升超过一倍，将改变开发者构建应用的方式，也将深刻重塑我们每一个人使用 AI 工具的习惯。</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在人工智能领域，模型能力的进化速度总是令人惊叹。就在今天，Google 正式推出了备受瞩目的 Gemini 3.1 Pro 模型。这次更新绝不仅仅是版本号的简单+0.1，而是一次针对复杂任务处理和核心推理能力的深度进化。&lt;/p&gt;
&lt;p&gt;如果你是开发者、科研人员或是重度 AI 用户，Gemini 3.1 Pro 绝对值得你立刻上手体验。&lt;/p&gt;
&lt;h3&gt;🧠 核心亮点：推理性能实现“翻倍”跨越&lt;/h3&gt;
&lt;p&gt;在过去的一年里，大模型的“语言表达”已经趋于完美，但“逻辑推理”始终是区分模型上限的核心指标。Gemini 3.1 Pro 这次交出了一份令人惊艳的答卷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ARC-AGI-2 基准测试创佳绩&lt;/strong&gt;：在该项旨在衡量 AI 抽象推理和泛化能力的严苛测试中，Gemini 3.1 Pro 取得了 77.1% 的高分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能翻倍&lt;/strong&gt;：相比于前代 Gemini 3 Pro，3.1 Pro 在逻辑推理性能上提升了超过一倍。这意味着它在面对长文本逻辑梳理、复杂代码调试、多步骤数学推导以及深层次问题拆解时，将展现出前所未有的敏锐度与准确率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🛠️ 开发者优先：全面接入核心生态&lt;/h3&gt;
&lt;p&gt;为了让开发者能够第一时间将这种强大的推理能力转化为实际应用，Google 已经在其核心开发平台上开放了 Gemini 3.1 Pro 的预览版：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gemini API&lt;/strong&gt;：快速集成到各类第三方应用中，为你的产品注入强大的“思考”能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vertex AI&lt;/strong&gt;：企业级用户的首选，支持在安全合规的环境中进行模型的微调、部署与大规模扩展。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android Studio&lt;/strong&gt;：移动端开发者的福音。得益于推理能力的提升，Android Studio 中的 AI 助手将能更精准地理解上下文，提供更深度的代码重构建议和 Bug 修复方案。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;💻 普通用户如何第一时间体验？&lt;/h3&gt;
&lt;p&gt;你不需要懂代码，同样可以感受到 Gemini 3.1 Pro 带来的生产力飞跃。目前，该模型已同步向普通用户开放：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gemini 应用&lt;/strong&gt;：日常的问答、写作、逻辑分析，你都会感觉到它的回答更加严谨、深刻。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NotebookLM&lt;/strong&gt;：这是 Gemini 3.1 Pro 绝佳的用武之地。借助翻倍的推理能力，NotebookLM 能够更精准地从你的海量文档、笔记和学术论文中提取关键逻辑，生成更具深度的洞察报告。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;贴士&lt;/strong&gt;：
对于重度依赖 AI 生产力的用户，Google 提供了分层级的服务。Google AI Pro 与 Ultra 的订阅用户将享有更高的 Gemini 3.1 Pro 使用限额，确保在处理高强度工作流时畅通无阻。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;总结：从“能言善辩”到“深思熟虑”&lt;/h3&gt;
&lt;p&gt;Gemini 3.1 Pro 的发布，释放了一个明确的信号：Google 正在将 AI 的发展重心从单纯的“生成”向更深层次的“推理”转移。这不仅将改变开发者构建应用的方式，也将深刻重塑我们每一个人使用 AI 工具的习惯。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;你会如何利用 Gemini 3.1 Pro 翻倍的推理能力？是去挑战一段一直没解决的复杂代码，还是让它帮你梳理晦涩难懂的学术论文？欢迎在评论区分享你的想法！&lt;/p&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>窗外一瞥能&quot;加分&quot;：开阔窗景如何提升高压力考试表现</title><link>https://www.bcd.moe/blog/window-view-exam-performance</link><guid isPermaLink="true">https://www.bcd.moe/blog/window-view-exam-performance</guid><description>基于中国高考的随机座位自然实验研究发现，能看到窗外的座位考生成绩提高约9分，进入一本的概率高2.8%。揭示注意力恢复理论在认知表现中的作用。</description><pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/window-view-exam-performance/exam-room-floor-plan.jpg&quot; alt=&quot;考试教室座位平面图&quot;&gt;&lt;/p&gt;
&lt;h2&gt;研究背景&lt;/h2&gt;
&lt;p&gt;湘潭大学的学者在经济学期刊《Journal of Economic Behavior &amp;amp; Organization》发表了一项有趣的研究：&lt;strong&gt;坐在窗边是否会影响高风险环境中的认知表现？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个问题看似简单，但答案可能会改变我们对考场设计的理解。&lt;/p&gt;
&lt;h2&gt;研究方法&lt;/h2&gt;
&lt;p&gt;研究基于中国高考的真实数据，利用随机座位分配这一&amp;quot;天然实验&amp;quot;来隔离窗景的因果效应。&lt;/p&gt;
&lt;h3&gt;座位设计&lt;/h3&gt;
&lt;p&gt;考生被随机分配到 &lt;strong&gt;5 列 × 6 行&lt;/strong&gt; 的座位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第 5 列&lt;/strong&gt; — 靠窗且可见室外，有开阔的自然视野&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 1 列&lt;/strong&gt; — 同样靠窗但因走廊遮挡，几乎无窗景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 2-4 列&lt;/strong&gt; — 中间座位，无窗景&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;因果推断&lt;/h3&gt;
&lt;p&gt;研究者用平衡性检验证明了座位分配与考生的性别、年龄、城乡等特征完全不相关，从而将不同的&amp;quot;窗景暴露&amp;quot;视为近似自然实验。这意味着我们可以放心地将座位位置与成绩差异因果关联起来。&lt;/p&gt;
&lt;h2&gt;核心发现&lt;/h2&gt;
&lt;p&gt;结果出人意料地清晰：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;仅&amp;quot;无遮挡窗景&amp;quot;与更高成绩相关：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第 5 列考生成绩提高约 &lt;strong&gt;0.09 个标准差&lt;/strong&gt;（换算约 &lt;strong&gt;9 分&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;进入&amp;quot;一本/第一梯队大学&amp;quot;的概率高 &lt;strong&gt;2.8 个百分点&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;第 1 列与中间座位的差异&lt;strong&gt;不显著&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这说明关键不是&amp;quot;靠窗&amp;quot;，而是&lt;strong&gt;能否真正看到窗外&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;机制解释：注意力恢复理论&lt;/h2&gt;
&lt;p&gt;为什么窗景能提升成绩？研究指向&lt;strong&gt;注意力恢复理论（Attention Restoration Theory）&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;心理休息&lt;/strong&gt; — 眼睛看向窗外时，大脑短暂放松&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自然刺激&lt;/strong&gt; — 温和的自然景观提供低强度的认知刺激&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意力恢复&lt;/strong&gt; — 这种&amp;quot;微休息&amp;quot;帮助考生恢复专注力，应对后续的高强度认知任务&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;效应的不均匀性&lt;/h3&gt;
&lt;p&gt;有趣的是，&lt;strong&gt;效应并非对所有人都相同&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意力容易分散的学生获益更大&lt;/strong&gt; — 说明这种&amp;quot;自然休息&amp;quot;对那些本来就难以集中注意力的人帮助最大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;男生效应更强&lt;/strong&gt; — 可能反映不同群体的注意力特征差异&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;实际启示&lt;/h2&gt;
&lt;p&gt;这项研究对考场设计有直接的启示：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;座位安排&lt;/strong&gt; — 如果条件允许，优先给考生安排能看到窗外的座位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低成本干预&lt;/strong&gt; — 这是一个几乎零成本的性能提升方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个体差异&lt;/strong&gt; — 对注意力本来就容易分散的学生，这个效应尤其明显&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但需要注意的是，&lt;strong&gt;平衡很重要&lt;/strong&gt; — 窗景的目的是帮助恢复注意力，而不是让学生分心。&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;一个简单的座位选择，竟然能影响高考成绩。这不仅说明了环境因素的重要性，也提醒我们：&lt;strong&gt;有时候，最好的干预不是复杂的技术，而是理解人类认知的基本规律，然后做出简单而聪明的设计。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下次设计考场或工作空间时，不妨想想：&lt;strong&gt;窗外的景色，可能比你想象的更重要。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;研究发表于：&lt;em&gt;Journal of Economic Behavior &amp;amp; Organization&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;研究机构：湘潭大学&lt;/li&gt;
&lt;li&gt;研究方法：随机座位分配自然实验&lt;/li&gt;
&lt;li&gt;样本：中国高考考生&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>开源工具分享：GeminiWatermarkTool — 离线去除 Gemini 图片水印</title><link>https://www.bcd.moe/blog/gemini-watermark-removal-tool</link><guid isPermaLink="true">https://www.bcd.moe/blog/gemini-watermark-removal-tool</guid><description>介绍一款命令行开源工具，可离线去除 Gemini 生成图片右下角的可见水印。通过反向 Alpha 混合算法还原像素，支持批量处理，同时提供纯前端版本。</description><pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/gemini-watermark-removal-tool/gemini-watermark-tool.jpg&quot; alt=&quot;GeminiWatermarkTool 项目&quot;&gt;&lt;/p&gt;
&lt;h2&gt;项目介绍&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GeminiWatermarkTool&lt;/strong&gt; 是一款开源命令行工具，可以离线去除 Google Gemini 生成图片右下角的可见水印。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/allenk/GeminiWatermarkTool&quot;&gt;allenk/GeminiWatermarkTool&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stars:&lt;/strong&gt; 74&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forks:&lt;/strong&gt; 12&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contributors:&lt;/strong&gt; 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;核心特性&lt;/h2&gt;
&lt;h3&gt;1. 离线处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用 C++ 编写，无需依赖&lt;/li&gt;
&lt;li&gt;完全本地运行，不依赖任何服务器&lt;/li&gt;
&lt;li&gt;支持批量处理整个目录&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 算法原理&lt;/h3&gt;
&lt;p&gt;采用&lt;strong&gt;反向 Alpha 混合&lt;/strong&gt;计算来还原被水印覆盖的像素：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;原始像素 = (混合像素 - 水印像素 × α) / (1 - α)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个方法的优势在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;精确性高&lt;/strong&gt; — 直接数学还原，不依赖 AI 修补&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免不确定性&lt;/strong&gt; — AI 修补可能引入额外的失真或错误&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;速度快&lt;/strong&gt; — 纯数学计算，处理速度很快&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 格式支持&lt;/h3&gt;
&lt;p&gt;支持常见的图片格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPG&lt;/li&gt;
&lt;li&gt;PNG&lt;/li&gt;
&lt;li&gt;WebP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 批量处理&lt;/h3&gt;
&lt;p&gt;可以一次性处理整个目录的图片，适合大量去水印的场景。&lt;/p&gt;
&lt;h2&gt;使用方式&lt;/h2&gt;
&lt;p&gt;基本用法很简单：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 处理单个文件
./gemini-watermark-remover input.png output.png

# 批量处理目录
./gemini-watermark-remover ./input_dir ./output_dir
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;前端版本&lt;/h2&gt;
&lt;p&gt;有开发者基于此项目开发了&lt;strong&gt;纯前端版本&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/journey-ad/gemini-watermark-remover&quot;&gt;journey-ad/gemini-watermark-remover&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;前端版本的优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完全在浏览器本地运行&lt;/strong&gt; — 无需下载工具，打开网页即用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 实现&lt;/strong&gt; — 跨平台兼容性更好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同样的算法&lt;/strong&gt; — 使用反向 Alpha 混合还原像素&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私友好&lt;/strong&gt; — 所有处理都在本地，不上传到服务器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术亮点&lt;/h2&gt;
&lt;h3&gt;反向 Alpha 混合 vs AI 修补&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;精确度&lt;/th&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;依赖&lt;/th&gt;
&lt;th&gt;稳定性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;反向 Alpha 混合&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;快&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 修补&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;慢&lt;/td&gt;
&lt;td&gt;模型&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;反向 Alpha 混合的核心优势是&lt;strong&gt;确定性&lt;/strong&gt; — 同样的输入总是产生同样的输出，不会因为模型更新而变化。&lt;/p&gt;
&lt;h2&gt;局限性&lt;/h2&gt;
&lt;p&gt;作者坦诚了工具的局限：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 支持去除&lt;strong&gt;可见水印&lt;/strong&gt;（透明度混合的水印）&lt;/li&gt;
&lt;li&gt;❌ 不支持去除&lt;strong&gt;隐藏水印&lt;/strong&gt;（如 LSB 隐写、频域水印等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是合理的 — 可见水印是透明度混合，可以反向计算；隐藏水印需要更复杂的逆向工程。&lt;/p&gt;
&lt;h2&gt;适用场景&lt;/h2&gt;
&lt;p&gt;这个工具适合：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gemini 用户&lt;/strong&gt; — 想要保存无水印的生成图片&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;批量处理&lt;/strong&gt; — 需要去除大量图片的水印&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私考虑&lt;/strong&gt; — 不想上传图片到在线工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发者&lt;/strong&gt; — 想要集成到自己的工作流中&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;GeminiWatermarkTool 是一个&lt;strong&gt;简洁而有效&lt;/strong&gt;的开源项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;算法原理清晰（反向 Alpha 混合）&lt;/li&gt;
&lt;li&gt;实现方式多样（C++ CLI + JavaScript 前端）&lt;/li&gt;
&lt;li&gt;使用场景明确（去除 Gemini 水印）&lt;/li&gt;
&lt;li&gt;局限性透明（只支持可见水印）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;无论你是想快速去除几张图片的水印，还是想理解 Alpha 混合的原理，这个项目都值得一看。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;相关资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C++ 版本：&lt;/strong&gt; &lt;a href=&quot;https://github.com/allenk/GeminiWatermarkTool&quot;&gt;https://github.com/allenk/GeminiWatermarkTool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端版本：&lt;/strong&gt; &lt;a href=&quot;https://github.com/journey-ad/gemini-watermark-remover&quot;&gt;https://github.com/journey-ad/gemini-watermark-remover&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha 混合原理：&lt;/strong&gt; 计算机图形学基础&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item><item><title>进化！我在用 OpenClaw 智脑写博客</title><link>https://www.bcd.moe/blog/evolution-openclaw-blog-automation</link><guid isPermaLink="true">https://www.bcd.moe/blog/evolution-openclaw-blog-automation</guid><description>告别繁琐的 Git 操作，通过 Telegram 与 OpenClaw 智脑对话，实现全自动化的博文撰写与发布流程。</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;
import AudioPlayer from &amp;quot;../../components/mdx/AudioPlayer.tsx&amp;quot;;&lt;/p&gt;
&lt;h2&gt;告别传统发布流程&lt;/h2&gt;
&lt;p&gt;以前发博客：写 Markdown -&amp;gt; 存文件 -&amp;gt; Git Commit -&amp;gt; Git Push -&amp;gt; 等待 Vercel 构建。
现在发博客：&lt;strong&gt;直接在 Telegram 里吩咐我的智脑（OpenClaw）。&lt;/strong&gt;&lt;/p&gt;
&lt;Warning&gt;
  **高效提醒**：通过 OpenClaw 自动化发布，你只需要专注于内容创作，剩下的环境配置、文件结构和推送任务都由 AI 自动完成。
&lt;/Warning&gt;

&lt;h3&gt;它是如何工作的？&lt;/h3&gt;
&lt;p&gt;我的智脑 OpenClaw 运行在服务器后台，通过 GitHub Personal Access Token 获得了仓库的读写权限。它不仅能理解我的自然语言，还能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;结构化处理&lt;/strong&gt;：自动生成符合 Astro 规范的 Frontmatter（标题、日期、标签）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件管理&lt;/strong&gt;：在 &lt;code&gt;src/content/blog&lt;/code&gt; 目录下精准创建 &lt;code&gt;.mdx&lt;/code&gt; 文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动部署&lt;/strong&gt;：完成写入后自动执行 Git 操作，触发 Vercel 的生产环境构建。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;配置核心&lt;/h3&gt;
&lt;p&gt;为了让智脑动起来，我只需要在本地环境中配置好 GitHub Token。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dotenv&quot;&gt;# .env.local 示例
GITHUB_TOKEN=ghp_your_secure_token
GITHUB_USER=himyhy
GITHUB_REPO=SaroProck
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;主人寄语&lt;/strong&gt;：科技不应该增加负担，而应该消除负担。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://www.bcd.moe/photo/evolution-openclaw-blog-automation/20250707_084807.webp&quot; alt=&quot;智脑创作中&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;创作 BGM&lt;/h3&gt;
&lt;p&gt;在写作时，我喜欢听这首歌来寻找灵感：&lt;/p&gt;
&lt;p&gt;&lt;AudioPlayer 
  src=&quot;https://www.bcd.moe/music/evolution-openclaw-blog-automation/%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%A4%A9%E4%BA%AE%20-%20%E9%83%AD%E9%9D%99.mp3&quot;
  client:load 
/&gt;  &lt;/p&gt;
&lt;p&gt;&lt;em&gt;这篇文章就是由 OpenClaw 辅助完成并自动推送发布的。&lt;/em&gt;&lt;/p&gt;
</content:encoded><dc:creator>HY博客</dc:creator></item></channel></rss>