<?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>部署 on heyaohua's Blog</title><link>https://blog.heyaohua.com/tags/%E9%83%A8%E7%BD%B2/</link><description>Recent content in 部署 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>Sat, 21 Mar 2026 21:46:00 +0800</lastBuildDate><atom:link href="https://blog.heyaohua.com/tags/%E9%83%A8%E7%BD%B2/index.xml" rel="self" type="application/rss+xml"/><item><title>Ubuntu 服务器部署 OpenClaw 完整指南</title><link>https://blog.heyaohua.com/posts/2026/03/ubuntu-openclaw-deploy-guide/</link><pubDate>Sat, 21 Mar 2026 21:46:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2026/03/ubuntu-openclaw-deploy-guide/</guid><description>手把手教你在 Ubuntu 服务器上部署 OpenClaw，从安装配置到连接飞书、安装 ClawHub 技能插件的全流程。</description><content:encoded><![CDATA[<h2 id="前言">前言</h2>
<p><a href="https://github.com/openclaw/openclaw">OpenClaw</a> 是一个开源的 AI Agent 平台，可以连接各种 LLM（大语言模型）并提供丰富的技能生态系统。部署在 Ubuntu 服务器上后，你可以通过飞书、Discord、WhatsApp 等渠道与 AI 助手对话，还能安装 ClawHub 上的各种技能插件，让它帮你管理邮件、查询股票、操作浏览器等等。</p>
<p>本文记录了我在 Ubuntu 服务器上部署 OpenClaw 的完整过程，希望对你有帮助。</p>
<h2 id="环境准备">环境准备</h2>
<h3 id="服务器要求">服务器要求</h3>
<ul>
<li><strong>操作系统</strong>：Ubuntu 22.04+（推荐 24.04 LTS）</li>
<li><strong>内存</strong>：至少 1GB，推荐 2GB+</li>
<li><strong>存储</strong>：10GB+</li>
<li><strong>网络</strong>：能访问 GitHub 和飞书 API</li>
</ul>
<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-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 更新系统</span>
</span></span><span style="display:flex;"><span>sudo apt update <span style="color:#ff79c6">&amp;&amp;</span> sudo apt upgrade -y
</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>sudo apt install -y git curl build-essential
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 安装 Node.js（OpenClaw 需要 Node 22+）</span>
</span></span><span style="display:flex;"><span>curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
</span></span><span style="display:flex;"><span>sudo apt install -y nodejs
</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>node -v  <span style="color:#6272a4"># v22.x+</span>
</span></span><span style="display:flex;"><span>npm -v
</span></span></code></pre></div><h2 id="安装-openclaw">安装 OpenClaw</h2>
<p>OpenClaw 提供了一键安装脚本，非常方便：</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 -fsSL --proto <span style="color:#f1fa8c">&#39;=https&#39;</span> --tlsv1.2 https://openclaw.ai/install.sh | bash
</span></span></code></pre></div><p>安装完成后验证：</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>openclaw --version
</span></span><span style="display:flex;"><span># OpenClaw 2026.x.x
</span></span></code></pre></div><blockquote>
<p><strong>提示</strong>：如果安装脚本因为网络问题失败，也可以通过 npm 手动安装：
<code>bash npm install -g openclaw</code></p>
</blockquote>
<h2 id="配置-gateway">配置 Gateway</h2>
<p>OpenClaw 的核心是 Gateway 服务，负责管理会话、连接渠道和技能。</p>
<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># 启动 Gateway（首次会引导你配置）
</span></span><span style="display:flex;"><span>openclaw gateway start
</span></span></code></pre></div><h3 id="配置-llm-提供商">配置 LLM 提供商</h3>
<p>OpenClaw 支持多种 LLM 提供商。以智谱（GLM）为例：</p>
<p>编辑配置文件（通常在 <code>~/.openclaw/agents/main/agent/</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># 查看当前配置
</span></span><span style="display:flex;"><span>openclaw status
</span></span></code></pre></div><p>OpenClaw 会通过 Web 界面或 CLI 引导你配置 API Key。</p>
<h3 id="常用-gateway-命令">常用 Gateway 命令</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>openclaw gateway start    # 启动
</span></span><span style="display:flex;"><span>openclaw gateway stop     # 停止
</span></span><span style="display:flex;"><span>openclaw gateway restart  # 重启
</span></span><span style="display:flex;"><span>openclaw gateway status   # 状态检查
</span></span></code></pre></div><h2 id="连接飞书">连接飞书</h2>
<p>飞书是国内最常用的协作平台，OpenClaw 提供了飞书插件，支持消息收发、日历管理、多维表格操作等。</p>
<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-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 克隆飞书扩展</span>
</span></span><span style="display:flex;"><span>git clone https://github.com/openclaw-lark/openclaw-lark.git ~/.openclaw/extensions/openclaw-lark
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> ~/.openclaw/extensions/openclaw-lark
</span></span><span style="display:flex;"><span>npm install
</span></span></code></pre></div><h3 id="配置飞书应用">配置飞书应用</h3>
<ol>
<li>在 <a href="https://open.feishu.cn/">飞书开放平台</a> 创建一个应用</li>
<li>获取 App ID 和 App Secret</li>
<li>配置事件订阅（消息接收地址）</li>
<li>配置权限（消息发送、日历、多维表格等）</li>
</ol>
<h3 id="验证连接">验证连接</h3>
<p>配置完成后，在飞书里给应用发消息测试。如果能正常回复，说明连接成功。</p>
<h2 id="安装-clawhub-技能插件">安装 ClawHub 技能插件</h2>
<p>ClawHub 是 OpenClaw 的技能市场（<a href="https://clawhub.ai">clawhub.ai</a>），有大量社区贡献的技能。</p>
<h3 id="安装方式">安装方式</h3>
<p>大多数技能可以通过下载 zip 直接安装：</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>curl -L -o /tmp/skill.zip <span style="color:#f1fa8c">&#34;https://wry-manatee-359.convex.site/api/v1/download?slug=技能名&#34;</span>
</span></span><span style="display:flex;"><span>unzip -o /tmp/skill.zip -d ~/.openclaw/skills/技能名/
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> ~/.openclaw/skills/技能名 <span style="color:#ff79c6">&amp;&amp;</span> npm install  <span style="color:#6272a4"># 如果需要</span>
</span></span></code></pre></div><h3 id="推荐技能">推荐技能</h3>
<p>以下是我在实际使用中安装的技能，按用途分类：</p>
<h4 id="-邮件管理">📧 邮件管理</h4>
<p><strong>imap-smtp-email</strong> — 通过 IMAP/SMTP 收发邮件</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>curl -L -o /tmp/imap-smtp-email.zip <span style="color:#f1fa8c">&#34;https://wry-manatee-359.convex.site/api/v1/download?slug=imap-smtp-email&#34;</span>
</span></span><span style="display:flex;"><span>unzip -o /tmp/imap-smtp-email.zip -d ~/.openclaw/skills/imap-smtp-email
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> ~/.openclaw/skills/imap-smtp-email <span style="color:#ff79c6">&amp;&amp;</span> npm install
</span></span></code></pre></div><p>配置邮箱账号（创建 <code>~/.config/imap-smtp-email/.env</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>IMAP_HOST=imap.163.com
</span></span><span style="display:flex;"><span>IMAP_PORT=993
</span></span><span style="display:flex;"><span>IMAP_USER=your@email.com
</span></span><span style="display:flex;"><span>IMAP_PASS=your_password
</span></span><span style="display:flex;"><span>IMAP_TLS=true
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>SMTP_HOST=smtp.163.com
</span></span><span style="display:flex;"><span>SMTP_PORT=465
</span></span><span style="display:flex;"><span>SMTP_USER=your@email.com
</span></span><span style="display:flex;"><span>SMTP_PASS=your_password
</span></span><span style="display:flex;"><span>SMTP_TLS=true
</span></span></code></pre></div><p>支持多账号配置，比如同时配置 163 邮箱和 QQ 邮箱。</p>
<h4 id="-预测市场">📊 预测市场</h4>
<p><strong>polymarket-trade</strong> — 查询 Polymarket 预测市场数据</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>pip3 install requests
</span></span><span style="display:flex;"><span># 下载安装（同上方式）
</span></span></code></pre></div><p>无需 API Key，直接查询热门市场和价格趋势。</p>
<h4 id="-股票分析">📈 股票分析</h4>
<p><strong>stock-analysis</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>pip3 install yfinance
</span></span><span style="display:flex;"><span># 下载安装
</span></span></code></pre></div><h4 id="-视频工具">🎬 视频工具</h4>
<p><strong>youtube-watcher</strong> — 获取 YouTube 视频字幕/转录</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>pip3 install youtube-transcript-api
</span></span></code></pre></div><p><strong>video-frames</strong> — 视频抽帧（内置技能，无需安装）</p>
<h4 id="-内容工具">📝 内容工具</h4>
<p><strong>summarize</strong> — 总结 URL、PDF、YouTube 内容</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>npm install -g @steipete/summarize
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 配置 API Key（支持智谱）</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">export</span> <span style="color:#8be9fd;font-style:italic">Z_AI_API_KEY</span><span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;your_key&#34;</span>
</span></span></code></pre></div><p><strong>nano-pdf</strong> — 编辑 PDF 文件</p>
<h4 id="-浏览器自动化">🌐 浏览器自动化</h4>
<p><strong>browser-use</strong> — AI 驱动的浏览器操作</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>uv tool install browser-use
</span></span></code></pre></div><p><strong>agent-browser</strong> — Stagehand 浏览器自动化</p>
<h4 id="-自我进化">🤖 自我进化</h4>
<p><strong>self-improving-agent</strong> — AI Agent 自我学习能力</p>
<p><strong>evolver</strong> — 运行时历史分析，识别改进点</p>
<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>openclaw skills check
</span></span></code></pre></div><h2 id="安装-claude-code开发辅助">安装 Claude Code（开发辅助）</h2>
<p>如果你的服务器安装了 <a href="https://docs.anthropic.com/en/docs/claude-code">Claude Code</a>，OpenClaw 可以调用它来完成复杂的开发任务。</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"># 安装 Claude Code</span>
</span></span><span style="display:flex;"><span>npm install -g @anthropic-ai/claude-code
</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>claude --version
</span></span></code></pre></div><p>使用时可以通过 <code>--dangerously-skip-permissions</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>claude --dangerously-skip-permissions -p &#34;你的指令&#34;
</span></span></code></pre></div><p>这样 OpenClaw 调用 Claude Code 时就不会卡在权限确认上了。</p>
<h2 id="性能优化">性能优化</h2>
<p>如果你的服务器配置较低（1GB 内存或 ARM 设备），可以进行以下优化：</p>
<h3 id="nodejs-编译缓存">Node.js 编译缓存</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>echo &#39;export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache&#39; &gt;&gt; ~/.bashrc
</span></span><span style="display:flex;"><span>echo &#39;mkdir -p /var/tmp/openclaw-compile-cache&#39; &gt;&gt; ~/.bashrc
</span></span><span style="display:flex;"><span>source ~/.bashrc
</span></span></code></pre></div><h3 id="systemd-服务优化">systemd 服务优化</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>sudo systemctl edit openclaw
</span></span></code></pre></div><p>添加以下配置：</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-json" data-lang="json"><span style="display:flex;"><span>[Service]
</span></span><span style="display:flex;"><span>Environment=OPENCLAW_NO_RESPAWN=<span style="color:#bd93f9">1</span>
</span></span><span style="display:flex;"><span>Environment=NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache
</span></span><span style="display:flex;"><span>Restart=always
</span></span><span style="display:flex;"><span>RestartSec=<span style="color:#bd93f9">2</span>
</span></span><span style="display:flex;"><span>TimeoutStartSec=<span style="color:#bd93f9">90</span>
</span></span></code></pre></div><h2 id="常见问题">常见问题</h2>
<h3 id="q-安装时报-github-限流">Q: 安装时报 GitHub 限流？</h3>
<p>A: 配置 GitHub Token：</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>gh auth login
</span></span></code></pre></div><p>或者设置环境变量：</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:#8be9fd;font-style:italic">export</span> <span style="color:#8be9fd;font-style:italic">GITHUB_TOKEN</span><span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;your_token&#34;</span>
</span></span></code></pre></div><h3 id="q-浏览器技能报-socksio-错误">Q: 浏览器技能报 socksio 错误？</h3>
<p>A: 这是因为服务器配置了 socks5 代理。可以在 skill 的启动脚本中清除 <code>all_proxy</code> 环境变量，或者将代理改为 http 协议。</p>
<h3 id="q-mysql-80-连接报-2002-错误">Q: MySQL 8.0 连接报 2002 错误？</h3>
<p>A: 通常是 MySQL 8.0 默认使用 <code>caching_sha2_password</code> 认证，旧客户端不兼容。可以改为 <code>mysql_native_password</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-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff79c6">ALTER</span> <span style="color:#ff79c6">USER</span> <span style="color:#f1fa8c">&#39;root&#39;</span><span style="color:#ff79c6">@</span><span style="color:#f1fa8c">&#39;%&#39;</span> IDENTIFIED <span style="color:#ff79c6">WITH</span> mysql_native_password <span style="color:#ff79c6">BY</span> <span style="color:#f1fa8c">&#39;your_password&#39;</span>;
</span></span><span style="display:flex;"><span>FLUSH <span style="color:#ff79c6">PRIVILEGES</span>;
</span></span></code></pre></div><h3 id="q-python-314-兼容性问题">Q: Python 3.14 兼容性问题？</h3>
<p>A: 一些 Python 脚本中 argparse 的 help 字符串包含 <code>%</code>，在 Python 3.14+ 中会报错。需要将 <code>%</code> 转义为 <code>%%</code>。</p>
<h2 id="总结">总结</h2>
<p>OpenClaw 部署到 Ubuntu 服务器后，配合 ClawHub 的技能生态，可以打造一个功能强大的 AI 助手。核心步骤：</p>
<ol>
<li><strong>安装 OpenClaw</strong> — 一键脚本</li>
<li><strong>配置 LLM</strong> — 选择你喜欢的模型提供商</li>
<li><strong>连接渠道</strong> — 飞书、Discord、WhatsApp 等</li>
<li><strong>安装技能</strong> — 从 ClawHub 按需安装</li>
<li><strong>性能优化</strong> — 针对低配服务器调整</li>
</ol>
<p>如果你也在搭建自己的 AI 助手，欢迎交流！</p>
<hr>
<p><em>相关链接：</em></p>
<ul>
<li><em><a href="https://github.com/openclaw/openclaw">OpenClaw GitHub</a></em></li>
<li><em><a href="https://clawhub.ai">ClawHub 技能市场</a></em></li>
<li><em><a href="https://docs.openclaw.ai">OpenClaw 文档</a></em></li>
<li><em><a href="https://discord.com/invite/clawd">OpenClaw Discord 社区</a></em></li>
</ul>
]]></content:encoded></item><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>GitHub Actions 自动部署自检清单</title><link>https://blog.heyaohua.com/posts/2024/01/test-deployment/</link><pubDate>Mon, 15 Jan 2024 16:00:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2024/01/test-deployment/</guid><description>本文用于验证博客的自动化部署链路是否正常运行，并记录一次完整的流水线健康检查结果，便于后续排查或重复执行。</description><content:encoded><![CDATA[<p>本文用于验证博客的自动化部署链路是否正常运行，并记录一次完整的流水线健康检查结果，便于后续排查或重复执行。</p>
<h2 id="验证目标">验证目标</h2>
<ul>
<li>工作流 <code>Deploy Blog to ECS and Netlify</code> 能够被 <code>main</code> 分支推送事件正确触发</li>
<li>构建节点成功安装依赖、拉取子模块并生成静态页面</li>
<li>部署阶段能通过 SSH 连接到 ECS，并执行 <code>make publish</code> 与静态资源同步</li>
<li>构建产物最终落地到 <code>/data/Htdocs/heyaohua/blog</code>，前端可访问最新页面</li>
</ul>
<h2 id="本次检查结果">本次检查结果</h2>
<table>
  <thead>
      <tr>
          <th>检查项</th>
          <th>结果</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GitHub Actions 触发</td>
          <td>✅</td>
          <td><code>main</code> 分支推送后，工作流成功启动</td>
      </tr>
      <tr>
          <td>依赖安装与构建</td>
          <td>✅</td>
          <td>pip 依赖安装完成，<code>pelican content -s publishconf.py</code> 运行正常</td>
      </tr>
      <tr>
          <td>ECS 连接与部署</td>
          <td>✅</td>
          <td><code>appleboy/ssh-action</code> 执行脚本，产物同步至目标目录</td>
      </tr>
      <tr>
          <td>页面可见性</td>
          <td>✅</td>
          <td>部署完成后可在博客前台访问本文</td>
      </tr>
  </tbody>
</table>
<h2 id="执行时间">执行时间</h2>
<ul>
<li>构建触发时间：2024-01-15 16:00 (UTC+08)</li>
<li>整体耗时：约 3 分钟</li>
</ul>
<h2 id="后续建议">后续建议</h2>
<ul>
<li>每次更新部署流程或依赖时，使用此清单快速复测关键节点</li>
<li>结合工作流日志与 ECS 服务器日志，保留 30 天内的关键记录，方便回溯</li>
<li>若未来仅需 ECS 部署，可在工作流中移除 Netlify 步骤，缩短执行时间</li>
</ul>
<hr>
<p>若读者能够看到这篇文章，即表明当前自动部署链路运行良好。如发现异常，请根据表格逐项排查。</p>
]]></content:encoded></item></channel></rss>