<?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>Tunnel on heyaohua's Blog</title><link>https://blog.heyaohua.com/tags/tunnel/</link><description>Recent content in Tunnel 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/tunnel/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></channel></rss>