<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://blog.legspcpd.top/</id>
  <title type="text">LegspCpd Blog</title>
  <subtitle type="text">记录技术折腾与生活点滴</subtitle>
  <updated>2026-10-02T00:00:00.000Z</updated>
  <author><name>LegspCpd</name></author>
  <link rel="alternate" href="https://blog.legspcpd.top/"/>
  <link rel="self" href="https://blog.legspcpd.top/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://blog.legspcpd.top/posts/fuwari-termux-cloudflare-wrangler-guide/</id>
      <title type="text">在 Termux 上配置 Cloudflare Wrangler，并上传已有 Worker 与 D1 数据库</title>
      <published>2026-10-02T00:00:00.000Z</published>
      <updated>2026-10-02T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/fuwari-termux-cloudflare-wrangler-guide/"/>
      <summary type="text">适合新手的 Termux + Ubuntu + Wrangler 教程：从零安装 Cloudflare Wrangler，登录 Cloudflare，连接已经创建好的 Worker 和 D1，并完成 SQLite/SQL 数据库导入与 Worker 部署。</summary>
      <content type="html"><![CDATA[<section><h1>在 Termux 上配置 Cloudflare Wrangler，并上传已有 Worker 与 D1 数据库<a href="#在-termux-上配置-cloudflare-wrangler并上传已有-worker-与-d1-数据库"><span>#</span></a></h1><blockquote><p>本教程按“完全不会 Wrangler 的新手”来写。</p><p>目标是让你最终可以只使用 Android 手机上的 <strong>Termux</strong>，完成：</p><ul>
<li>安装 Wrangler</li>
<li>登录 Cloudflare</li>
<li>查看已经创建好的 Worker</li>
<li>查看已经创建好的 D1</li>
<li>上传 <code>.sql</code> 数据库</li>
<li>将 <code>.db</code> / <code>.sqlite</code> 数据库转换为 SQL 后导入</li>
<li>部署 Worker</li>
<li>检查 D1 是否导入成功</li>
</ul><p>本教程使用 <strong>Termux → Ubuntu 24.04 → Node.js 24 → Wrangler</strong> 这条路线。这样可以绕开原生 Android/Termux 环境下 Wrangler 原生依赖可能带来的兼容性问题。</p></blockquote><section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li><a href="#%E4%B8%80%E5%85%88%E7%90%86%E8%A7%A3%E6%95%B4%E4%B8%AA%E6%B5%81%E7%A8%8B">一、先理解整个流程</a></li>
<li><a href="#%E4%BA%8C%E7%AC%AC%E4%B8%80%E6%AD%A5%E6%9B%B4%E6%96%B0-termux">二、第一步：更新 Termux</a></li>
<li><a href="#%E4%B8%89%E7%AC%AC%E4%BA%8C%E6%AD%A5%E5%AE%89%E8%A3%85-ubuntu-2404">三、第二步：安装 Ubuntu 2404</a></li>
<li><a href="#%E5%9B%9B%E7%AC%AC%E4%B8%89%E6%AD%A5%E8%BF%9B%E5%85%A5-ubuntu">四、第三步：进入 Ubuntu</a></li>
<li><a href="#%E4%BA%94%E7%AC%AC%E5%9B%9B%E6%AD%A5%E7%BB%99-termux-%E8%AE%BF%E9%97%AE%E6%89%8B%E6%9C%BA%E5%AD%98%E5%82%A8%E7%9A%84%E6%9D%83%E9%99%90">五、第四步：给 Termux 访问手机存储的权限</a></li>
<li><a href="#%E5%85%AD%E7%AC%AC%E4%BA%94%E6%AD%A5%E6%9B%B4%E6%96%B0-ubuntu-%E5%B9%B6%E5%AE%89%E8%A3%85%E5%9F%BA%E7%A1%80%E5%B7%A5%E5%85%B7">六、第五步：更新 Ubuntu 并安装基础工具</a></li>
<li><a href="#%E4%B8%83%E7%AC%AC%E5%85%AD%E6%AD%A5%E5%AE%89%E8%A3%85-nvm">七、第六步：安装 NVM</a></li>
<li><a href="#%E5%85%AB%E7%AC%AC%E4%B8%83%E6%AD%A5%E5%AE%89%E8%A3%85-nodejs-24">八、第七步：安装 Node.js 24</a></li>
<li><a href="#%E4%B9%9D%E7%AC%AC%E5%85%AB%E6%AD%A5%E5%AE%89%E8%A3%85-wrangler">九、第八步：安装 Wrangler</a></li>
<li><a href="#%E5%8D%81%E7%AC%AC%E4%B9%9D%E6%AD%A5%E7%99%BB%E5%BD%95-cloudflare">十、第九步：登录 Cloudflare</a></li>
<li><a href="#%E5%8D%81%E4%B8%80%E7%AC%AC%E5%8D%81%E6%AD%A5%E6%A3%80%E6%9F%A5%E7%99%BB%E5%BD%95%E7%8A%B6%E6%80%81">十一、第十步：检查登录状态</a></li>
<li><a href="#%E5%8D%81%E4%BA%8C%E7%AC%AC%E5%8D%81%E4%B8%80%E6%AD%A5%E6%9F%A5%E7%9C%8B%E5%B7%B2%E6%9C%89-d1">十二、第十一步：查看已有 D1</a></li>
<li><a href="#%E5%8D%81%E4%B8%89%E7%AC%AC%E5%8D%81%E4%BA%8C%E6%AD%A5%E6%9F%A5%E7%9C%8B-d1-%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF">十三、第十二步：查看 D1 详细信息</a></li>
<li><a href="#%E5%8D%81%E5%9B%9B%E7%AC%AC%E5%8D%81%E4%B8%89%E6%AD%A5%E8%8E%B7%E5%8F%96%E5%B7%B2%E7%BB%8F%E5%88%9B%E5%BB%BA%E5%A5%BD%E7%9A%84-worker">十四、第十三步：获取已经创建好的 Worker</a></li>
<li><a href="#%E5%8D%81%E4%BA%94%E7%AC%AC%E5%8D%81%E5%9B%9B%E6%AD%A5%E8%BF%9B%E5%85%A5-worker-%E9%A1%B9%E7%9B%AE">十五、第十四步：进入 Worker 项目</a></li>
<li><a href="#%E5%8D%81%E5%85%AD%E7%AC%AC%E5%8D%81%E4%BA%94%E6%AD%A5%E6%A3%80%E6%9F%A5-wrangler-%E9%85%8D%E7%BD%AE">十六、第十五步：检查 Wrangler 配置</a></li>
<li><a href="#%E5%8D%81%E4%B8%83%E7%AC%AC%E5%8D%81%E5%85%AD%E6%AD%A5%E7%90%86%E8%A7%A3-d1-binding">十七、第十六步：理解 D1 Binding</a></li>
<li><a href="#%E5%8D%81%E5%85%AB%E7%AC%AC%E5%8D%81%E4%B8%83%E6%AD%A5%E5%A4%87%E4%BB%BD%E7%8E%B0%E6%9C%89-d1">十八、第十七步：备份现有 D1</a></li>
<li><a href="#%E5%8D%81%E4%B9%9D%E7%AC%AC%E5%8D%81%E5%85%AB%E6%AD%A5%E4%B8%8A%E4%BC%A0-sql-%E6%95%B0%E6%8D%AE%E5%BA%93">十九、第十八步：上传 SQL 数据库</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E7%AC%AC%E5%8D%81%E4%B9%9D%E6%AD%A5%E5%A6%82%E6%9E%9C%E6%89%8B%E9%87%8C%E7%9A%84%E6%98%AF-dbsqlite-%E6%96%87%E4%BB%B6">二十、第十九步：如果手里的是 db/sqlite 文件</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E4%B8%80%E7%AC%AC%E4%BA%8C%E5%8D%81%E6%AD%A5%E6%A3%80%E6%9F%A5-d1-%E6%95%B0%E6%8D%AE">二十一、第二十步：检查 D1 数据</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E4%BA%8C%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%B8%80%E6%AD%A5%E9%83%A8%E7%BD%B2-worker-%E5%89%8D%E5%85%88%E6%B5%8B%E8%AF%95">二十二、第二十一步：部署 Worker 前先测试</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E4%B8%89%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%AD%A5%E6%AD%A3%E5%BC%8F%E9%83%A8%E7%BD%B2-worker">二十三、第二十二步：正式部署 Worker</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%B8%89%E6%AD%A5%E4%BB%A5%E5%90%8E%E6%80%8E%E4%B9%88%E6%9B%B4%E6%96%B0-worker">二十四、第二十三步：以后怎么更新 Worker</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E4%BA%94%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">二十五、常见问题</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E5%85%AD%E5%AE%8C%E6%95%B4%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5">二十六、完整命令速查</a></li>
<li><a href="#%E4%BA%8C%E5%8D%81%E4%B8%83%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">二十七、参考资料</a></li>
</ul><hr /></section><section><h2>一、先理解整个流程<a href="#一先理解整个流程"><span>#</span></a></h2><p>我们最终的环境大概是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Android 手机</span></div></div><div><div><div>2</div></div><div><span>└── Termux</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>└── Ubuntu 24.04</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>├── Node.js 24</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>├── npm</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>└── Wrangler</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>├── Cloudflare Worker</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>└── Cloudflare D1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>以后你更新 Worker 时，基本只需要：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果要把 SQL 导入 D1：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>二、第一步：更新 Termux<a href="#二第一步更新-termux"><span>#</span></a></h2><p>打开 Termux，执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pkg</span><span> </span><span>update</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pkg</span><span> </span><span>upgrade</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再安装 PRoot-Distro：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pkg</span><span> </span><span>install</span><span> </span><span>proot-distro</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>为什么要安装 PRoot-Distro？<a href="#为什么要安装-proot-distro"><span>#</span></a></h3><p>我们不直接把 Wrangler 装进 Android 的 Termux 环境，而是在 Termux 里面运行一个 Ubuntu 24.04 环境，再在 Ubuntu 里安装 Node.js 和 Wrangler。</p><p>这条路线更适合新手，也更容易处理 Wrangler 的 Linux/Node 原生依赖。</p><hr /></section></section><section><h2>三、第二步：安装 Ubuntu 24.04<a href="#三第二步安装-ubuntu-2404"><span>#</span></a></h2><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>install</span><span> </span><span>ubuntu:24.04</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>等待安装完成。</p><p>如果看到类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[*] Installing Ubuntu (24.04)...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>就耐心等它结束。</p><p>安装结束后，输入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>list</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>你应该能看到已经安装好的 Ubuntu。</p><hr /></section><section><h2>四、第三步：进入 Ubuntu<a href="#四第三步进入-ubuntu"><span>#</span></a></h2><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>login</span><span> </span><span>ubuntu</span><span> </span><span>--shared-home</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>成功进入后，命令行通常会变成类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>root@localhost:~#</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这就说明：</p><blockquote><p>你已经不是在 Android 的原生 Termux Shell 里，而是在 Termux 里的 Ubuntu 环境中了。</p></blockquote><section><h3>为什么使用 <code>--shared-home</code>？<a href="#为什么使用---shared-home"><span>#</span></a></h3><p>因为这样 Termux 和 Ubuntu 可以更方便地共享 Home 目录。</p><p>以后你在 Termux 的：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>~/storage/downloads</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>里放 Worker 文件、数据库文件，进入 Ubuntu 后也能更方便地访问。</p><hr /></section></section><section><h2>五、第四步：给 Termux 访问手机存储的权限<a href="#五第四步给-termux-访问手机存储的权限"><span>#</span></a></h2><p>如果你还没有执行过：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>termux-setup-storage</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>建议现在退出 Ubuntu，回到原生 Termux：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>exit</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>termux-setup-storage</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Android 会弹出权限请求。</p><p>点击：</p><p><strong>允许</strong></p><p>之后手机的“下载”目录一般可以通过：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>~/storage/downloads</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>访问。</p><p>例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>手机：</span></div></div><div><div><div>2</div></div><div><span>Download/database.db</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>对应：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>~/storage/downloads/database.db</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>再次进入 Ubuntu<a href="#再次进入-ubuntu"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>login</span><span> </span><span>ubuntu</span><span> </span><span>--shared-home</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h2>六、第五步：更新 Ubuntu 并安装基础工具<a href="#六第五步更新-ubuntu-并安装基础工具"><span>#</span></a></h2><p>进入 Ubuntu 后执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>update</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>upgrade</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装我们后面需要的工具：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>curl</span><span> </span><span>ca-certificates</span><span> </span><span>git</span><span> </span><span>sqlite3</span><span> </span><span>unzip</span><span> </span><span>nano</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这些工具分别用于：</p>

<table><thead><tr><th>工具</th><th>用途</th></tr></thead><tbody><tr><td><code>curl</code></td><td>下载脚本、访问网络</td></tr><tr><td><code>ca-certificates</code></td><td>HTTPS 证书</td></tr><tr><td><code>git</code></td><td>获取项目代码</td></tr><tr><td><code>sqlite3</code></td><td>转换 SQLite 数据库</td></tr><tr><td><code>unzip</code></td><td>解压 ZIP</td></tr><tr><td><code>nano</code></td><td>编辑配置文件</td></tr></tbody></table><hr /></section><section><h2>七、第六步：安装 NVM<a href="#七第六步安装-nvm"><span>#</span></a></h2><p>先安装 NVM：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-fsSL</span><span> </span><span>https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh</span><span> | </span><span>bash</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装结束后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>source</span><span> </span><span>~/.bashrc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvm</span><span> </span><span>--version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果出现类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>0.40.3</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>就说明 NVM 已经安装成功。</p><blockquote><p>如果版本号稍有不同，不需要和示例完全一致。</p></blockquote><hr /></section><section><h2>八、第七步：安装 Node.js 24<a href="#八第七步安装-nodejs-24"><span>#</span></a></h2><p>安装 Node.js 24：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvm</span><span> </span><span>install</span><span> </span><span>24</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>启用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvm</span><span> </span><span>use</span><span> </span><span>24</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>设为默认版本：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvm</span><span> </span><span>alias</span><span> </span><span>default</span><span> </span><span>24</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查 Node：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>node</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>应该看到类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>v24.x.x</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再检查 npm：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npm</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>正常出现版本号即可。</p><hr /></section><section><h2>九、第八步：安装 Wrangler<a href="#九第八步安装-wrangler"><span>#</span></a></h2><p>建议不要把 Wrangler 随便全局安装，而是在一个专门的 Cloudflare 工作目录里面作为项目依赖使用。</p><p>创建目录：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>~/cloudflare</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>进入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>初始化 npm 项目：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npm</span><span> </span><span>init</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装 Wrangler：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>--save-dev</span><span> </span><span>wrangler@latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装完成后检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>--version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果看到类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>⛅ wrangler 4.x.x</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>就成功了。</p><blockquote><p>Wrangler 版本会持续更新，所以版本号不一定和教程中的示例完全相同。</p></blockquote><hr /></section><section><h2>十、 第九步：登录 Cloudflare<a href="#十-第九步登录-cloudflare"><span>#</span></a></h2><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>login</span><span> </span><span>--device</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Cloudflare 会给你一个网址和验证码。</p><p>一般会看到类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>To authorize Wrangler, please visit:</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>https://dash.cloudflare.com/oauth2/device</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>and enter the code:</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>XXXXXXXX</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>接下来做什么？<a href="#接下来做什么"><span>#</span></a></h3><ol>
<li>复制网址。</li>
<li>在手机浏览器打开。</li>
<li>登录你的 Cloudflare 账号。</li>
<li>输入 Termux 显示的验证码。</li>
<li>授权 Wrangler。</li>
<li>回到 Termux。</li>
</ol><p>如果成功，会看到类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Successfully logged in.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h2>十一、第十步：检查登录状态<a href="#十一第十步检查登录状态"><span>#</span></a></h2><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>whoami</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果能正常显示 Cloudflare 账号信息，说明登录成功。</p><section><h3>如果这里失败<a href="#如果这里失败"><span>#</span></a></h3><p>先不要继续操作。</p><p>常见原因包括：</p><ul>
<li>没有完成浏览器授权</li>
<li>登录到了错误的 Cloudflare 账号</li>
<li>网络连接失败</li>
<li>Wrangler 没有正常安装</li>
</ul><hr /></section></section><section><h2>十二、第十一步：查看已有 D1<a href="#十二第十一步查看已有-d1"><span>#</span></a></h2><p>因为你说 <strong>D1 已经创建过了</strong>，所以我们不要重新创建。</p><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>list</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>你应该可以看到类似：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Name          UUID</span></div></div><div><div><div>2</div></div><div><span>my-database   xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>记下：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>D1 名称</span></div></div><div><div><div>2</div></div><div><span>D1 ID</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>D1 名称：</span></div></div><div><div><div>2</div></div><div><span>my-database</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>D1 ID：</span></div></div><div><div><div>5</div></div><div><span>12345678-1234-1234-1234-123456789abc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>不要自己编数据库 ID，以 <code>npx wrangler d1 list</code> 显示的为准。</p></blockquote><hr /></section><section><h2>十三、第十二步：查看 D1 详细信息<a href="#十三第十二步查看-d1-详细信息"><span>#</span></a></h2><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>info</span><span> </span><span>你的D1名称</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>info</span><span> </span><span>my-database</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这一步可以帮助你确认数据库确实存在，以及 Wrangler 已经能够正常访问它。</p><hr /></section><section><h2>十四、第十三步：获取已经创建好的 Worker<a href="#十四第十三步获取已经创建好的-worker"><span>#</span></a></h2><p>你有两种情况。</p><section><h3>情况 A：Worker 已经在 Cloudflare Dashboard 创建<a href="#情况-aworker-已经在-cloudflare-dashboard-创建"><span>#</span></a></h3><p>这是最方便的。</p><p>进入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>init</span><span> </span><span>my-worker</span><span> </span><span>--from-dash</span><span> </span><span>你的Worker名称</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>init</span><span> </span><span>my-worker</span><span> </span><span>--from-dash</span><span> </span><span>my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Wrangler 会尝试把 Dashboard 里已经存在的 Worker 初始化到本地项目。</p><blockquote><p><code>my-worker</code> 是你本地项目目录的名字。</p><p><code>你的Worker名称</code> 是 Cloudflare Dashboard 里面实际存在的 Worker 名字。</p></blockquote><hr /></section><section><h3>情况 B：你手里已经有 Worker 源代码<a href="#情况-b你手里已经有-worker-源代码"><span>#</span></a></h3><p>例如你手里有：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>my-worker/</span></div></div><div><div><div>2</div></div><div><span>├── package.json</span></div></div><div><div><div>3</div></div><div><span>├── wrangler.jsonc</span></div></div><div><div><div>4</div></div><div><span>├── src/</span></div></div><div><div><div>5</div></div><div><span>└── ...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>那么不需要从 Dashboard 拉取，直接把整个项目放到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>~/cloudflare/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>即可。</p><hr /></section></section><section><h2>十五、第十四步：进入 Worker 项目<a href="#十五第十四步进入-worker-项目"><span>#</span></a></h2><p>假设本地项目叫：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare/my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ls</span><span> </span><span>-la</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>正常情况下可能看到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>package.json</span></div></div><div><div><div>2</div></div><div><span>wrangler.jsonc</span></div></div><div><div><div>3</div></div><div><span>src</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或者：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>package.json</span></div></div><div><div><div>2</div></div><div><span>wrangler.toml</span></div></div><div><div><div>3</div></div><div><span>worker.js</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不同项目结构可能不同。</p><hr /></section><section><h2>十六、第十五步：检查 Wrangler 配置<a href="#十六第十五步检查-wrangler-配置"><span>#</span></a></h2><p>优先检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>wrangler.jsonc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果没有：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>wrangler.toml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>一个典型的 <code>wrangler.jsonc</code><a href="#一个典型的-wranglerjsonc"><span>#</span></a></h3><p>例如：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"$schema"</span><span>: </span><span>"./node_modules/wrangler/config-schema.json"</span><span>,</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span>"name"</span><span>: </span><span>"my-worker"</span><span>,</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>"main"</span><span>: </span><span>"src/index.js"</span><span>,</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>  </span><span>"compatibility_date"</span><span>: </span><span>"2026-10-02"</span><span>,</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>  </span><span>"d1_databases"</span><span>: [</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>12</div></div><div><span>      </span><span>"binding"</span><span>: </span><span>"DB"</span><span>,</span></div></div><div><div><div>13</div></div><div><span>      </span><span>"database_name"</span><span>: </span><span>"my-database"</span><span>,</span></div></div><div><div><div>14</div></div><div><span>      </span><span>"database_id"</span><span>: </span><span>"12345678-1234-1234-1234-123456789abc"</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>]</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>这里最重要的是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>name</span></div></div><div><div><div>2</div></div><div><span>main</span></div></div><div><div><div>3</div></div><div><span>d1_databases</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>以及 D1 下面的：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>binding</span></div></div><div><div><div>2</div></div><div><span>database_name</span></div></div><div><div><div>3</div></div><div><span>database_id</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h2>十七、第十六步：理解 D1 Binding<a href="#十七第十六步理解-d1-binding"><span>#</span></a></h2><p>这个概念非常重要。</p><p>例如 Wrangler 配置：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"d1_databases"</span><span>: [</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"binding"</span><span>: </span><span>"DB"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"database_name"</span><span>: </span><span>"my-database"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"database_id"</span><span>: </span><span>"12345678-1234-1234-1234-123456789abc"</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>那么 Worker 代码里面通常会通过：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>env</span><span>.</span></span><span>DB</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>访问这个 D1。</p><p>例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>default</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>async</span><span> </span><span>fetch</span><span><span>(</span><span>request</span><span>, </span><span>env</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>const</span><span> </span><span>result</span><span> </span><span>=</span><span> </span><span>await</span><span><span> </span><span>env</span><span>.</span></span><span>DB</span></div></div><div><div><div>4</div></div><div><span><span>      </span></span><span>.</span><span>prepare</span><span>(</span><span>"SELECT * FROM users"</span><span>)</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>.</span><span>all</span><span>();</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>return</span><span><span> </span><span>Response</span><span>.</span></span><span>json</span><span>(</span><span>result</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这里：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>DB</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>必须和配置里的：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"binding"</span><span>: </span><span>"DB"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>一致。</p><section><h3>一个常见错误<a href="#一个常见错误"><span>#</span></a></h3><p>配置写：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"binding"</span><span>: </span><span>"DB"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>代码却写：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>env</span><span>.</span></span><span>DATABASE</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样 Worker 就找不到对应的 D1 绑定。</p><p>所以：</p><blockquote><p><strong>先看原来的 Worker 代码，再决定 binding 叫什么。不要随便改。</strong></p></blockquote><hr /></section></section><section><h2>十八、第十七步：备份现有 D1<a href="#十八第十七步备份现有-d1"><span>#</span></a></h2><p>因为你的 D1 已经创建过了，所以在导入新的数据库之前，建议先备份。</p><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>export</span><span> </span><span>my-database</span><span> </span><span>--remote</span><span> </span><span>--output=./d1-backup.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>成功以后，你的项目目录里会多出：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>d1-backup.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>为什么要备份？<a href="#为什么要备份"><span>#</span></a></h3><p>假设你的 D1 原来已经存在：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>users</span></div></div><div><div><div>2</div></div><div><span>settings</span></div></div><div><div><div>3</div></div><div><span>messages</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>而你的新 SQL 里又执行：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> </span><span>users</span><span> ...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>就有可能发生表已经存在、重复插入等问题。</p><p>先备份，至少还有恢复依据。</p><hr /></section></section><section><h2>十九、第十八步：上传 SQL 数据库<a href="#十九第十八步上传-sql-数据库"><span>#</span></a></h2><p>如果你的数据库文件已经是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把它放到 Worker 项目目录，例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>~/cloudflare/my-worker/database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare/my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>my-database</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这条命令的意思：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>操作 D1</span></div></div><div><div><div>2</div></div><div><span>↓</span></div></div><div><div><div>3</div></div><div><span>指定数据库</span></div></div><div><div><div>4</div></div><div><span>↓</span></div></div><div><div><div>5</div></div><div><span>操作远程 Cloudflare D1</span></div></div><div><div><div>6</div></div><div><span>↓</span></div></div><div><div><div>7</div></div><div><span>读取 database.sql</span></div></div><div><div><div>8</div></div><div><span>↓</span></div></div><div><div><div>9</div></div><div><span>执行里面的 SQL</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>二十、 第十九步：如果手里的是 <code>.db</code> / <code>.sqlite</code> 文件<a href="#二十-第十九步如果手里的是-db--sqlite-文件"><span>#</span></a></h2><p>这一步非常重要。</p><p>假设你拿到的是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database.db</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或者：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database.sqlite</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不要直接把它作为 <code>--file</code> 上传。</p><p>因为 <code>.db</code> 是 SQLite 数据库文件本身，而 <code>wrangler d1 execute --file</code> 使用的是 SQL 文本。</p><section><h3>第 1 步：进入数据库文件所在目录<a href="#第-1-步进入数据库文件所在目录"><span>#</span></a></h3><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare/my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>第 2 步：把 SQLite 导出成 SQL<a href="#第-2-步把-sqlite-导出成-sql"><span>#</span></a></h3><p>如果文件叫：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database.db</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sqlite3</span><span> </span><span>database.db</span><span> </span><span>".dump"</span><span> &gt; </span><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>完成后检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ls</span><span> </span><span>-lh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>应该能看到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database.db</span></div></div><div><div><div>2</div></div><div><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>第 3 步：检查 SQL 有没有正常生成<a href="#第-3-步检查-sql-有没有正常生成"><span>#</span></a></h3><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>head</span><span> </span><span>-n</span><span> </span><span>30</span><span> </span><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>正常情况下可能看到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>PRAGMA foreign_keys</span><span>=</span></span><span>OFF</span><span>;</span></div></div><div><div><div>2</div></div><div><span>BEGIN</span><span> </span><span>TRANSACTION</span><span>;</span></div></div><div><div><div>3</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> ...</span></div></div><div><div><div>4</div></div><div><span>INSERT INTO</span><span> ...</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果能看到这些 SQL 内容，就说明转换成功。</p></section><section><h3>第 4 步：导入 D1<a href="#第-4-步导入-d1"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>my-database</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h2>二十一、第二十步：检查 D1 数据<a href="#二十一第二十步检查-d1-数据"><span>#</span></a></h2><p>数据库导入之后，建议马上检查表。</p><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--command=</span><span>"SELECT name FROM sqlite_schema WHERE type='table' ORDER BY name;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>my-database</span><span> </span><span>--remote</span><span> </span><span>--command=</span><span>"SELECT name FROM sqlite_schema WHERE type='table' ORDER BY name;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果导入成功，可能看到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>users</span></div></div><div><div><div>2</div></div><div><span>settings</span></div></div><div><div><div>3</div></div><div><span>messages</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样就说明：</p><blockquote><p>D1 不只是“创建成功”，而是已经真正拥有数据库表。</p></blockquote><section><h3>再进一步查询某个表<a href="#再进一步查询某个表"><span>#</span></a></h3><p>例如有：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>users</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>可以：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>my-database</span><span> </span><span>--remote</span><span> </span><span>--command=</span><span>"SELECT * FROM users LIMIT 10;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h2>二十二、第二十一步：部署 Worker 前先测试<a href="#二十二第二十一步部署-worker-前先测试"><span>#</span></a></h2><p>进入 Worker 目录：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare/my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>先运行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--dry-run</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这个命令主要用于检查部署过程，而不会直接把 Worker 正式部署上线。</p><p>如果这里报错：</p><blockquote><p><strong>不要急着正式部署。</strong></p></blockquote><p>先把错误解决。</p><hr /></section><section><h2>二十三、第二十二步：正式部署 Worker<a href="#二十三第二十二步正式部署-worker"><span>#</span></a></h2><p>确认 <code>--dry-run</code> 没问题后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>推荐使用：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>因为你的 Worker 如果之前在 Cloudflare Dashboard 中设置过普通环境变量，部署时最好注意不要意外覆盖原来的变量。</p><p>部署成功以后，一般会看到 Worker 的 URL，例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://my-worker.example.workers.dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这就表示：</p><blockquote><p>Worker 已经重新部署。</p></blockquote><hr /></section><section><h2>二十四、第二十三步：以后怎么更新 Worker<a href="#二十四第二十三步以后怎么更新-worker"><span>#</span></a></h2><p>以后就简单很多。</p><p>每次打开 Termux：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>login</span><span> </span><span>ubuntu</span><span> </span><span>--shared-home</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>进入项目：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare/my-worker</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后先测试：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--dry-run</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>确认无误后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>更新 D1 数据时<a href="#更新-d1-数据时"><span>#</span></a></h2><p>如果新的数据已经是 SQL：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果还是 SQLite：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sqlite3</span><span> </span><span>database.db</span><span> </span><span>".dump"</span><span> &gt; </span><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section>
<section><h1>二十五、常见问题<a href="#二十五常见问题"><span>#</span></a></h1><section><h2>1. <code>node: command not found</code><a href="#1-node-command-not-found"><span>#</span></a></h2><p>检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>source</span><span> </span><span>~/.bashrc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvm</span><span> </span><span>use</span><span> </span><span>24</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>node</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>2. <code>nvm: command not found</code><a href="#2-nvm-command-not-found"><span>#</span></a></h2><p>执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>source</span><span> </span><span>~/.bashrc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvm</span><span> </span><span>--version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果还是不行，可以重新进入 Ubuntu：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>exit</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>login</span><span> </span><span>ubuntu</span><span> </span><span>--shared-home</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>3. <code>wrangler: command not found</code><a href="#3-wrangler-command-not-found"><span>#</span></a></h2><p>如果你是通过：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>--save-dev</span><span> </span><span>wrangler@latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装的，不要直接输入：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wrangler</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>而应该：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>--version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>4. <code>npx wrangler login</code> 登录失败<a href="#4-npx-wrangler-login-登录失败"><span>#</span></a></h2><p>手机环境推荐：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>login</span><span> </span><span>--device</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不要优先折腾本地回调地址。</p><hr /></section><section><h2>5. <code>d1 list</code> 看不到我的 D1<a href="#5-d1-list-看不到我的-d1"><span>#</span></a></h2><p>先检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>whoami</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>确认登录的是正确的 Cloudflare 账号。</p><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>list</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果你的 D1 属于其他 Cloudflare 账号/账户，登录身份不对时自然看不到。</p><hr /></section><section><h2>6. <code>table already exists</code><a href="#6-table-already-exists"><span>#</span></a></h2><p>说明你的 D1 里已经存在这个表。</p><p>先备份：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>export</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--output=./d1-backup.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不要直接乱删表。</p><p>如果你不清楚 SQL 文件到底会做什么，可以先打开：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nano</span><span> </span><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查里面的：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>CREATE</span><span> </span><span>TABLE</span></div></div><div><div><div>2</div></div><div><span>DROP</span><span> </span><span>TABLE</span></div></div><div><div><div>3</div></div><div><span>INSERT INTO</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>等语句。</p><hr /></section><section><h2>7. <code>.db</code> 文件直接导入失败<a href="#7-db-文件直接导入失败"><span>#</span></a></h2><p>不要：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>xxx</span><span> </span><span>--remote</span><span> </span><span>--file=database.db</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>正确方法：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sqlite3</span><span> </span><span>database.db</span><span> </span><span>".dump"</span><span> &gt; </span><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>xxx</span><span> </span><span>--remote</span><span> </span><span>--file=database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>8. Worker 部署成功，但是网站还是不能用<a href="#8-worker-部署成功但是网站还是不能用"><span>#</span></a></h2><p>重点检查：</p><section><h3>D1 binding<a href="#d1-binding"><span>#</span></a></h3><p>配置：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"binding"</span><span>: </span><span>"DB"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>env</span><span>.</span></span><span>DB</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>两者是否一致。</p></section><section><h3>数据库 ID<a href="#数据库-id"><span>#</span></a></h3><p>检查：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database_id</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>是不是你真正的 D1 ID。</p></section><section><h3>数据库名字<a href="#数据库名字"><span>#</span></a></h3><p>检查：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database_name</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>是不是已经存在的 D1。</p></section><section><h3>环境变量<a href="#环境变量"><span>#</span></a></h3><p>如果 Worker 原来在 Dashboard 配置了变量，部署时可以使用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section></section>
<section><h1>二十六、完整命令速查<a href="#二十六完整命令速查"><span>#</span></a></h1><section><h2>第一次安装<a href="#第一次安装"><span>#</span></a></h2><section><h3>Termux<a href="#termux"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pkg</span><span> </span><span>update</span></div></div><div><div><div>2</div></div><div><span>pkg</span><span> </span><span>upgrade</span><span> </span><span>-y</span></div></div><div><div><div>3</div></div><div><span>pkg</span><span> </span><span>install</span><span> </span><span>proot-distro</span><span> </span><span>-y</span></div></div><div><div><div>4</div></div><div><span>termux-setup-storage</span></div></div><div><div><div>5</div></div><div><span>proot-distro</span><span> </span><span>install</span><span> </span><span>ubuntu:24.04</span></div></div><div><div><div>6</div></div><div><span>proot-distro</span><span> </span><span>login</span><span> </span><span>ubuntu</span><span> </span><span>--shared-home</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Ubuntu<a href="#ubuntu"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>update</span></div></div><div><div><div>2</div></div><div><span>apt</span><span> </span><span>upgrade</span><span> </span><span>-y</span></div></div><div><div><div>3</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>curl</span><span> </span><span>ca-certificates</span><span> </span><span>git</span><span> </span><span>sqlite3</span><span> </span><span>unzip</span><span> </span><span>nano</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>NVM<a href="#nvm"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-fsSL</span><span> </span><span>https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh</span><span> | </span><span>bash</span></div></div><div><div><div>2</div></div><div><span>source</span><span> </span><span>~/.bashrc</span></div></div><div><div><div>3</div></div><div><span>nvm</span><span> </span><span>install</span><span> </span><span>24</span></div></div><div><div><div>4</div></div><div><span>nvm</span><span> </span><span>use</span><span> </span><span>24</span></div></div><div><div><div>5</div></div><div><span>nvm</span><span> </span><span>alias</span><span> </span><span>default</span><span> </span><span>24</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>Wrangler<a href="#wrangler"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>~/cloudflare</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>~/cloudflare</span></div></div><div><div><div>3</div></div><div><span>npm</span><span> </span><span>init</span><span> </span><span>-y</span></div></div><div><div><div>4</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>--save-dev</span><span> </span><span>wrangler@latest</span></div></div><div><div><div>5</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>--version</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>登录 Cloudflare<a href="#登录-cloudflare"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>login</span><span> </span><span>--device</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>检查账号<a href="#检查账号"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>whoami</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>查看 D1<a href="#查看-d1"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>list</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>查看 D1 信息<a href="#查看-d1-信息"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>info</span><span> </span><span>你的D1名称</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>获取已有 Worker<a href="#获取已有-worker"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare</span></div></div><div><div><div>2</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>init</span><span> </span><span>my-worker</span><span> </span><span>--from-dash</span><span> </span><span>你的Worker名称</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>备份 D1<a href="#备份-d1"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>~/cloudflare/my-worker</span></div></div><div><div><div>2</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>export</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--output=./d1-backup.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>SQLite 转 SQL<a href="#sqlite-转-sql"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sqlite3</span><span> </span><span>database.db</span><span> </span><span>".dump"</span><span> &gt; </span><span>database.sql</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>上传 SQL 到 D1<a href="#上传-sql-到-d1"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>检查表<a href="#检查表"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--command=</span><span>"SELECT name FROM sqlite_schema WHERE type='table' ORDER BY name;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>查询数据<a href="#查询数据"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--command=</span><span>"SELECT * FROM users LIMIT 10;"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>部署前检查<a href="#部署前检查"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--dry-run</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>正式部署<a href="#正式部署"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section></section>
<section><h1>二十七、参考资料<a href="#二十七参考资料"><span>#</span></a></h1><ul>
<li><a href="https://github.com/saicaca/fuwari" target="_blank">Fuwari 官方仓库</a></li>
<li><a href="https://github.com/saicaca/fuwari/blob/main/src/content/posts/guide/index.md" target="_blank">Fuwari 官方文章格式说明</a></li>
<li><a href="https://developers.cloudflare.com/workers/wrangler/" target="_blank">Cloudflare Wrangler 官方文档</a></li>
<li><a href="https://developers.cloudflare.com/d1/" target="_blank">Cloudflare D1 官方文档</a></li>
<li><a href="https://developers.cloudflare.com/d1/reference/cli/" target="_blank">Cloudflare D1 导入/执行 SQL</a></li>
<li><a href="https://developers.cloudflare.com/d1/reference/migration-guides/" target="_blank">Cloudflare D1 导入 SQLite 数据</a></li>
<li><a href="https://github.com/termux/proot-distro" target="_blank">Termux PRoot-Distro 官方仓库</a></li>
<li><a href="https://nodejs.org/" target="_blank">Node.js 官方网站</a></li>
</ul><hr /><section><h2>最后记住 4 条命令<a href="#最后记住-4-条命令"><span>#</span></a></h2><p>以后最常用的其实就这几个：</p><section><h3>进入 Ubuntu<a href="#进入-ubuntu"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>proot-distro</span><span> </span><span>login</span><span> </span><span>ubuntu</span><span> </span><span>--shared-home</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>查看 Cloudflare 登录状态<a href="#查看-cloudflare-登录状态"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>whoami</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>上传 D1 SQL<a href="#上传-d1-sql"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>d1</span><span> </span><span>execute</span><span> </span><span>你的D1名称</span><span> </span><span>--remote</span><span> </span><span>--file=./database.sql</span><span> </span><span>--yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>部署 Worker<a href="#部署-worker"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npx</span><span> </span><span>wrangler</span><span> </span><span>deploy</span><span> </span><span>--keep-vars</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>建议第一次操作时严格按照本文顺序执行，不要跳步骤。</strong></p><p>尤其是 D1：<strong>先确认数据库 → 再备份 → 再导入 → 再检查表 → 最后部署 Worker。</strong></p></blockquote></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/cloudreve-worker/</id>
      <title type="text">Cloudreve也能部署到Cloudflare Worker上面了？！</title>
      <published>2026-09-21T00:00:00.000Z</published>
      <updated>2026-09-21T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/cloudreve-worker/"/>
      <summary type="text">Cloudreve-Worker 使用与部署完整指南。需要 R2 存储（开通需绑卡），支持多数据库主备容灾。推荐 fork 仓库后在 Cloudflare 面板手动部署，部署后务必绑定自定义域名。</summary>
      <content type="html"><![CDATA[<p>把 Cloudreve v4 的后端重写为可直接跑在 Cloudflare Workers 上的 TypeScript 实现（不是编译、不是移植）。</p>
<p>本项目<strong>强制依赖 Cloudflare R2</strong> 作为默认存储。R2 目前开通需要绑定银行卡（或信用卡），请提前准备好。免费额度有 10GB 存储 + 每月 100 万次 A 类操作，个人使用基本够用。</p>
<p>数据库推荐使用 Neon（免费档即可），支持主库 + 最多 4 个备库的全量同步容灾。</p>
<hr />
<section><h2>一键部署<a href="#一键部署"><span>#</span></a></h2><p>先去 <a href="https://neon.tech" target="_blank">neon.tech</a> 注册并新建项目，复制首页的 Connection string（<code>postgresql://...</code> 那串）。</p><p>然后点击下方按钮：</p><p><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/LegspCpd/Cloudreve-Worker" target="_blank"></a></p><figure><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/LegspCpd/Cloudreve-Worker" target="_blank"><img src="https://deploy.workers.cloudflare.com/button" alt="Deploy to Cloudflare" /><figcaption>Deploy to Cloudflare</figcaption></a></figure><p></p><p>部署页把 <code>DATABASE_URL</code> 填成上面的连接串，其余默认，点 Deploy。KV 和 R2 会自动创建，建表和初始化在<strong>首次打开站点时自动完成</strong>。</p><p>打开 Worker 地址后注册第一个账号 —— <strong>第一个注册的用户自动成为管理员</strong>。</p><hr /></section>
<section><h2>手动部署（推荐大多数人使用）<a href="#手动部署推荐大多数人使用"><span>#</span></a></h2><p>大多数用户都是先 Fork 仓库，再到 Cloudflare 面板里接上，而不是点一键按钮。流程很简单，全程浏览器操作，不需要克隆到本地。</p><section><h3>1. Fork 仓库<a href="#1-fork-仓库"><span>#</span></a></h3><p>打开 <a href="https://github.com/LegspCpd/Cloudreve-Worker" target="_blank">https://github.com/LegspCpd/Cloudreve-Worker</a>，点击右上角 <strong>Fork</strong>，把仓库 fork 到自己的账号下。</p></section><section><h3>2. 准备 Neon 数据库<a href="#2-准备-neon-数据库"><span>#</span></a></h3><ol>
<li>打开 <a href="https://neon.tech" target="_blank">neon.tech</a>，用 GitHub 登录，新建一个项目。</li>
<li>进入项目后复制 <strong>Connection string</strong>（<code>postgresql://...</code> 开头的那串，带 <code>sslmode=require</code>）。</li>
</ol></section><section><h3>3. 在 Cloudflare 接上仓库<a href="#3-在-cloudflare-接上仓库"><span>#</span></a></h3><ol>
<li>打开 Cloudflare 面板 → <strong>Workers &amp; Pages</strong> → <strong>Create</strong>。</li>
<li>选择你刚 fork 的仓库。</li>
<li>只需要填两格：</li>
</ol>

<table><thead><tr><th>框</th><th>填什么</th></tr></thead><tbody><tr><td><strong>构建命令</strong>（Build command）</td><td><code>npm install</code></td></tr><tr><td><strong>部署命令</strong>（Deploy command）</td><td><code>npm run deploy</code></td></tr></tbody></table><p>输出目录留空。</p><p><code>npm run deploy</code> 会自动处理 KV 和 R2：账号里已有同名资源就直接复用，没有才新建，并把真实 ID 回填，不需要你改 <code>wrangler.toml</code>。</p></section><section><h3>4. 配置环境变量<a href="#4-配置环境变量"><span>#</span></a></h3><p>在项目 <strong>设置 → 环境变量</strong>（或 Workers Builds 的构建环境变量）里添加以下变量，保存后重新部署一次。</p><p>部署脚本会把它们自动写入 Worker 的运行时 Secret。</p>

<table><thead><tr><th>变量</th><th>必填</th><th>说明</th></tr></thead><tbody><tr><td><code>DATABASE_URL</code></td><td>✅</td><td>Neon 主库连接串</td></tr><tr><td><code>SITE_URL</code></td><td>建议</td><td>站点对外地址（部署后填你的域名或 Worker 地址），分享短链 / 下载直链会用到</td></tr><tr><td><code>JWT_SECRET</code></td><td>可选</td><td>令牌签名密钥（32 位以上随机串）。不设会自动生成并入库</td></tr><tr><td><code>FRONTEND_URL</code></td><td>可选</td><td>官方前端默认已随 Worker 一起发布。只有把前端单独部署到别处时才填</td></tr><tr><td><code>ADMIN_EMAIL</code> + <code>ADMIN_PASSWORD</code></td><td>可选</td><td>兜底管理员。两者都配后，Worker 会保证该邮箱存在、密码一致、属于管理员组。用于找回管理员权限，建议存成 Secret</td></tr><tr><td><code>DATABASE_URL_2</code> … <code>DATABASE_URL_5</code></td><td>可选</td><td>备库连接串（另外新建的 Neon 项目）。配了之后每次构建会自动把主库整库全量同步过去，最多 4 个备库</td></tr><tr><td><code>KV_COUNT</code></td><td>可选</td><td>建几个 KV namespace，取值 1–5，默认 1。<strong>必须放在构建能读到的地方</strong>（仓库根目录的 <code>KV_COUNT</code> 文件，或 Workers Builds 的构建环境变量），不要填在「变量和机密」里</td></tr><tr><td><code>DB_FAILOVER</code></td><td>可选</td><td>填 <code>1</code> 打开主库故障切换：主库连不上时自动降级到第一个备库。切换期间写到备库的数据会在下次全量同步时被覆盖，仅作临时应急</td></tr></tbody></table><p>邮件、全文检索、存储策略等全部在<strong>管理后台</strong>配置，不占环境变量。</p></section><section><h3>5. 首次访问 &amp; 管理员<a href="#5-首次访问--管理员"><span>#</span></a></h3><p>部署完成后打开 Worker 地址，注册第一个账号。第一个注册的用户会自动成为管理员。</p><p>如果之后管理员密码丢了，可以在 Worker 设置 → 变量和机密里临时加上 <code>ADMIN_EMAIL</code> + <code>ADMIN_PASSWORD</code>，下一个冷启动会自动恢复，用完记得删掉。</p><hr /></section></section>
<section><h2>部署后请绑定自定义域名<a href="#部署后请绑定自定义域名"><span>#</span></a></h2><p>Cloudflare 自带的 <code>*.workers.dev</code> 域名在国内几乎打不开，挂梯子也经常直接 1101 错误。</p><p>强烈建议绑定自己的域名：</p><ol>
<li>Cloudflare 面板 → 你的 Worker → <strong>设置</strong> → <strong>触发器</strong> / <strong>自定义域</strong>。</li>
<li>添加你的域名（域名最好也托管在 Cloudflare）。</li>
<li>绑定完成后，把环境变量 <code>SITE_URL</code> 改成你的域名地址，再重新部署一次。</li>
</ol><p>绑定域名后访问会稳定很多。</p><hr /><p>仓库地址：<a href="https://github.com/LegspCpd/Cloudreve-Worker" target="_blank">https://github.com/LegspCpd/Cloudreve-Worker</a></p><p>更详细的 CLI 本地部署、多 KV 角色分工、备库同步机制等，见仓库内的 <code>DEPLOY.md</code> 和 <code>README.md</code>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/cf-cname/</id>
      <title type="text">仅需10分钟即可制作出一个Cloudflare的优选域名</title>
      <published>2026-08-21T00:00:00.000Z</published>
      <updated>2026-08-21T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/cf-cname/"/>
      <summary type="text">本文介绍如何通过 DNSPod 按运营商线路划分（电信/联通/移动）配置 CDN 优选 CNAME 或 IP，实现国内网络访问加速。</summary>
      <content type="html"><![CDATA[<p>制作自己的优选域名并不复杂，只需几个简单步骤即可完成。</p>
<section><h2>准备工作<a href="#准备工作"><span>#</span></a></h2><p>在开始之前，你需要准备好以下项：</p><ol>
<li>一个 <strong>DNSPod</strong>（或腾讯云 ESA）账号</li>
<li>一个自己拥有的已解析域名</li>
</ol><p><em>(本教程以 DNSPod 为例进行演示)</em></p><hr /></section>
<section><h2>操作步骤<a href="#操作步骤"><span>#</span></a></h2><section><h3>1. 域名接入<a href="#1-域名接入"><span>#</span></a></h3><p>首先打开 <a href="https://console.cloud.tencent.com/cns" target="_blank">DNSPod控制台</a>。如果你尚未在平台中添加域名，请先将域名添加进控制台并完成 DNS 修改；已添加域名的直接进入下一步。</p><hr /></section><section><h3>三网优化版<a href="#三网优化版"><span>#</span></a></h3><p>你可以寻找针对特定运营商的优化域名（如 Cloudflare 优选），或者使用自己测速筛选出的优选域名/IP。</p><section><h4>步骤一：添加解析记录<a href="#步骤一添加解析记录"><span>#</span></a></h4><p>在域名解析页面点击“添加记录”。</p><p></p><figure><img src="https://hub.legspcpd.top/file/1787267358603_image.png" alt="添加记录" /><figcaption>添加记录</figcaption></figure><p></p></section><section><h4>步骤二：配置 CNAME 与线路分流<a href="#步骤二配置-cname-与线路分流"><span>#</span></a></h4><ol>
<li>将 <strong>记录类型</strong> 修改为 <code>CNAME</code>（若使用优选 IP，则记录类型选择 <code>A</code>）。</li>
<li>填写你需要的主机记录（例如 <code>cf</code> 或 <code>@</code>）。</li>
<li>选择对应的 <strong>线路类型</strong>（如：电信、联通、移动等）。</li>
</ol><p></p><figure><img src="https://hub.legspcpd.top/file/1787267501988_image.png" alt="配置线路类型" /><figcaption>配置线路类型</figcaption></figure><p></p></section><section><h4>步骤三：填写优选域名并保存<a href="#步骤三填写优选域名并保存"><span>#</span></a></h4><ol>
<li>在 <strong>记录值</strong> 处填写获取到的优选域名（或优选 IP）。</li>
</ol><p></p><figure><img src="https://hub.legspcpd.top/file/1787267501988_image.png" alt="填写优选域名" /><figcaption>填写优选域名</figcaption></figure><p></p><ol>
<li>点击“确认”完成保存。</li>
</ol><blockquote><p><strong>⚠️ 注意事项：</strong></p><ul>
<li>如需为其他运营商做单独优化，重复上述步骤并将线路改为对应运营商即可。</li>
<li><strong>必须保留一条“默认”线路</strong>，否则海外或未识别线路的用户将无法正常解析访问。</li>
</ul></blockquote><hr /></section></section><section><h3>2. 连通性与延迟测试<a href="#2-连通性与延迟测试"><span>#</span></a></h3><p>配置完成后，推荐使用 <a href="https://www.itdog.cn/" target="_blank">ITDOG</a> 等网络测试工具，输入配置好的域名，测试三网下的解析节点与延迟表现。</p><p></p><figure><img src="https://hub.legspcpd.top/file/1787267751808_image.png" alt="ITDOG测试效果" /><figcaption>ITDOG测试效果</figcaption></figure><p></p><hr /></section></section>
<section><h2>现成方案（开箱即用）<a href="#现成方案开箱即用"><span>#</span></a></h2><p>如果你不想自行寻找或制作优选域名，可以直接 CNAME 链接至作者提供的优选域名：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cf.choling.cyou</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>直接使用该域名作为 CNAME 记录值即可享受优化线路。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/day/yxdsm/</id>
      <title type="text">有限生命里的无限当下</title>
      <published>2026-05-06T00:00:00.000Z</published>
      <updated>2026-05-06T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/day/yxdsm/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>直到多年以后你才恍然大悟，原来那是最后一次，那天午后，你像往常一样退出了游戏界面，那天傍晚你习惯性的和朋友道了，别，那天深夜妈妈轻轻抱了你一下，遗憾的是没人提醒你，也没有任何征兆，最后一次总是悄然而至，不会张扬，没有预兆，当你再回头已是物是人非，我们总以为时间充以为来日方长，以至于我们常常忽略当下，海德格尔认为人类最大的不同就是我们清楚自己终将死亡，这意味着我们每一次呼吸，每一次相遇都有可能是绝对意义上的最后一次，所以有人把每一次都当做最后一次去珍惜，也有人整日忧心，总在害怕最后一次的到来，但无论是景物还是担忧生活都不会因此停下也许。所谓最后一次在大多数时候并不是故事的终点，而是生命中温柔的提醒，别再沉溺过去的美好，也别把未来想的太远，此刻正在发生的才是我们唯一能抓住的真实朋友，过去的最后一次，你沉入时光，而未来仍有无数的第一次在等待着你，所以请试着放慢脚步，环顾四周，更深的去感受当下的人和事，因为没有人知道这是不是最后一次</p>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/eo-ys/</id>
      <title type="text">EdgeOne优选教程，让EdgeOne在国内更快更稳</title>
      <published>2026-05-04T00:00:00.000Z</published>
      <updated>2026-05-04T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/eo-ys/"/>
      <summary type="text">EdgeOne优选教程，教你如何手动调整DNS解析和路由规则，让腾讯云EdgeOne在国内外访问更快更稳，包含A/AAAA记录优选、边缘函数路由、多IP优选等完整方案。</summary>
      <content type="html"><![CDATA[<section><h4>作者的优选域名<a href="#作者的优选域名"><span>#</span></a></h4><p>EdgeOne: <a href="https://eo.legspcpd.furry.bz/" target="_blank">https://eo.legspcpd.furry.bz/</a>
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/eo1.png" alt="EdgeOne优选域名测速对比" /><figcaption>EdgeOne优选域名测速对比</figcaption></figure>
多IP: <a href="https://e.legspcpd.furry.bz/" target="_blank">https://e.legspcpd.furry.bz/</a>
<figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-cmcc.png" alt="EdgeOne多IP优选域名测速对比" /><figcaption>EdgeOne多IP优选域名测速对比</figcaption></figure><p></p><hr /></section>
<section><h2>什么是优选？<a href="#什么是优选"><span>#</span></a></h2><p>腾讯云 EdgeOne 是腾讯推出的全球边缘加速平台，覆盖国内三大运营商以及海外众多节点。虽然 EdgeOne 官方分配的节点质量已经不错，但在<strong>部分地区、部分运营商网络</strong>下，默认分配的边缘节点访问速度仍然可能不尽如人意，甚至出现跨网绕路的情况。</p><p><strong>优选</strong>，就是通过手动调整 DNS 解析和路由规则，让你的域名解析到国内访问速度更快的 EdgeOne 边缘节点（Anycast IP），从而进一步降低延迟、提升可用性。</p><p>从上面的对比图可以看到，优选过的网站响应速度有明显提升，出口 IP 也变多了。这能让你的网站可用性大大提高，并且加载速度显著变快。</p><p>要实现优选，我们需要做到两点：<strong>自己控制路由规则</strong> 和 <strong>自己控制 DNS 解析</strong>。通过 EdgeOne 的边缘函数（Edge Functions）或自定义路由，我们可以同时实现这两点，下面会详细说明。</p><hr /></section>
<section><h2>优选原理<a href="#优选原理"><span>#</span></a></h2><p>首先我们要知道 CDN 是如何通过不同域名给不同内容服务的。</p><p>我们可以将其抽象为 <strong>2 层：规则层和解析层</strong>。当我们在 EdgeOne 上正常添加一条开启了加速的解析时，EdgeOne 会为我们做两件事：</p><ol>
<li>帮我们写一条 DNS 解析，指向 EdgeOne 的 Anycast 节点</li>
<li>在 EdgeOne 创建一条路由规则，将该域名流量接入边缘网络</li>
</ol><p>如果你想要优选，实际上你是要<strong>手动更改这个 DNS 解析</strong>，使其指向一个更快的 EdgeOne 节点。</p><p>但是，一旦你将加速关掉（去掉 CNAME/解析），路由规则也可能跟着失效，再访问就会显示 DNS 直接指向源站 IP——这就没法用了。</p><p>而 <strong>边缘函数（Edge Functions）</strong> 和 <strong>自定义路由</strong> 的出现改变了这一切：</p><ul>
<li>你可以自己写一条边缘函数路由规则（规则层）</li>
<li>你可以自己写一条 CNAME 解析到优选节点（解析层）</li>
</ul><p>这就是为什么经由边缘函数或自定义路由的流量可以做优选的原因。</p><hr /></section>
<section><h2>选择优选域名<a href="#选择优选域名"><span>#</span></a></h2><p>优选的核心就是选择一个国内访问速度更快的 EdgeOne 节点 IP 或域名。</p><section><h3>传统优选域名<a href="#传统优选域名"><span>#</span></a></h3><p>常用的社区优选域名可以参考：</p><ul>
<li><a href="https://eo.legspcpd.furry.bz/" target="_blank">https://eo.legspcpd.furry.bz/</a>（作者维护）</li>
<li><a href="https://e.legspcpd.furry.bz/" target="_blank">https://e.legspcpd.furry.bz/</a>（多IP版）</li>
</ul><p>这些优选域名通常是通过扫描 EdgeOne 官方 IP 段，找出国内各运营商延迟最低的 IP 整理而成。</p><blockquote><p><strong>提示</strong>：如果你有多个不同运营商的线路需求，多 IP 优选域名通常能提供更好的兼容性，因为不同运营商访问同一 Anycast IP 时可能命中不同的节点。</p></blockquote><hr /></section></section>
<section><h2>各类优选方案<a href="#各类优选方案"><span>#</span></a></h2><section><h3>使用 A/AAAA 记录指向指定 IP<a href="#使用-aaaaa-记录指向指定-ip"><span>#</span></a></h3><p>打开你的 DNS 服务商（腾讯云 DNSPod、阿里云、Cloudflare 等），为你的域名新建一条 A 记录（或 AAAA 记录）。</p><ol>
<li>找一个 EdgeOne 优选 IP（可以参考社区测速结果，或者自己用 ITDOG 测速）</li>
<li>新建 A 记录，<code>记录值</code> 填优选 IP</li>
<li>关闭 DNS 服务商自带的 CDN/代理（因为是直接解析到优选 IP）</li>
</ol><p>然后我们打开 <a href="https://www.itdog.cn/" target="_blank">ITDOG</a> 进行测速，验证解析是否生效、速度是否理想。</p><p>已经解析完毕，可以使用。</p></section><section><h3>使用边缘函数路由（Edge Functions）<a href="#使用边缘函数路由edge-functions"><span>#</span></a></h3><p>如果你有多个域名、多个源站需要同时优选，使用边缘函数会更灵活。</p><p>EdgeOne 的边缘函数与 Cloudflare Workers 类似，你可以编写一个简单的反代函数，根据请求的 Host 头将流量转发到对应的源站，同时让域名解析指向优选节点。</p><p>核心思路：</p><ol>
<li>在 EdgeOne 控制台创建一个边缘函数，根据 <code>Host</code> 头映射目标源站</li>
<li>为你的域名创建一条边缘函数路由</li>
<li>将域名的 DNS 解析指向优选域名（CNAME 到优选节点）</li>
</ol><p>这样规则层（边缘函数）和解析层（DNS）就完全由你自己控制了。</p><blockquote><p><strong>注意</strong>：边缘函数方案请务必测试好回源逻辑，确保源站响应正常后再切换正式流量。</p></blockquote></section><section><h3>多 IP 优选方案<a href="#多-ip-优选方案"><span>#</span></a></h3><p>单 IP 优选在某个运营商线路异常时可能影响访问。多 IP 方案通过在不同运营商线路、不同节点上做解析分流，提升整体可用性：</p><ul>
<li>使用支持<strong>线路解析</strong>的 DNS 服务商（如 DNSPod），针对电信、联通、移动分别解析到不同的优选 IP</li>
<li>或者使用作者提供的多 IP 优选域名（<code>e.legspcpd.furry.bz</code>），由服务端自动做多节点负载</li>
</ul><p>这种方式在运营商网络波动时依然能保持较好的访问体验。</p></section><section><h3>配合 EdgeOne Pages / 静态托管<a href="#配合-edgeone-pages--静态托管"><span>#</span></a></h3><p>如果你使用的是 EdgeOne Pages 托管静态站点：</p><ol>
<li>可以直接将绑定到 Pages 的子域名更改为线路分流解析</li>
<li>也可以将站点迁移到边缘函数方案，配合优选节点使用，效果更灵活</li>
</ol><hr /></section></section>
<section><h2>常见问题<a href="#常见问题"><span>#</span></a></h2><p><strong>Q：优选后我的源站会不会暴露？</strong>
A：不会。优选只是让边缘节点更快地接入，回源请求仍然由边缘节点发起，源站 IP 并不会直接暴露给访客。</p><p><strong>Q：优选 IP 失效了怎么办？</strong>
A：建议定期使用 ITDOG 等工具测速，如果发现某条线路明显变慢，及时更换解析到的优选 IP。多 IP 方案能有效降低单点失效的影响。</p><p><strong>Q：和 Cloudflare 优选有什么区别？</strong>
A：思路完全一致，只是平台不同。EdgeOne 在国内的节点覆盖和接入质量本身就不错，优选能进一步挖掘潜力，尤其适合对延迟敏感的用户。</p><p><strong>Q：可以同时用多个优选方案吗？</strong>
A：可以。比如主域名用边缘函数方案，备用域名用 A 记录方案，相互冗余，可用性更高。</p><hr /></section>
<section><h2>总结<a href="#总结"><span>#</span></a></h2><p>EdgeOne 优选的核心就是<strong>自己控制 DNS 解析 + 自己控制路由规则</strong>：</p><ol>
<li>先选择一个国内访问快的优选节点</li>
<li>通过 A/AAAA 记录、边缘函数或线路解析，将域名解析到优选节点</li>
<li>定期测速、维护，保证长期稳定</li>
</ol><p>希望这篇教程能帮到你的网站加速。如果你有更好的 EdgeOne 优选思路，欢迎在评论区交流。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/cf-ys/</id>
      <title type="text">Cloudflare优选教程，让Cloudflare在国内不再是减速器</title>
      <published>2026-04-19T00:00:00.000Z</published>
      <updated>2026-04-19T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/cf-ys/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<section><h4>作者的优选域名<a href="#作者的优选域名"><span>#</span></a></h4><p>CF: <a href="https://cf.legspcpd.furry.bz/" target="_blank">https://cf.legspcpd.furry.bz/</a>
<img src="https://imghub.legspcpd.indevs.in/file/image/cf.png" alt="" />
真 移动优化: <a href="https://cmcc.legspcpd.furry.bz/" target="_blank">https://cmcc.legspcpd.furry.bz/</a>
<img src="https://imghub.legspcpd.indevs.in/file/image/cf-cmcc.png" alt="" /></p><hr /></section>
<section><h4>什么是优选？<a href="#什么是优选"><span>#</span></a></h4><p>简单来说，优选就是选择一个国内访问速度更快的Cloudflare节点。</p><p>Cloudflare官方分配给我们的IP，在国内访问时延迟往往较高，甚至可能出现无法访问的情况。而通过优选，我们可以手动将域名解析到那些国内访问更快的Cloudflare IP，从而显著提升网站的访问速度和可用性。</p><p>从上面的对比图可以看到，优选过的网站响应速度有很大提升，出口IP也变多了。这能让你的网站可用性大大提高，并且加载速度显著变快。</p><p>要实现优选，我们需要做到两点：自己控制路由规则 和 自己控制DNS解析。通过Cloudflare SaaS或Worker路由，我们可以同时实现这两点，下面会详细说明</p><hr /></section>
<section><h4>优选原理<a href="#优选原理"><span>#</span></a></h4><p>首先我们要知道CDN是如何通过不同域名给不同内容的。</p><p>我们可以将其抽象为2层：规则层和解析层。当我们普通的在Cloudflare添加一条开启了小黄云的解析，Cloudflare会为我们做两件事：</p><p>帮我们写一条DNS解析指向Cloudflare
在Cloudflare创建一条路由规则
如果你想要优选，实际上你是要手动更改这个DNS解析，使其指向一个更快的Cloudflare节点。</p><p>但是，一旦你将小黄云关闭，路由规则也会被删除，再访问就会显示DNS直接指向IP——这就没法用了。</p><p>而SaaS和Worker路由的出现改变了这一切。</p><p>使用SaaS后，Cloudflare不再帮你做这两件事了，这两件事你都可以自己做了：</p><p>1.你可以自己写一条SaaS规则（规则层）
2.你可以自己写一条CNAME解析到优选节点（解析层）</p><p>使用Worker路由同理，你创建Worker路由规则后，DNS解析就可以随便指向任何优选节点了。</p><p>这就是为什么经由SaaS或Worker路由的流量可以做优选的原因。</p><hr /></section>
<section><h1>选择优选域名<a href="#选择优选域名"><span>#</span></a></h1><p>优选的核心就是选择一个国内访问速度更快的Cloudflare节点IP或域名。</p><section><h2>传统优选域名<a href="#传统优选域名"><span>#</span></a></h2><p>常用的社区优选域名：<a href="https://cf.090227.xyz/" target="_blank">https://cf.090227.xyz</a></p><p>这些优选域名通常是通过扫描Cloudflare官方IP段，找出国内延迟最低的IP整理而成。</p><hr /></section></section>
<section><h1>各类优选方案<a href="#各类优选方案"><span>#</span></a></h1><section><h2>更简单的优选方法<a href="#更简单的优选方法"><span>#</span></a></h2><section><h3>使用A/AAAA指向指定IPV4/V6<a href="#使用aaaaa指向指定ipv4v6"><span>#</span></a></h3><p>打开Cloudflare或者其他云平台
新建一个A记录
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-jl.png" alt="cf-jl.png" /><figcaption>cf-jl.png</figcaption></figure>
找一个CF优选IP，我这里拿<strong>104.20.28.171</strong>这个IP做例子
<figure><img src="https://imghub.legspcpd.indevs.in/file/image/ip.png" alt="ip.png" /><figcaption>ip.png</figcaption></figure>
按照这样填写<p></p><p>我们打开ITDOG进行测速
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/itdog-test-ip.png" alt="itdog-test-ip.png" /><figcaption>itdog-test-ip.png</figcaption></figure>
已经解析完毕，可以使用<p></p><hr /></section></section><section><h2>Worker项目优选（最简单）<a href="#worker项目优选最简单"><span>#</span></a></h2><p>接下来编写Worker路由</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 域名前缀映射配置</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>domain_mappings</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>'源站.com'</span><span>:</span><span> </span><span>'最终访问头.'</span><span>,</span></div></div><div><div><div>4</div></div><div><span>//例如：</span></div></div><div><div><div>5</div></div><div><span>//'gitea.072103.xyz': 'gitea.',</span></div></div><div><div><div>6</div></div><div><span>//则你设置Worker路由为gitea.*都将会反代到gitea.072103.xyz</span></div></div><div><div><div>7</div></div><div><span>};</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>addEventListener</span><span>(</span><span>'fetch'</span><span><span>, </span><span>event</span><span> </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>event</span><span>.</span><span>respondWith</span><span>(</span><span>handleRequest</span><span><span>(</span><span>event</span><span>.</span></span><span>request</span><span>));</span></div></div><div><div><div>11</div></div><div><span>});</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>async</span><span> </span><span>function</span><span> </span><span>handleRequest</span><span><span>(</span><span>request</span><span>) {</span></span></div></div><div><div><div>14</div></div><div><span>  </span><span>const</span><span> </span><span>url</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>URL</span><span><span>(</span><span>request</span><span>.</span></span><span>url</span><span>);</span></div></div><div><div><div>15</div></div><div><span>  </span><span>const</span><span> </span><span>current_host</span><span> </span><span>=</span><span><span> </span><span>url</span><span>.</span></span><span>host</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>  </span><span>// 强制使用 HTTPS</span></div></div><div><div><div>18</div></div><div><span>  </span><span>if</span><span><span> (</span><span>url</span><span>.</span></span><span>protocol</span><span> </span><span>===</span><span> </span><span>'http:'</span><span>) {</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>url</span><span>.</span><span>protocol</span><span> </span><span>=</span><span> </span><span>'https:'</span><span>;</span></div></div><div><div><div>20</div></div><div><span>    </span><span>return</span><span><span> </span><span>Response</span><span>.</span></span><span>redirect</span><span><span>(</span><span>url</span><span>.</span></span><span>href</span><span>, </span><span>301</span><span>);</span></div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>  </span><span>const</span><span> </span><span>host_prefix</span><span> </span><span>=</span><span> </span><span>getProxyPrefix</span><span><span>(</span><span>current_host</span><span>);</span></span></div></div><div><div><div>24</div></div><div><span>  </span><span>if</span><span> (</span><span>!</span><span><span>host_prefix</span><span>) {</span></span></div></div><div><div><div>25</div></div><div><span>    </span><span>return</span><span> </span><span>new</span><span> </span><span>Response</span><span>(</span><span>'Proxy prefix not matched'</span><span>, { </span><span>status</span><span>:</span><span> </span><span>404</span><span> });</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>  </span><span>// 查找对应目标域名</span></div></div><div><div><div>29</div></div><div><span>  </span><span>let</span><span><span> </span><span>target_host</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>30</div></div><div><span>  </span><span>for</span><span> (</span><span>const</span><span> [</span><span>origin_domain</span><span>, </span><span>prefix</span><span>] </span><span>of</span><span><span> </span><span>Object</span><span>.</span></span><span>entries</span><span><span>(</span><span>domain_mappings</span><span>)) {</span></span></div></div><div><div><div>31</div></div><div><span>    </span><span>if</span><span><span> (</span><span>host_prefix</span><span> </span></span><span>===</span><span><span> </span><span>prefix</span><span>) {</span></span></div></div><div><div><div>32</div></div><div><span><span>      </span></span><span>target_host</span><span> </span><span>=</span><span><span> </span><span>origin_domain</span><span>;</span></span></div></div><div><div><div>33</div></div><div><span>      </span><span>break</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>  </span><span>if</span><span> (</span><span>!</span><span><span>target_host</span><span>) {</span></span></div></div><div><div><div>38</div></div><div><span>    </span><span>return</span><span> </span><span>new</span><span> </span><span>Response</span><span>(</span><span>'No matching target host for prefix'</span><span>, { </span><span>status</span><span>:</span><span> </span><span>404</span><span> });</span></div></div><div><div><div>39</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>  </span><span>// 构造目标 URL</span></div></div><div><div><div>42</div></div><div><span>  </span><span>const</span><span> </span><span>new_url</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>URL</span><span><span>(</span><span>request</span><span>.</span></span><span>url</span><span>);</span></div></div><div><div><div>43</div></div><div><span><span>  </span></span><span>new_url</span><span>.</span><span>protocol</span><span> </span><span>=</span><span> </span><span>'https:'</span><span>;</span></div></div><div><div><div>44</div></div><div><span><span>  </span></span><span>new_url</span><span>.</span><span>host</span><span> </span><span>=</span><span><span> </span><span>target_host</span><span>;</span></span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>  </span><span>// 创建新请求</span></div></div><div><div><div>47</div></div><div><span>  </span><span>const</span><span> </span><span>new_headers</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Headers</span><span><span>(</span><span>request</span><span>.</span></span><span>headers</span><span>);</span></div></div><div><div><div>48</div></div><div><span><span>  </span></span><span>new_headers</span><span>.</span><span>set</span><span>(</span><span>'Host'</span><span><span>, </span><span>target_host</span><span>);</span></span></div></div><div><div><div>49</div></div><div><span><span>  </span></span><span>new_headers</span><span>.</span><span>set</span><span>(</span><span>'Referer'</span><span><span>, </span><span>new_url</span><span>.</span></span><span>href</span><span>);</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>  </span><span>try</span><span> {</span></div></div><div><div><div>52</div></div><div><span>    </span><span>const</span><span> </span><span>response</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>fetch</span><span><span>(</span><span>new_url</span><span>.</span></span><span>href</span><span>, {</span></div></div><div><div><div>53</div></div><div><span>      </span><span>method</span><span>:</span><span><span> </span><span>request</span><span>.</span></span><span>method</span><span>,</span></div></div><div><div><div>54</div></div><div><span>      </span><span>headers</span><span>:</span><span><span> </span><span>new_headers</span><span>,</span></span></div></div><div><div><div>55</div></div><div><span>      </span><span>body</span><span>:</span><span><span> </span><span>request</span><span>.</span></span><span>method</span><span> </span><span>!==</span><span> </span><span>'GET'</span><span> </span><span>&amp;&amp;</span><span><span> </span><span>request</span><span>.</span></span><span>method</span><span> </span><span>!==</span><span> </span><span>'HEAD'</span><span> </span><span>?</span><span><span> </span><span>request</span><span>.</span></span><span>body</span><span> </span><span>:</span><span> </span><span>undefined</span><span>,</span></div></div><div><div><div>56</div></div><div><span>      </span><span>redirect</span><span>:</span><span> </span><span>'manual'</span></div></div><div><div><div>57</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span>    </span><span>// 复制响应头并添加CORS</span></div></div><div><div><div>60</div></div><div><span>    </span><span>const</span><span> </span><span>response_headers</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Headers</span><span><span>(</span><span>response</span><span>.</span></span><span>headers</span><span>);</span></div></div><div><div><div>61</div></div><div><span><span>    </span></span><span>response_headers</span><span>.</span><span>set</span><span>(</span><span>'access-control-allow-origin'</span><span>, </span><span>'*'</span><span>);</span></div></div><div><div><div>62</div></div><div><span><span>    </span></span><span>response_headers</span><span>.</span><span>set</span><span>(</span><span>'access-control-allow-credentials'</span><span>, </span><span>'true'</span><span>);</span></div></div><div><div><div>63</div></div><div><span><span>    </span></span><span>response_headers</span><span>.</span><span>set</span><span>(</span><span>'cache-control'</span><span>, </span><span>'public, max-age=600'</span><span>);</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>response_headers</span><span>.</span><span>delete</span><span>(</span><span>'content-security-policy'</span><span>);</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>response_headers</span><span>.</span><span>delete</span><span>(</span><span>'content-security-policy-report-only'</span><span>);</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>    </span><span>return</span><span> </span><span>new</span><span> </span><span>Response</span><span><span>(</span><span>response</span><span>.</span></span><span>body</span><span>, {</span></div></div><div><div><div>68</div></div><div><span>      </span><span>status</span><span>:</span><span><span> </span><span>response</span><span>.</span></span><span>status</span><span>,</span></div></div><div><div><div>69</div></div><div><span>      </span><span>statusText</span><span>:</span><span><span> </span><span>response</span><span>.</span></span><span>statusText</span><span>,</span></div></div><div><div><div>70</div></div><div><span>      </span><span>headers</span><span>:</span><span><span> </span><span>response_headers</span></span></div></div><div><div><div>71</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>72</div></div><div><span><span>  </span></span><span>} </span><span>catch</span><span><span> (</span><span>err</span><span>) {</span></span></div></div><div><div><div>73</div></div><div><span>    </span><span>return</span><span> </span><span>new</span><span> </span><span>Response</span><span>(</span><span>`Proxy Error: </span><span>${</span><span>err</span><span>.</span><span>message</span><span>}</span><span>`</span><span>, { </span><span>status</span><span>:</span><span> </span><span>502</span><span> });</span></div></div><div><div><div>74</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>75</div></div><div><span>}</span></div></div><div><div><div>76</div></div><div>
</div></div><div><div><div>77</div></div><div><span>function</span><span> </span><span>getProxyPrefix</span><span><span>(</span><span>hostname</span><span>) {</span></span></div></div><div><div><div>78</div></div><div><span>  </span><span>for</span><span> (</span><span>const</span><span> </span><span>prefix</span><span> </span><span>of</span><span><span> </span><span>Object</span><span>.</span></span><span>values</span><span><span>(</span><span>domain_mappings</span><span>)) {</span></span></div></div><div><div><div>79</div></div><div><span>    </span><span>if</span><span><span> (</span><span>hostname</span><span>.</span></span><span>startsWith</span><span><span>(</span><span>prefix</span><span>)) {</span></span></div></div><div><div><div>80</div></div><div><span>      </span><span>return</span><span><span> </span><span>prefix</span><span>;</span></span></div></div><div><div><div>81</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>82</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>83</div></div><div><span>  </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>84</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>创建路由:
<img src="https://imghub.legspcpd.indevs.in/file/image/cf-ly.png" alt="" />
像这样
<img src="https://imghub.legspcpd.indevs.in/file/image/cf-lytx.png" alt="" /></p><hr /><p><strong>(SaaS将会引用二叉树树的教程)</strong></p></section></section>
<section><h1>传统SaaS优选<a href="#传统saas优选"><span>#</span></a></h1><section><h3>SaaS做了什么？<a href="#saas做了什么"><span>#</span></a></h3><p>Cloudflare SaaS是一个不需要你改变一个域名的NS服务器，就可以让其受益于Cloudflare网络的功能。</p><p>当一个域名被SaaS到一个已经在Cloudflare的域名后，它就完整受益所有Cloudflare服务。如我将 umami.acofork.com SaaS 到 2x.nz，我就可以在 2x.nz 里为 umami.acofork.com 写规则了：
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-saas-1.webp" alt="cf-saas-1.webp" /><figcaption>cf-saas-1.webp</figcaption></figure>
<figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-saas-2.webp" alt="cf-saas-2.webp" /><figcaption>cf-saas-2.webp</figcaption></figure>
<figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-saas-3.webp" alt="cf-saas-3.webp" /><figcaption>cf-saas-3.webp</figcaption></figure>
Worker中的路由规则也适用：
<figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-saas-4.webp" alt="cf-saas-4.webp" /><figcaption>cf-saas-4.webp</figcaption></figure><p></p><p>SaaS优选步骤
简单易懂（pro.yourdomain.com 是最终访问域名）： CF SaaS DNS origin.yourdomain.com -&gt; 源站开小黄云 cdn.yourdomain.com -&gt; cf优选域名 pro.yourdomain.com -&gt; cdn.yourdomain.com</p><p>CF SaaS 添加自定义主机名pro.yourdomain.com 源站为origin.yourdomain.com</p><p>警告
Cloudflare最近将新接入的域名SSL默认设为了完全，记得将 SSL 改为灵活。</p></section><section><h3>准备工作<a href="#准备工作"><span>#</span></a></h3><p>我们需要一个域名或两个域名（单域名直接用子域名即可。双域名比如：onani.cn和acofork.cn）。</p><p>如果在同一CF账号下不可用，请尝试将俩域名放置在不同账号</p><p>这里我们让onani.cn成为主力域名，让acofork.cn成为辅助域名。</p><p>单域名效果：
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-fastip-1.webp" alt="cf-fastip-1.webp" /><figcaption>cf-fastip-1.webp</figcaption></figure><p></p><p>具体步骤
首先新建一个DNS解析，指向你的源站，开启cf代理
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/c94c34ee262fb51fb5697226ae0df2d804bf76fe.webp" alt="c94c34ee262fb51fb5697226ae0df2d804bf76fe.webp" /><figcaption>c94c34ee262fb51fb5697226ae0df2d804bf76fe.webp</figcaption></figure><p></p><p>前往辅助域名的 SSL/TLS -&gt; 自定义主机名。设置回退源为你刚才的DNS解析的域名：xlog.acofork.cn（推荐 HTTP 验证）</p><p>点击添加自定义主机名。设置一个自定义主机名，比如 onani.cn，然后选择自定义源服务器，填写第一步的域名，即 xlog.acofork.cn。</p><p>如果你想要创建多个优选也就这样添加，一个自定义主机名对应一个自定义源服务器。如果你将源服务器设为默认，则源服务器是回退源指定的服务器，即 xlog.acofork.cn</p><p></p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/f6170f009c43f7c6bee4c2d29e2db7498fa1d0dc.webp" alt="f6170f009c43f7c6bee4c2d29e2db7498fa1d0dc.webp" /><figcaption>f6170f009c43f7c6bee4c2d29e2db7498fa1d0dc.webp</figcaption></figure><p></p><p>继续在你的辅助域名添加一条解析。CNAME到优选节点：如cloudflare.182682.xyz，不开启cf代理
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/4f9f727b0490e0b33d360a2363c1026003060b29.webp" alt="4f9f727b0490e0b33d360a2363c1026003060b29.webp" /><figcaption>4f9f727b0490e0b33d360a2363c1026003060b29.webp</figcaption></figure><p></p><p>最后在你的主力域名添加解析。域名为之前在辅助域名的自定义主机名（onani.cn），目标为刚才的cdn.acofork.cn，不开启cf代理
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/6f51cb2a42140a9bf364f88a5715291be616a254.webp" alt="6f51cb2a42140a9bf364f88a5715291be616a254.webp" /><figcaption>6f51cb2a42140a9bf364f88a5715291be616a254.webp</figcaption></figure><p></p><p>优选完毕，确保优选有效后尝试访问
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-fastip-10.webp" alt="cf-fastip-10.webp" /><figcaption>cf-fastip-10.webp</figcaption></figure><p></p><p>（可选）你也可以将cdn子域的NS服务器更改为阿里云\华为云\腾讯云云解析做线路分流解析</p><p>优选工作流：用户访问 -&gt; 由于最终访问的域名设置了CNAME解析，所以实际上访问了cdn.acofork.cn，并且携带 源主机名：onani.cn -&gt; 到达优选域名进行优选 -&gt; 优选结束，cf边缘节点识别到了携带的 源主机名：onani.cn 查询发现了回退源 -&gt; 回退到回退源内容（xlog.acofork.cn） -&gt; 访问成功</p><hr /></section></section>
<section><h1>针对于Cloudflare Page<a href="#针对于cloudflare-page"><span>#</span></a></h1><ol>
<li>
<p>你可以直接将你绑定到Page的子域名直接更改NS服务器到阿里云\华为云\腾讯云云解析做线路分流解析</p>
</li>
<li>
<p>将您的Page项目升级为Worker项目，使用Worker优选方案（更简单）。详细方法见：【CF Page一键迁移到Worker？好处都有啥？-哔哩哔哩】 <a href="https://www.bilibili.com/video/BV1wBTEzREcb" target="_blank">https://www.bilibili.com/video/BV1wBTEzREcb</a></p>
</li>
</ol><hr /></section>
<section><h1>针对于Cloudflare Workers<a href="#针对于cloudflare-workers"><span>#</span></a></h1><ol>
<li>
<p>在Workers中添加路由，然后直接将你的路由域名从指向xxx.worker.dev改为优选域名即可</p>
</li>
<li>
<p>如果是外域，SaaS后再添加路由即可，就像：
</p><figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-fastip-12.webp" alt="cf-fastip-12.webp" /><figcaption>cf-fastip-12.webp</figcaption></figure>
<figure><img src="https://imghub.legspcpd.indevs.in/file/image/cf-fastip-13.webp" alt="cf-fastip-13.webp" /><figcaption>cf-fastip-13.webp</figcaption></figure><p></p>
</li>
</ol><hr /></section>
<section><h1>针对于使用了各种CF规则的网站<a href="#针对于使用了各种cf规则的网站"><span>#</span></a></h1><p>你只需要让规则针对于你的 <strong>最终访问域名</strong> ，因为CF的规则是看主机名的，而不是看是由谁提供的。</p></section>
<section><h1>针对于虚拟主机<a href="#针对于虚拟主机"><span>#</span></a></h1><p>保险起见，建议将源站和优选域名同时绑定到你的虚拟主机，保证能通再一个个删。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/day/</id>
      <title type="text">日记</title>
      <published>1997-05-06T00:00:00.000Z</published>
      <updated>1997-05-06T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/day/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>感觉有点累啊…</p>
<hr />
<p>推荐歌曲:</p>
<p>Zeraphym - Lifeline
这首歌对我心灵造成的震撼，使我无法用语言来描述，因为我不觉得世界上有哪个词能形容这首歌的完美！！！</p>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/guide/firefly-wiki-link/</id>
      <title type="text">Firefly Wiki Link 内部链接示例</title>
      <published>1970-01-03T00:00:00.000Z</published>
      <updated>1970-01-03T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/guide/firefly-wiki-link/"/>
      <summary type="text">在 Firefly 文章中使用 Obsidian 风格的 Wiki Link 内部链接，并自动生成文章链接卡片。</summary>
      <content type="html"><![CDATA[<p>Firefly 支持在 Markdown、MDX 文章中使用 Obsidian 风格的 Wiki Link 内部链接。链接目标填写文章的 slug 或文件路径，都不需要包含扩展名，具体匹配规则见下文「链接目标的三种写法」。</p>
<section><h2>文章链接卡片<a href="#文章链接卡片"><span>#</span></a></h2><p><code>[[slug]]</code> 单独成段时，会自动读取目标文章的标题、描述、发布时间、分类、标签和封面，渲染为链接卡片：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>firefly</span><span>]</span><span>]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[</span><span>[</span><span>guide/index</span><span>]</span><span>]</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[</span><span>[</span><span>markdown-extended</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><a href="/posts/firefly/">firefly</a></p><p><a href="/posts/guide/">guide/index</a></p><p><a href="/posts/markdown-extended/">markdown-extended</a></p></section>
<section><h2>行内链接<a href="#行内链接"><span>#</span></a></h2><p><code>[[slug]]</code> 出现在正文中间时，渲染为普通链接，链接文字自动使用目标文章的标题</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>请参阅 [</span><span>[</span><span>firefly</span><span>]</span><span>] 了解主题特性。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>请参阅 <a href="/posts/firefly/">firefly</a> 了解主题特性。</p></section>
<section><h2>自定义显示标题<a href="#自定义显示标题"><span>#</span></a></h2><p>在 <code>|</code> 后填写链接的显示文字。行内链接会用它替换文章标题；单独成段时依然渲染为卡片，卡片标题使用自定义文字，描述、时间、分类、标签和封面仍然读取目标文章：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>请参阅 [</span><span>[</span><span>firefly|主题介绍</span><span>]</span><span>] 了解主题特性。</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[[firefly|Firefly 主题介绍]]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>请参阅 <a href="/posts/firefly/">主题介绍</a> 了解主题特性。</p><p><a href="/posts/firefly/">Firefly 主题介绍</a></p><p>一个例外：如果 <code>|</code> 后的文字只是把链接目标又抄了一遍（<code>[[guide/index|index]]</code>），会被当作无效别名忽略，仍然显示文章标题。Obsidian 在插入的链接时会自动补上这样的别名，避免笔记里显示一长串路径，这个例外就是为它准备的。</p></section>
<section><h2>链接目标的三种写法<a href="#链接目标的三种写法"><span>#</span></a></h2><p>用 Obsidian 管理文章时，把 <code>src/content/posts</code> 目录本身作为 Obsidian 仓库（vault）打开。下文提到的「仓库根目录」都指这个目录，它正好也是 Firefly 解析链接路径的起点。</p><p>链接目标按以下顺序匹配：</p>

<table><thead><tr><th>写法</th><th>示例</th><th>在 Obsidian 中</th></tr></thead><tbody><tr><td>frontmatter 的 <code>slug</code></td><td><code>[[firefly-wiki-link]]</code></td><td>✗ 不支持</td></tr><tr><td>文件路径（相对仓库根目录）</td><td><code>[[guide/firefly-layout-system]]</code></td><td>✓ 需改设置（推荐）</td></tr><tr><td>裸文件名（仓库内唯一时）</td><td><code>[[firefly-layout-system]]</code></td><td>✓ 默认即是</td></tr></tbody></table><section><h3>第一种：slug<a href="#第一种slug"><span>#</span></a></h3><p><code>slug</code> 写法在 Obsidian 中不支持，<code>slug</code> 是 Firefly 自己的概念，Obsidian 不读取 frontmatter 里的 <code>slug</code>，所以按 slug 写的链接在 Obsidian 里既不会自动补全，也点不动，只有构建出的站点上能正常跳转。如果你主要在 Obsidian 里写作，用下面两种写法。</p></section><section><h3>第二种：文件路径（推荐）<a href="#第二种文件路径推荐"><span>#</span></a></h3><p>文件路径写法需要改 Obsidian 设置，在 <code>设置 → 文件与链接 → 链接 → 内部链接类型</code> 中选择<strong>基于仓库根目录的绝对路径</strong>，Obsidian 插入的链接才会带上目录：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>guide/firefly-layout-system|firefly-layout-system</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><a href="/posts/guide/firefly-layout-system/">guide/firefly-layout-system</a></p><p>因为仓库根目录就是 <code>src/content/posts</code>，Obsidian 写出的这个路径和 Firefly 需要的路径完全一致，不需要任何额外转换。</p><p>上面这行末尾的 <code>|firefly-layout-system</code> 是 Obsidian 自动补的别名，Firefly 会忽略它，卡片标题仍然取文章的 title，除非你把它修改和文件名不一致，才会变成你修改后的别名。</p><p>内部链接类型下拉框里的<strong>基于当前笔记的相对路径</strong>只在同目录内可用：它给同目录文章生成的是裸文件名，能正常匹配；但跨目录时会生成 <code>../</code> 前缀，Firefly 无法解析，链接会按原文显示。</p></section><section><h3>第三种：裸文件名<a href="#第三种裸文件名"><span>#</span></a></h3><p>「内部链接类型」的默认值就是<strong>尽可能简短的形式</strong>：只要文件名在整个仓库里唯一，Obsidian 插入的链接就只有文件名，不带目录。这种写法不需要改任何设置，效果和写完整路径完全一致：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>firefly-layout-system</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><a href="/posts/firefly-layout-system/">firefly-layout-system</a></p><p>文件名重名时这种写法会失效，构建日志里会给出提示，改用完整文件路径即可，所以推荐直接修改 Obsidian 内部链接类型设置为<strong>基于仓库根目录的绝对路径</strong>，使用第二种文件路径写法，一劳永逸</p></section></section>
<section><h2>链接到其他文章的标题<a href="#链接到其他文章的标题"><span>#</span></a></h2><p>在文章 slug 后添加 <code>#标题</code>。带标题锚点的链接始终渲染为普通链接：</p><p><a href="/posts/code-examples/#%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE">查看代码块语法高亮</a></p><p><a href="/posts/guide/firefly-layout-system/#%E7%9B%B8%E5%85%B3%E9%93%BE%E6%8E%A5">guide/firefly-layout-system#相关链接#相关链接</a></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>code-examples#语法高亮|查看代码块语法高亮</span><span>]</span><span>]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[</span><span>[</span><span>guide/firefly-layout-system#相关链接|firefly-layout-system</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>标题锚点使用与页面标题相同的 slug 规则，因此中文、空格和大小写都会按页面实际生成的 ID 处理。</p></section>
<section><h2>链接到本页标题<a href="#链接到本页标题"><span>#</span></a></h2><p>省略文章 slug，只填写标题即可链接到当前文章：</p><p><a href="#%E6%9C%AC%E9%A1%B5%E7%9B%AE%E6%A0%87">跳转到本页目标</a></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>#本页目标|跳转到本页目标</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>本页目标<a href="#本页目标"><span>#</span></a></h2><p>这是本页 Wiki Link 指向的标题。</p></section>
<section><h2>不支持附件嵌入<a href="#不支持附件嵌入"><span>#</span></a></h2><p>附件嵌入语法目前不会被转换，会按原文显示：</p><p>![[image.png]]</p><p>行内代码和代码块中的 <code>[[firefly]]</code> 也不会被转换。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/markdown-plantuml/</id>
      <title type="text">Markdown PlantUML 图表</title>
      <published>1970-01-01T00:00:00.000Z</published>
      <updated>1970-01-01T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/markdown-plantuml/"/>
      <summary type="text">用于验证 Firefly 中 PlantUML 插件渲染、主题切换与交互能力的示例文章。</summary>
      <content type="html"><![CDATA[<section><h2>Markdown 中 PlantUML 图表指南<a href="#markdown-中-plantuml-图表指南"><span>#</span></a></h2><p>PlantUML 是一种使用纯文本描述图表的工具。你只需要写一段结构化语法，就可以生成时序图、类图、用例图、活动图等常见工程图。</p><p>它特别适合写在技术博客和项目文档里：</p><ul>
<li>图表和正文一起版本管理，便于协作与审阅</li>
<li>修改图只需要改文本，适合频繁迭代</li>
<li>能和 Markdown 无缝结合，保持文档统一</li>
</ul><p>在 Firefly 中，<code>plantuml</code> 代码块会在构建阶段编码并生成服务器 SVG 地址，页面端再根据亮暗主题自动切换图源，并支持缩放、拖拽和全屏交互。</p><p>如果你想快速上手，可以记住这个最小模板：</p><div><div><img alt="@startuml
Alice -&gt; Bob: Hello
Bob --&gt; Alice: Hi
@enduml" src="https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuNBCoKnELT2rKt3AJx9Iy4ZDoSddSifFKj3LjLC0orafU6HoEQJcfPJcvW00" loading="lazy" /></div></div></section>
<section><h2>活动图示例<a href="#活动图示例"><span>#</span></a></h2><div><div><img alt="@startuml
start
:用户提交订单;
if (库存充足?) then (是)
	:冻结库存;
	:创建支付单;
	if (支付成功?) then (是)
		:生成发货单;
		:通知仓库拣货;
	else (否)
		:取消订单;
		:释放库存;
	endif
else (否)
	:提示缺货;
endif
stop
@enduml" src="https://www.plantuml.com/plantuml/svg/NOuz2i9048NhtLEaZ5VO57eLmHM56CN4taODYYHYbA15mFz6BHI5ZNYQp6oyXMI38dRpcFTzl9BjbDjEfs5ITL0cWmEwT_JyH6pIqmh6CuFMgveEOWh747gzz7Of5ZIdnYrDn_1Se8H1FvRnD6yOMNQN40iCpaaSAW7937b6ruTXz6SWJ0PHzl4cwNMV8uIzkWiPRHDbnj4wlUuDIhXfSqq7VwSmyEPuSpyxCsOmnE3vdSAjIhrAVnc6dYytGZw4ykK5sscsQ8bRbKx3V0C0" loading="lazy" /></div></div></section>
<section><h2>状态图示例<a href="#状态图示例"><span>#</span></a></h2><div><div><img alt="@startuml
[*] --&gt; 草稿

草稿 --&gt; 待审核 : 提交
待审核 --&gt; 草稿 : 驳回
待审核 --&gt; 已发布 : 审核通过
已发布 --&gt; 已归档 : 到期归档
已发布 --&gt; 草稿 : 撤回修改

state 已发布 {
	[*] --&gt; 可见
	可见 --&gt; 隐藏 : 手动隐藏
	隐藏 --&gt; 可见 : 恢复展示
}

已归档 --&gt; [*]
@enduml" src="https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuOhMYbNGrRLJUD7R-Np5VYuk20qMUhglzUcwXSyMx52mKdZMF-79hYLS22647WKhXPShDp-TFGzDzkdsJK_x9pxTqQnWfG0HVjamwyN-TYw414pPtadF5Yu6AUlOy6pEV0WNJHdShcUJbZoTFU_9_dNFfkpauYekIIn9HRAgceiJvgEd_UjVB6_aueJGOA6NioQycDuFCgIp-sdN2WYNYnCgZD04Kj6uwEcItgSRfpvViekhbeiBuKoGicYjM2w7rBoKqjmS0000" loading="lazy" /></div></div></section>
<section><h2>用例图示例<a href="#用例图示例"><span>#</span></a></h2><div><div><img alt="@startuml
left to right direction
actor 游客
actor 用户
actor 管理员

rectangle 博客系统 {
	usecase &quot;浏览文章&quot; as UC1
	usecase &quot;搜索内容&quot; as UC2
	usecase &quot;发表评论&quot; as UC3
	usecase &quot;点赞收藏&quot; as UC4
	usecase &quot;审核评论&quot; as UC5
	usec" src="https://www.plantuml.com/plantuml/svg/PP3BJi9058RNdASuOSz2Raj3uZFm09CoOfFI9krqPTm88XjJI8WQGv1s8ud9i02qoFFCvJ6CCf8EBh_pvJyvvsz5Z8GixddWqKk6BC3GxLunxBWXTPWR-40S5eGeyrpmp82QBkNeymzugiP3CNa6-8aGl-jH50ylWcTglLVxLxo6KXnHXqGKotARwBUHVBnNxuioaWZR5sT5FPwfJIQ6TuBlZAuMj4WcEbtgrK3pBwDh1QrkTtexbzCF_PGONI-cUIeNkPLksCj5thTEQy8DmE5rh5JEVu-ri0g7BexMmXDRix4En-hCfF5lqeGMzJjnp_i6" loading="lazy" /></div></div></section>
<section><h2>组件图示例<a href="#组件图示例"><span>#</span></a></h2><div><div><img alt="@startuml
package &quot;Firefly Site&quot; {
	[Astro App] as App
	[Markdown Parser] as Parser
	[PlantUML Encoder] as Encoder
	[Theme Switcher] as Theme
	[Search Indexer] as Search
}

cloud &quot;PlantUML Server&quot; as " src="https://www.plantuml.com/plantuml/svg/JL51QiCm43nxNp7u7dht8IIK5WeD15oVJ0-oj8sDPKcLvAIbzEz5YX9wqZ2pxCoiTY4A7zT5anDo5YT6_Jnv_j3VQAV8DNwewlSXUekzS-yG8RrKzGVXPsKl1aVX0_kiN25L_L4B4xl3AvwCjAge1LFLlusyCDhB5ELOn4nHrRSil1pnOXH_5UbAqI-Hr7PLgE_RM_PdzdMsxaY9A0OH6FMZDP5DH1kjvomNXcZl73QRROcA1Yu1BAKD5JwDbBnem1d19TzrqHYqbNEWsq3Urw61vy-LGqGud-v6rwuDGcuB9VpyeAVJ616yl4-LsWs6TT8ABdt4b6xmFz2jLZ8I2iw666Z7HgsB_WC0" loading="lazy" /></div></div></section>
<section><h2>部署图示例<a href="#部署图示例"><span>#</span></a></h2><div><div><img alt="@startuml
node &quot;User Device&quot; {
	artifact &quot;Browser&quot;
}

node &quot;CDN / Edge&quot; {
	artifact &quot;Static Assets&quot;
}

node &quot;Cloudflare Worker&quot; {
	artifact &quot;SSR Handler&quot;
}

node &quot;PlantUML Service&quot; {
	artifact &quot;SVG Re" src="https://www.plantuml.com/plantuml/svg/ROz1Jy9044RFxg_uqZlfdOD1WS11r53Hyz2TraAxYpDJE1Z_kqb3J6azxtkpxvkfaLZRr2v4pqXsoe85dwkS4toxEnAh2ieDoQF4Yx8axiTTsVdY6IcMlXoYcP5LEHvKsRGlrB7rHKt2-8XoP1bwsHPh2hw--UQrfc2xpHCobd-wilSLjXmyozNoPBGdPIGl-mFdXioYq2XoGtBqyH8mZy4uMEV-hSHaSZySWYbMopSSDCrLqwefHtYl7rC8VxMiXXELx6uVEtnKq3daSOfgezlzcPYYOCi_uIigXHhekNGp3hvjwby0" loading="lazy" /></div></div></section>
<section><h2>ER 图示例<a href="#er-图示例"><span>#</span></a></h2><div><div><img alt="@startuml
entity User {
	*id : uuid &lt;&lt;PK&gt;&gt;
	--
	username : varchar
	email : varchar
	created_at : datetime
}

entity Post {
	*id : uuid &lt;&lt;PK&gt;&gt;
	--
	author_id : uuid &lt;&lt;FK&gt;&gt;
	title : varchar
	content : " src="https://www.plantuml.com/plantuml/svg/VP2x2W9134NhoLUa5lO71X51iB6niPRiJc07vY6JZ0_KVvTTKHGVRKwIavkvA1MjCG0dzNh2ZN31CvY9TsYnLkzmEbslPZCmJGEc2fT4aT7YdahNKm73aNnuBNI5ITbjIT6Y8sNraU4A3ySwY_vnKDK-b-qhN8vGlOOtSvUJSXeioaS5iwjjyDB_KIzoZCF4R_ikYtvn3y6_bDliJa_zpzpZKo-NfiddUtYBX-ALvOqyRhDuNoGmzdxGdWJcd5oDuGO0" loading="lazy" /></div></div></section>
<section><h2>时序图示例（登录与刷新令牌）<a href="#时序图示例登录与刷新令牌"><span>#</span></a></h2><div><div><img alt="@startuml
autonumber
actor User as 用户
participant Web as 前端页面
participant API as 网关接口
participant Auth as 认证服务
database Redis as 会话缓存

用户 -&gt; 前端页面 : 输入账号密码并提交
前端页面 -&gt; 网关接口 : POST /login
网关接口 -&gt; 认证服务 : " src="https://www.plantuml.com/plantuml/svg/bP3BJi9068NtynJ_thGIbrqqk7GbyHANPYYZ4A4bxVG1M70D5GrAn42u2CPee2HUY0BwCioql8L1t0ma1jVVEJFVVu8MnIQr4t64RMheTY9CJ8GrQfXmQ14Ji0NUrGFF3L4IcpIcnP9Oft14mdF2yextvCvQhxDwM-3RePsVvkIIfP_vUPULxaHkq-WyuFSxlflYDOSLMYY2AGvZYy0UYSIiEPwERtstxetBh7U3qC8395Nu5nJmFyiitVLVxbbfoDoCrqonzpTUkfX-T90GbLH12HG8xUuVm6RSE8tfI42IAiY10hpPcZqMMRR7dJuIcAGAfg00orHPkWicEJ695JscnXdHbpghBbZJY6Kjmh2nL1RbLZVO2WJ0guxOv9hdBbYXWP0io-AJ_bUMrneWop9QRvPVW_M6-VFObO7yIPyxxNyEn2i3uQArHk6LmNJKyV9552Hwn4x4lm40" loading="lazy" /></div></div></section>
<section><h2>C4 风格容器图示例<a href="#c4-风格容器图示例"><span>#</span></a></h2><div><div><img alt="@startuml
!includeurl https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(user, &quot;博客访客&quot;, &quot;阅读文章与搜索内容&quot;)

System_Boundary(system, &quot;Firefly Blog&quot;) {
	Container(we" src="https://www.plantuml.com/plantuml/svg/PL7BJjj055tNNp7robP3l67L5I7b9GKHnQ6egyYE9udBn8x6Oq9KLQeeeLMbGDHIYWfL6fTAIAXs7w2cGOAVoTZENrHZfsaYTZFtddlkkUVCMKJ1nAuYxhvk596jGHiZK26aPZsK9ApKasMTL6pLjY0kcWQ11aaMpQfKGuh1ncOieY5TbTApCrbMMb_DI5N58X1BwTb2sZI8eXiG9sji1PU5s38DWP4b04zR7wdhXEujTHq-0VZXSJFqhlsZLy75vq5lts-V1fSEtMjIzmylSfpSi0Yi5kPDsz0Kt12iw9y0_AAEOGarm3mooxm8dd7tndk5EbGJWD-0AaZLQcn9oYBO10-0l0KHWQpYztxwdNV3xjNmapFexG_wPuF-MrwSOZ7nPYHPbdDW8_gmoJGoRQs450n7HOjLwTbkqDxpJrlqJJUuy6BwqFlj_zYPOdsa2YD76LNy0Z8nSQHgLS6RcbatW0JMrAUm6BUKSjIatuxfpldOgV1gr--tQVEb__wxttAdjLjGmSKAqnuzm8gXmMr6abNAiAGRMkJ1GNjmSqARZDF_yYAuT7YHUpxsV66R2FyIPvEZf84CyLPiHN3OyL-tWVnu2T2Jcx1xpXBBGJJAEeuXT6-77rm6Nyxdip8lHeYeDtOuDWeme-D8xi17oF_UXTurFJYAtPZa75_kTxw6daERluQ7RkYr9Z4JLyMRO_Ni47P19lLaRJrVo2mivWkvbQNbl21oSz3Gx2hw2m00" loading="lazy" /></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.legspcpd.top/posts/qilu/</id>
      <title type="text">记录</title>
      <published>1900-01-01T00:00:00.000Z</published>
      <updated>1900-01-01T00:00:00.000Z</updated>
      <author><name>LegspCpd</name></author>
      <link rel="alternate" href="https://blog.legspcpd.top/posts/qilu/"/>
      <summary type="text"></summary>
      <content type="html"><![CDATA[<p>Github反向代理：<a href="https://v-gh.legspcpd.de5.net/" target="_blank">https://v-gh.legspcpd.de5.net/</a></p>]]></content>
    </entry>
</feed>
