<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cloudflare on heyaohua's Blog</title><link>https://blog.heyaohua.com/tags/cloudflare/</link><description>Recent content in Cloudflare on heyaohua's Blog</description><image><title>heyaohua's Blog</title><url>https://blog.heyaohua.com/og-image.png</url><link>https://blog.heyaohua.com/og-image.png</link></image><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 09 Oct 2025 12:30:00 +0800</lastBuildDate><atom:link href="https://blog.heyaohua.com/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>Dify + Cloudflare Tunnel 部署指南</title><link>https://blog.heyaohua.com/posts/2025/10/dify-cloudflare-tunnel-deployment/</link><pubDate>Thu, 09 Oct 2025 12:30:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2025/10/dify-cloudflare-tunnel-deployment/</guid><description>本指南详细介绍如何使用 Docker 部署 Dify，并通过 Cloudflare Tunnel 实现安全的外网访问。</description><content:encoded><![CDATA[<p>本指南详细介绍如何使用 Docker 部署 Dify，并通过 Cloudflare Tunnel 实现安全的外网访问。</p>
<h2 id="前置条件">前置条件</h2>
<ul>
<li>macOS 系统</li>
<li>已安装 Docker 和 Docker Compose</li>
<li>拥有 Cloudflare 账户</li>
<li>拥有一个域名并托管在 Cloudflare</li>
</ul>
<h2 id="第一步部署-dify">第一步：部署 Dify</h2>
<h3 id="11-克隆-dify-仓库">1.1 克隆 Dify 仓库</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> /Users/heyaohua/Server
</span></span><span style="display:flex;"><span>git clone https://github.com/langgenius/dify.git
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> dify/docker
</span></span></code></pre></div><h3 id="12-配置环境变量">1.2 配置环境变量</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 复制环境变量模板</span>
</span></span><span style="display:flex;"><span>cp .env.example .env
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 编辑环境变量文件</span>
</span></span><span style="display:flex;"><span>vim .env
</span></span></code></pre></div><p>关键配置项：</p>
<ul>
<li><code>SECRET_KEY</code>: 生成一个安全的密钥</li>
<li><code>DB_USERNAME</code>, <code>DB_PASSWORD</code>: 数据库用户名和密码</li>
<li><code>REDIS_PASSWORD</code>: Redis 密码</li>
</ul>
<h3 id="13-启动-dify-服务">1.3 启动 Dify 服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 启动所有服务</span>
</span></span><span style="display:flex;"><span>docker-compose up -d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 检查服务状态</span>
</span></span><span style="display:flex;"><span>docker-compose ps
</span></span></code></pre></div><p>确保以下服务正常运行：</p>
<ul>
<li><code>docker-nginx-1</code>: 端口 80, 443</li>
<li><code>docker-api-1</code>: 端口 5001</li>
<li><code>docker-web-1</code>: 端口 3000</li>
<li><code>docker-plugin_daemon-1</code>: 端口 5003</li>
</ul>
<h2 id="第二步安装-cloudflare-tunnel">第二步：安装 Cloudflare Tunnel</h2>
<h3 id="21-安装-cloudflared">2.1 安装 cloudflared</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 使用 Homebrew 安装
</span></span><span style="display:flex;"><span>brew install cloudflared
</span></span></code></pre></div><h3 id="22-登录-cloudflare">2.2 登录 Cloudflare</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>cloudflared tunnel login
</span></span></code></pre></div><p>这会打开浏览器，选择要使用的域名进行授权。</p>
<h2 id="第三步创建和配置-tunnel">第三步：创建和配置 Tunnel</h2>
<h3 id="31-创建-tunnel">3.1 创建 Tunnel</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 创建名为 dify-tunnel 的隧道
</span></span><span style="display:flex;"><span>cloudflared tunnel create dify-tunnel
</span></span></code></pre></div><p>记录返回的 Tunnel ID，例如：<code>e5e75674-d270-4201-ab9e-ea858c091d91</code></p>
<h3 id="32-创建配置文件">3.2 创建配置文件</h3>
<p>在 Dify docker 目录下创建 <code>config.yaml</code>：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>tunnel: e5e75674-d270-4201-ab9e-ea858c091d91
</span></span><span style="display:flex;"><span>credentials-file: /Users/heyaohua/.cloudflared/e5e75674-d270-4201-ab9e-ea858c091d91.json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>ingress:
</span></span><span style="display:flex;"><span>  - hostname: dify.yourdomain.com
</span></span><span style="display:flex;"><span>    service: http://127.0.0.1:80
</span></span><span style="display:flex;"><span>  - service: http_status:404
</span></span></code></pre></div><p><strong>重要说明：</strong></p>
<ul>
<li>将 <code>tunnel</code> 值替换为你的实际 Tunnel ID</li>
<li>将 <code>credentials-file</code> 路径中的 ID 替换为你的实际 Tunnel ID</li>
<li>将 <code>dify.yourdomain.com</code> 替换为你的实际域名</li>
</ul>
<h3 id="33-配置-dns-记录">3.3 配置 DNS 记录</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 为域名创建 DNS 记录（如果不存在）
</span></span><span style="display:flex;"><span>cloudflared tunnel route dns dify-tunnel dify.yourdomain.com
</span></span></code></pre></div><p>如果提示记录已存在，可以跳过此步骤。</p>
<h2 id="第四步测试-tunnel-连接">第四步：测试 Tunnel 连接</h2>
<h3 id="41-手动测试">4.1 手动测试</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 设置 DNS 解析并启动隧道</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> /Users/heyaohua/Server/Dify/docker
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">GODNS</span><span style="color:#ff79c6">=</span>1.1.1.1 cloudflared tunnel --config config.yaml run
</span></span></code></pre></div><h3 id="42-验证连接">4.2 验证连接</h3>
<p>在浏览器中访问 <code>https://dify.yourdomain.com</code>，确认可以正常访问 Dify 界面。</p>
<h2 id="第五步配置系统服务后台运行">第五步：配置系统服务（后台运行）</h2>
<h3 id="51-安装基础服务">5.1 安装基础服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>cloudflared service install
</span></span></code></pre></div><h3 id="52-创建自定义服务配置">5.2 创建自定义服务配置</h3>
<p>创建 <code>com.cloudflare.cloudflared.plist</code> 文件：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#ff79c6">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">&lt;!DOCTYPE plist PUBLIC &#34;-//Apple//DTD PLIST 1.0//EN&#34; &#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&#34;&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">&lt;plist</span> <span style="color:#50fa7b">version=</span><span style="color:#f1fa8c">&#34;1.0&#34;</span><span style="color:#ff79c6">&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;dict&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>Label<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;string&gt;</span>com.cloudflare.cloudflared<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>ProgramArguments<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;array&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;string&gt;</span>/opt/homebrew/bin/cloudflared<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;string&gt;</span>tunnel<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;string&gt;</span>--config<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;string&gt;</span>/Users/heyaohua/Server/Dify/docker/config.yaml<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;string&gt;</span>run<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;/array&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>RunAtLoad<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;true/&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>StandardOutPath<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;string&gt;</span>/Users/heyaohua/Library/Logs/com.cloudflare.cloudflared.out.log<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>StandardErrorPath<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;string&gt;</span>/Users/heyaohua/Library/Logs/com.cloudflare.cloudflared.err.log<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>KeepAlive<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;dict&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;key&gt;</span>SuccessfulExit<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;false/&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;/dict&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>ThrottleInterval<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;integer&gt;</span>5<span style="color:#ff79c6">&lt;/integer&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;key&gt;</span>EnvironmentVariables<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;dict&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;key&gt;</span>GODNS<span style="color:#ff79c6">&lt;/key&gt;</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#ff79c6">&lt;string&gt;</span>1.1.1.1<span style="color:#ff79c6">&lt;/string&gt;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">&lt;/dict&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;/dict&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">&lt;/plist&gt;</span>
</span></span></code></pre></div><p><strong>注意：</strong> 将配置文件路径替换为你的实际路径。</p>
<h3 id="53-安装和启动服务">5.3 安装和启动服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 复制配置文件到 LaunchAgents 目录</span>
</span></span><span style="display:flex;"><span>cp com.cloudflare.cloudflared.plist /Users/heyaohua/Library/LaunchAgents/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 卸载旧服务（如果存在）</span>
</span></span><span style="display:flex;"><span>launchctl unload /Users/heyaohua/Library/LaunchAgents/com.cloudflare.cloudflared.plist
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 加载新服务</span>
</span></span><span style="display:flex;"><span>launchctl bootstrap gui/<span style="color:#ff79c6">$(</span>id -u<span style="color:#ff79c6">)</span> /Users/heyaohua/Library/LaunchAgents/com.cloudflare.cloudflared.plist
</span></span></code></pre></div><h3 id="54-验证服务状态">5.4 验证服务状态</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 检查服务是否运行
</span></span><span style="display:flex;"><span>launchctl list | grep cloudflared
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 查看服务日志
</span></span><span style="display:flex;"><span>tail -f /Users/heyaohua/Library/Logs/com.cloudflare.cloudflared.err.log
</span></span></code></pre></div><h2 id="服务管理命令">服务管理命令</h2>
<h3 id="启动服务">启动服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>launchctl bootstrap gui/$(id -u) /Users/heyaohua/Library/LaunchAgents/com.cloudflare.cloudflared.plist
</span></span></code></pre></div><h3 id="停止服务">停止服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>launchctl bootout gui/$(id -u) /Users/heyaohua/Library/LaunchAgents/com.cloudflare.cloudflared.plist
</span></span></code></pre></div><h3 id="查看服务状态">查看服务状态</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>launchctl list | grep cloudflared
</span></span></code></pre></div><h3 id="查看实时日志">查看实时日志</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 查看输出日志
</span></span><span style="display:flex;"><span>tail -f /Users/heyaohua/Library/Logs/com.cloudflare.cloudflared.out.log
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 查看错误日志
</span></span><span style="display:flex;"><span>tail -f /Users/heyaohua/Library/Logs/com.cloudflare.cloudflared.err.log
</span></span></code></pre></div><h2 id="故障排除">故障排除</h2>
<h3 id="1-dns-解析问题">1. DNS 解析问题</h3>
<p>如果遇到 DNS 解析错误：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 临时使用 Cloudflare DNS
</span></span><span style="display:flex;"><span>GODNS=1.1.1.1 cloudflared tunnel --config config.yaml run
</span></span></code></pre></div><h3 id="2-端口冲突">2. 端口冲突</h3>
<p>确保本地 80 端口没有被其他服务占用：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 检查端口占用</span>
</span></span><span style="display:flex;"><span>lsof -i :80
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 检查 Docker 服务状态</span>
</span></span><span style="display:flex;"><span>docker-compose ps
</span></span></code></pre></div><h3 id="3-权限问题">3. 权限问题</h3>
<p>确保 cloudflared 有足够的权限访问配置文件和日志目录。</p>
<h3 id="4-服务无法启动">4. 服务无法启动</h3>
<p>检查配置文件路径是否正确，Tunnel ID 是否匹配。</p>
<h2 id="安全建议">安全建议</h2>
<ol>
<li><strong>定期更新</strong>: 保持 Dify 和 cloudflared 为最新版本</li>
<li><strong>访问控制</strong>: 在 Cloudflare 控制台配置访问策略</li>
<li><strong>监控日志</strong>: 定期检查服务日志，监控异常访问</li>
<li><strong>备份配置</strong>: 备份重要的配置文件和数据库</li>
</ol>
<h2 id="总结">总结</h2>
<p>完成以上步骤后，你将拥有：</p>
<ul>
<li>✅ 完全部署的 Dify 服务</li>
<li>✅ 通过 HTTPS 的安全外网访问</li>
<li>✅ 自动启动的后台服务</li>
<li>✅ 完整的日志记录和监控</li>
</ul>
<p>现在你可以通过 <code>https://dify.yourdomain.com</code> 安全地访问你的 Dify 服务，无需担心服务器重启或网络中断的问题。</p>
<hr>
<p><strong>创建时间</strong>: 2025年10月9日
<strong>适用版本</strong>: Dify latest, cloudflared 2025.9.1
<strong>系统要求</strong>: macOS with Docker</p>
]]></content:encoded></item><item><title>Cloudflare R2 与 rclone 使用教程</title><link>https://blog.heyaohua.com/posts/2024/07/cloudflare-r2-rclone-guide/</link><pubDate>Wed, 03 Jul 2024 10:00:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2024/07/cloudflare-r2-rclone-guide/</guid><description>Cloudflare R2 是 Cloudflare 提供的对象存储服务，类似于 AWS S3，但无出站流量费用，非常适合存储和分发图片、视频等静态资源。rclone 是一个命令行工具，可以用来管理云存储，包括 Cloudflare R2。本教程将指导您如何使用 rclone 配置和管理 Cl...</description><content:encoded><![CDATA[<h2 id="1-简介">1. 简介</h2>
<p>Cloudflare R2 是 Cloudflare 提供的对象存储服务，类似于 AWS S3，但无出站流量费用，非常适合存储和分发图片、视频等静态资源。rclone 是一个命令行工具，可以用来管理云存储，包括 Cloudflare R2。本教程将指导您如何使用 rclone 配置和管理 Cloudflare R2 存储。</p>
<h2 id="2-准备工作">2. 准备工作</h2>
<h3 id="21-安装-rclone">2.1 安装 rclone</h3>
<p><strong>macOS (使用 Homebrew)</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>brew install rclone
</span></span></code></pre></div><p><strong>Linux</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://rclone.org/install.sh | sudo bash
</span></span></code></pre></div><p><strong>Windows</strong>:</p>
<ul>
<li>下载安装程序：https://rclone.org/downloads/</li>
<li>运行安装程序并按照提示操作</li>
</ul>
<h3 id="22-获取-cloudflare-r2-凭证">2.2 获取 Cloudflare R2 凭证</h3>
<ol>
<li>登录 Cloudflare 控制台：https://dash.cloudflare.com/</li>
<li>选择「R2」服务</li>
<li>点击「管理 R2 API 令牌」或「创建 API 令牌」</li>
<li>创建新的 API 令牌，确保具有读写权限</li>
<li>记录生成的 <code>Access Key ID</code> 和 <code>Secret Access Key</code></li>
<li>记录您的 Cloudflare 账户 ID（在 Cloudflare 控制台右侧边栏可以找到）</li>
</ol>
<h2 id="3-配置-rclone">3. 配置 rclone</h2>
<h3 id="31-基本配置">3.1 基本配置</h3>
<ol>
<li>打开终端或命令提示符，运行：</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone config
</span></span></code></pre></div><ol>
<li></li>
</ol>
<p>选择 <code>n</code> 创建新的远程配置</p>
<ol start="2">
<li></li>
</ol>
<p>输入远程配置名称，例如 <code>cloudflare</code></p>
<ol start="3">
<li></li>
</ol>
<p>选择存储类型，输入 <code>s3</code> 对应的编号</p>
<ol start="4">
<li></li>
</ol>
<p>选择 S3 提供商，输入 <code>Cloudflare R2</code> 对应的编号</p>
<ol start="5">
<li></li>
</ol>
<p>输入 <code>Access Key ID</code></p>
<ol start="6">
<li></li>
</ol>
<p>输入 <code>Secret Access Key</code></p>
<ol start="7">
<li></li>
</ol>
<p>输入区域，可以直接按 Enter 使用默认值 <code>auto</code></p>
<ol start="8">
<li></li>
</ol>
<p>输入端点 URL，格式为：<code>https://&lt;ACCOUNT_ID&gt;.r2.cloudflarestorage.com</code></p>
<ol start="9">
<li></li>
</ol>
<p>将 <code>&lt;ACCOUNT_ID&gt;</code> 替换为您的 Cloudflare 账户 ID</p>
<ol start="10">
<li></li>
</ol>
<p>当询问是否要编辑高级配置时，选择 <code>y</code>（是）</p>
<h3 id="32-高级配置">3.2 高级配置</h3>
<p>在高级配置中，重点关注以下参数：</p>
<ol>
<li></li>
</ol>
<p><code>force_path_style</code>：设置为 <code>true</code>（这对 Cloudflare R2 很重要）</p>
<ol start="2">
<li></li>
</ol>
<p><code>upload_cutoff</code>：控制切换为分块上传的文件大小阈值</p>
<ol start="3">
<li>默认值为 200MiB，适用于大多数情况</li>
<li>如果主要上传小文件，可以提高到 500MiB</li>
<li></li>
</ol>
<p>如果有大文件或网络不稳定，可以降低到 50-100MiB</p>
<ol start="6">
<li></li>
</ol>
<p><code>chunk_size</code>：分块上传时的块大小，默认为 5MiB</p>
<ol start="7">
<li></li>
</ol>
<p><code>max_upload_parts</code>：分块上传的最大块数，默认为 10000</p>
<ol start="8">
<li></li>
</ol>
<p>其他参数可以保持默认值</p>
<p>完成配置后，选择 <code>y</code> 保存配置。</p>
<h2 id="4-使用-rclone-管理-r2-存储">4. 使用 rclone 管理 R2 存储</h2>
<h3 id="41-创建存储桶">4.1 创建存储桶</h3>
<p>在 Cloudflare 控制台中创建存储桶：</p>
<ol>
<li>进入 R2 服务页面</li>
<li>点击「创建存储桶」</li>
<li>输入存储桶名称，例如 <code>images</code></li>
<li>点击「创建」</li>
</ol>
<h3 id="42-基本操作命令">4.2 基本操作命令</h3>
<p><strong>列出存储桶</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone lsd cloudflare:
</span></span></code></pre></div><p><strong>列出存储桶中的文件</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone ls cloudflare:存储桶名
</span></span></code></pre></div><p><strong>上传单个文件</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone copy 本地文件路径 cloudflare:存储桶名/目标路径
</span></span></code></pre></div><p><strong>上传整个目录</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone copy 本地目录路径 cloudflare:存储桶名/目标路径
</span></span></code></pre></div><p><strong>同步目录</strong>（将删除目标中不存在于源的文件）:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone sync 本地目录路径 cloudflare:存储桶名/目标路径
</span></span></code></pre></div><p><strong>下载文件</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone copy cloudflare:存储桶名/文件路径 本地目录路径
</span></span></code></pre></div><p><strong>删除文件</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone delete cloudflare:存储桶名/文件路径
</span></span></code></pre></div><p><strong>删除目录</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone purge cloudflare:存储桶名/目录路径
</span></span></code></pre></div><h3 id="43-高级操作">4.3 高级操作</h3>
<p><strong>使用 <code>--dry-run</code> 预览操作</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone sync 本地目录路径 cloudflare:存储桶名/目标路径 --dry-run
</span></span></code></pre></div><p><strong>设置并行传输数</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone copy 本地目录路径 cloudflare:存储桶名/目标路径 --transfers=4
</span></span></code></pre></div><p><strong>显示传输进度</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone copy 本地目录路径 cloudflare:存储桶名/目标路径 -P
</span></span></code></pre></div><p><strong>设置带宽限制</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone copy 本地目录路径 cloudflare:存储桶名/目标路径 --bwlimit=10M
</span></span></code></pre></div><h2 id="5-配置-r2-公共访问与-cdn">5. 配置 R2 公共访问与 CDN</h2>
<h3 id="51-设置公共访问权限">5.1 设置公共访问权限</h3>
<ol>
<li>在 Cloudflare 控制台中，进入 R2 服务页面</li>
<li>选择您的存储桶</li>
<li>点击「设置」选项卡</li>
<li>在「公共访问」部分，选择「公开可读」</li>
</ol>
<h3 id="52-配置自定义域名">5.2 配置自定义域名</h3>
<ol>
<li>在 Cloudflare 控制台中，进入 R2 服务页面</li>
<li>选择您的存储桶</li>
<li>点击「设置」选项卡</li>
<li>在「公共访问」部分，点击「添加自定义域」</li>
<li>输入您想要使用的域名，例如 <code>images.example.com</code></li>
<li>按照提示完成 DNS 配置</li>
</ol>
<h3 id="53-在网站中使用-r2-资源">5.3 在网站中使用 R2 资源</h3>
<p>配置完成后，您可以通过以下方式在网站中引用 R2 中的资源：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>// 使用 R2 默认域名
</span></span><span style="display:flex;"><span>const imagePath = `https://&lt;ACCOUNT_ID&gt;.r2.cloudflarestorage.com/存储桶名/文件路径`;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// 使用自定义域名
</span></span><span style="display:flex;"><span>const imagePath = `https://images.example.com/文件路径`;
</span></span></code></pre></div><h2 id="6-维护与最佳实践">6. 维护与最佳实践</h2>
<h3 id="61-定期同步">6.1 定期同步</h3>
<p>设置定期同步任务，确保本地和 R2 存储保持一致：</p>
<p><strong>创建定时任务 (cron job)</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 编辑 crontab
</span></span><span style="display:flex;"><span>crontab -e
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 添加定时任务，每天凌晨 2 点执行同步
</span></span><span style="display:flex;"><span>0 2 * * * rclone sync /本地路径 cloudflare:存储桶名/目标路径 --log-file=/path/to/logfile.log
</span></span></code></pre></div><h3 id="62-监控与日志">6.2 监控与日志</h3>
<p>使用 <code>--log-file</code> 参数记录操作日志：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>rclone sync /本地路径 cloudflare:存储桶名/目标路径 --log-file=/path/to/logfile.log
</span></span></code></pre></div><h3 id="63-修改现有配置">6.3 修改现有配置</h3>
<p>如果需要修改已有的 rclone 配置：</p>
<ol>
<li>运行 <code>rclone config</code></li>
<li>选择 <code>e</code> 编辑现有远程配置</li>
<li>选择要修改的配置名称</li>
<li>按照提示修改相应参数</li>
<li>完成后保存配置</li>
</ol>
<h2 id="7-故障排除">7. 故障排除</h2>
<h3 id="71-常见错误">7.1 常见错误</h3>
<p><strong>连接错误</strong>:</p>
<ul>
<li>检查账户 ID 是否正确</li>
<li>确认 API 密钥是否有效</li>
<li>验证网络连接是否正常</li>
</ul>
<p><strong>权限错误</strong>:</p>
<ul>
<li>确认 API 令牌具有适当的权限</li>
<li>检查存储桶访问策略</li>
</ul>
<p><strong>上传失败</strong>:</p>
<ul>
<li>尝试减小 <code>chunk_size</code> 和 <code>upload_cutoff</code> 值</li>
<li>使用 <code>-v</code> 参数查看详细日志</li>
</ul>
<h3 id="72-调试命令">7.2 调试命令</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 检查配置
</span></span><span style="display:flex;"><span>rclone config show cloudflare
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 详细日志
</span></span><span style="display:flex;"><span>rclone copy 本地文件路径 cloudflare:存储桶名/目标路径 -v
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 非常详细的日志
</span></span><span style="display:flex;"><span>rclone copy 本地文件路径 cloudflare:存储桶名/目标路径 -vv
</span></span></code></pre></div><h2 id="8-结语">8. 结语</h2>
<p>通过本教程，您已经学会了如何使用 rclone 配置和管理 Cloudflare R2 存储。R2 结合 Cloudflare 的 CDN 网络，可以为您的网站提供高性能、低成本的静态资源存储和分发解决方案，特别适合图片、视频等大文件的存储和全球分发。</p>
<hr>
<blockquote>
<p>本文档基于实际配置经验编写，适用于需要将静态资源从本地服务器迁移到 Cloudflare R2 的网站管理员和开发者。</p>
</blockquote>
]]></content:encoded></item></channel></rss>