<?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>Technology on ZORAN</title>
    <link>https://zoranzhou.com/tags/technology/</link>
    <description>Recent content in Technology on ZORAN</description>
    <image>
      <url>https://zoranzhou.com/favicon.png</url>
      <link>https://zoranzhou.com/favicon.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 05 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://zoranzhou.com/tags/technology/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OpenClaw 完全安装指南与命令详解</title>
      <link>https://zoranzhou.com/posts/openclaw-complete-guide/</link>
      <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://zoranzhou.com/posts/openclaw-complete-guide/</guid>
      <description>基于官方文档的 OpenClaw AI 助手完整安装教程，涵盖多种安装方式、配置详解及常用命令汇总</description>
      <content:encoded><![CDATA[<h1 id="前言">前言</h1>
<p>OpenClaw 是一个强大的 AI 助手平台，支持多代理架构、浏览器自动化、定时任务、跨平台消息推送等丰富功能。本文将基于官方文档，详细介绍 OpenClaw 的完整安装流程、配置方法以及日常使用中的各类命令。</p>
<hr>
<h1 id="系统要求">系统要求</h1>
<p>在安装 OpenClaw 之前，请确保你的系统满足以下要求：</p>
<ul>
<li><strong>Node.js</strong>: 22 或更高版本（安装脚本会自动安装）</li>
<li><strong>操作系统</strong>: macOS、Linux 或 Windows</li>
<li><strong>包管理器</strong>: npm（必需）或 pnpm（源码安装时需要）</li>
</ul>
<!-- raw HTML omitted -->
<hr>
<h1 id="安装方法">安装方法</h1>
<h2 id="方法一安装脚本推荐">方法一：安装脚本（推荐）</h2>
<p>安装脚本是最简单的方式，它会自动处理 Node 检测、安装和初始化向导。</p>
<h3 id="macos--linux--wsl2">macOS / Linux / WSL2</h3>
<pre tabindex="0"><code>curl -fsSL https://openclaw.ai/install.sh | bash
</code></pre><h3 id="windows-powershell">Windows (PowerShell)</h3>
<pre tabindex="0"><code>iwr -useb https://openclaw.ai/install.ps1 | iex
</code></pre><p><strong>跳过初始化向导，仅安装二进制文件：</strong></p>
<pre tabindex="0"><code># macOS / Linux / WSL2
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --no-onboard

# Windows PowerShell
&amp; ([scriptblock]::Create((iwr -useb https://openclaw.ai/install.ps1))) -NoOnboard
</code></pre><h2 id="方法二npm--pnpm-安装">方法二：npm / pnpm 安装</h2>
<p>如果你已经安装了 Node 22+，可以手动管理安装：</p>
<h3 id="使用-npm">使用 npm</h3>
<pre tabindex="0"><code>npm install -g openclaw@latest
openclaw onboard --install-daemon
</code></pre><!-- raw HTML omitted -->
<pre tabindex="0"><code>SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install -g openclaw@latest
</code></pre><!-- raw HTML omitted -->
<h3 id="使用-pnpm">使用 pnpm</h3>
<pre tabindex="0"><code>pnpm add -g openclaw@latest
pnpm approve-builds -g        # 批准构建脚本
openclaw onboard --install-daemon
</code></pre><!-- raw HTML omitted -->
<h2 id="方法三从源码安装">方法三：从源码安装</h2>
<p>适合贡献者或想要本地运行的用户。</p>
<pre tabindex="0"><code># 1. 克隆仓库并构建
git clone https://github.com/openclaw/openclaw.git
cd openclaw
pnpm install
pnpm ui:build
pnpm build

# 2. 链接 CLI 到全局
pnpm link --global

# 3. 运行初始化向导
openclaw onboard --install-daemon
</code></pre><!-- raw HTML omitted -->
<h2 id="方法四docker--podman">方法四：Docker / Podman</h2>
<p>适合容器化或 headless 部署：</p>
<pre tabindex="0"><code># Docker
docker run -it --rm openclaw/openclaw:latest

# Podman（rootless）
# 先运行 setup-podman.sh，然后使用启动脚本
</code></pre><p>其他安装方式：</p>
<ul>
<li><strong>Nix</strong>: 声明式安装</li>
<li><strong>Ansible</strong>: 自动化集群部署</li>
<li><strong>Bun</strong>: 仅 CLI 使用</li>
</ul>
<hr>
<h1 id="安装后验证">安装后验证</h1>
<p>安装完成后，运行以下命令验证一切正常：</p>
<pre tabindex="0"><code># 检查配置问题
openclaw doctor

# 查看网关状态
openclaw status

# 打开浏览器控制面板
openclaw dashboard
</code></pre><hr>
<h1 id="初始化配置">初始化配置</h1>
<h2 id="运行初始化向导">运行初始化向导</h2>
<pre tabindex="0"><code>openclaw onboard
</code></pre><p>向导会引导你完成：</p>
<ol>
<li>工作区设置</li>
<li>模型提供商配置（API Key）</li>
<li>消息通道配置（WhatsApp、Telegram、Discord 等）</li>
<li>技能安装</li>
<li>网关服务安装</li>
</ol>
<h2 id="常用配置选项">常用配置选项</h2>
<h3 id="非交互式配置">非交互式配置</h3>
<pre tabindex="0"><code># 快速模式
openclaw onboard --non-interactive --mode local

# 指定模型提供商
openclaw onboard --auth-choice openai-api-key --openai-api-key $OPENAI_API_KEY

# 远程网关模式
openclaw onboard --mode remote --remote-url https://gateway.example.com --remote-token $TOKEN
</code></pre><h3 id="配置模型">配置模型</h3>
<pre tabindex="0"><code># 查看模型状态
openclaw models status

# 设置主模型
openclaw models set moonshot/kimi-k2.5

# 设置图像模型
openclaw models set-image openai/gpt-4o

# 添加模型别名
openclaw models aliases add kimi moonshot/kimi-k2.5

# 配置模型认证
openclaw models auth add
openclaw models auth setup-token --provider anthropic
</code></pre><hr>
<h1 id="核心命令详解">核心命令详解</h1>
<h2 id="基础命令">基础命令</h2>
<table>
  <thead>
      <tr>
          <th>命令</th>
          <th>说明</th>
          <th>示例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>openclaw --version</code></td>
          <td>查看版本</td>
          <td><code>openclaw -V</code></td>
      </tr>
      <tr>
          <td><code>openclaw --help</code></td>
          <td>显示帮助</td>
          <td><code>openclaw --help</code></td>
      </tr>
      <tr>
          <td><code>openclaw doctor</code></td>
          <td>健康检查</td>
          <td><code>openclaw doctor --deep</code></td>
      </tr>
      <tr>
          <td><code>openclaw status</code></td>
          <td>查看状态</td>
          <td><code>openclaw status --usage</code></td>
      </tr>
      <tr>
          <td><code>openclaw dashboard</code></td>
          <td>打开控制面板</td>
          <td><code>openclaw dashboard</code></td>
      </tr>
  </tbody>
</table>
<h2 id="配置管理">配置管理</h2>
<pre tabindex="0"><code># 交互式配置向导
openclaw configure

# 获取配置值
openclaw config get agents.defaults.model.primary

# 设置配置值
openclaw config set agents.defaults.model.primary moonshot/kimi-k2.5

# 验证配置
openclaw config validate

# 查看配置文件路径
openclaw config file
</code></pre><h2 id="网关管理">网关管理</h2>
<pre tabindex="0"><code># 查看网关状态
openclaw gateway status

# 安装网关服务
openclaw gateway install --port 18789

# 启动/停止/重启网关
openclaw gateway start
openclaw gateway stop
openclaw gateway restart

# 查看日志
openclaw logs --follow
openclaw logs --limit 200
</code></pre><h2 id="会话管理">会话管理</h2>
<pre tabindex="0"><code># 列出所有会话
openclaw sessions list

# 查看会话历史
openclaw sessions history agent:main:main

# 向会话发送消息
openclaw sessions send agent:main:main &#34;你好&#34;
</code></pre><h2 id="技能管理">技能管理</h2>
<pre tabindex="0"><code># 列出已安装技能
openclaw skills list

# 查看技能详情
openclaw skills info agent-browser

# 检查技能就绪状态
openclaw skills check

# 从 ClawdHub 搜索技能
npx clawhub search browser

# 安装技能
npx clawhub install agent-browser
</code></pre><h2 id="消息通道管理">消息通道管理</h2>
<pre tabindex="0"><code># 列出配置的通道
openclaw channels list

# 检查通道状态
openclaw channels status --probe

# 查看通道日志
openclaw channels logs --lines 100

# 添加 Telegram 机器人
openclaw channels add --channel telegram --account alerts --name &#34;Alerts Bot&#34; --token $TELEGRAM_BOT_TOKEN

# 添加 Discord 机器人
openclaw channels add --channel discord --account work --name &#34;Work Bot&#34; --token $DISCORD_BOT_TOKEN

# 移除通道
openclaw channels remove --channel discord --account work --delete
</code></pre><h2 id="代理管理">代理管理</h2>
<pre tabindex="0"><code># 列出代理
openclaw agents list

# 添加新代理
openclaw agents add my-agent --workspace /path/to/workspace

# 绑定通道到代理
openclaw agents bind --agent my-agent --bind telegram:alerts

# 解绑通道
openclaw agents unbind --agent my-agent --bind telegram:alerts

# 删除代理
openclaw agents delete my-agent
</code></pre><h2 id="浏览器自动化">浏览器自动化</h2>
<pre tabindex="0"><code># 启动浏览器
openclaw browser start

# 打开网页
openclaw browser open https://example.com

# 获取页面快照
openclaw browser snapshot --interactive

# 点击元素
openclaw browser click @e1

# 输入文本
openclaw browser type @e2 &#34;搜索内容&#34; --submit

# 截图
openclaw browser screenshot --full-page

# 停止浏览器
openclaw browser stop
</code></pre><h2 id="定时任务-cron">定时任务 (Cron)</h2>
<pre tabindex="0"><code># 查看定时任务
openclaw cron list

# 添加定时任务（每 30 分钟）
openclaw cron add --name &#34;heartbeat&#34; --every 30m --system-event &#34;检查邮件&#34;

# 添加定时任务（特定时间）
openclaw cron add --name &#34;reminder&#34; --at &#34;2026-03-10T09:00:00Z&#34; --message &#34;开会提醒&#34;

# 添加 Cron 表达式任务
openclaw cron add --name &#34;daily&#34; --cron &#34;0 9 * * *&#34; --system-event &#34;每日简报&#34;

# 启用/禁用任务
openclaw cron enable &lt;id&gt;
openclaw cron disable &lt;id&gt;

# 删除任务
openclaw cron rm &lt;id&gt;

# 立即运行任务
openclaw cron run &lt;id&gt;
</code></pre><h2 id="节点管理移动设备">节点管理（移动设备）</h2>
<pre tabindex="0"><code># 列出已配对节点
openclaw nodes list

# 查看节点详情
openclaw nodes describe --node &lt;id&gt;

# 批准配对请求
openclaw nodes approve &lt;requestId&gt;

# 拍照（iOS/Android）
openclaw nodes camera snap --node &lt;id&gt; --facing back

# 录屏（iOS/Android）
openclaw nodes screen record --node &lt;id&gt; --duration 30s

# 获取位置
openclaw nodes location get --node &lt;id&gt;

# 发送通知（macOS）
openclaw nodes notify --node &lt;id&gt; --title &#34;提醒&#34; --body &#34;内容&#34;

# 在节点上运行命令
openclaw nodes run --node &lt;id&gt; ls -la
</code></pre><h2 id="内存搜索">内存搜索</h2>
<pre tabindex="0"><code># 查看内存索引状态
openclaw memory status

# 重新索引内存
openclaw memory index

# 搜索记忆
openclaw memory search &#34;OpenClaw 安装&#34;
</code></pre><hr>
<h1 id="工作区文件结构">工作区文件结构</h1>
<p>OpenClaw 在工作区使用以下文件组织配置和记忆：</p>
<pre tabindex="0"><code>~/.openclaw/
├── workspace/                    # 主工作区
│   ├── AGENTS.md                # 多代理工作流配置
│   ├── SOUL.md                  # AI 行为准则和个性
│   ├── TOOLS.md                 # 工具能力和使用模式
│   ├── MEMORY.md                # 长期记忆（仅主会话）
│   ├── TOOLS.md                 # 工具配置
│   ├── BOOTSTRAP.md             # 首次运行引导（可删除）
│   ├── HEARTBEAT.md             # 定时任务检查清单
│   ├── IDENTITY.md              # AI 身份信息
│   ├── USER.md                  # 用户信息
│   ├── .learnings/              # 学习记录
│   │   ├── LEARNINGS.md
│   │   ├── ERRORS.md
│   │   └── FEATURE_REQUESTS.md
│   └── memory/                  # 每日记忆文件
│       └── YYYY-MM-DD.md
├── config.json                  # 主配置文件
├── agents/                      # 代理配置
└── skills/                      # 已安装技能
</code></pre><hr>
<h1 id="推荐技能清单">推荐技能清单</h1>
<table>
  <thead>
      <tr>
          <th>技能名称</th>
          <th>功能描述</th>
          <th>安装命令</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>agent-browser</strong></td>
          <td>浏览器自动化（导航、点击、截图）</td>
          <td><code>npx clawhub install agent-browser</code></td>
      </tr>
      <tr>
          <td><strong>tavily-search</strong></td>
          <td>AI 优化搜索</td>
          <td><code>npx clawhub install tavily-search</code></td>
      </tr>
      <tr>
          <td><strong>summarize</strong></td>
          <td>内容总结（URL、PDF、视频）</td>
          <td><code>npx clawhub install summarize</code></td>
      </tr>
      <tr>
          <td><strong>self-improving-agent</strong></td>
          <td>自我改进和学习记录</td>
          <td><code>npx clawhub install self-improving-agent</code></td>
      </tr>
      <tr>
          <td><strong>find-skills</strong></td>
          <td>发现和安装技能</td>
          <td><code>npx clawhub install find-skills</code></td>
      </tr>
      <tr>
          <td><strong>sag</strong></td>
          <td>ElevenLabs 语音合成</td>
          <td><code>npx clawhub install sag</code></td>
      </tr>
      <tr>
          <td><strong>canvas</strong></td>
          <td>画布展示和 A2UI</td>
          <td><code>npx clawhub install canvas</code></td>
      </tr>
  </tbody>
</table>
<hr>
<h1 id="故障排除">故障排除</h1>
<h2 id="openclaw-命令未找到">openclaw 命令未找到</h2>
<p><strong>诊断：</strong></p>
<pre tabindex="0"><code>node -v
npm -v
npm prefix -g
echo &#34;$PATH&#34;
</code></pre><p><strong>修复（macOS/Linux）：</strong></p>
<p>将以下行添加到 <code>~/.zshrc</code> 或 <code>~/.bashrc</code>：</p>
<pre tabindex="0"><code>export PATH=&#34;$(npm prefix -g)/bin:$PATH&#34;
</code></pre><p><strong>Windows：</strong>
将 <code>npm prefix -g</code> 的输出添加到系统 PATH 环境变量。</p>
<h2 id="模型认证失败">模型认证失败</h2>
<pre tabindex="0"><code># 检查认证状态
openclaw models status --probe

# 重新添加认证
openclaw models auth add
</code></pre><h2 id="网关无法启动">网关无法启动</h2>
<pre tabindex="0"><code># 检查端口占用
openclaw gateway status --deep

# 强制重启
openclaw gateway restart --force

# 查看详细日志
openclaw logs --follow
</code></pre><hr>
<h1 id="进阶使用技巧">进阶使用技巧</h1>
<h2 id="1-多代理架构">1. 多代理架构</h2>
<p>创建隔离的代理用于不同任务：</p>
<pre tabindex="0"><code># 创建工作代理
openclaw agents add work-agent --workspace ~/work-agent
openclaw agents bind --agent work-agent --bind slack:work

# 创建个人代理
openclaw agents add personal-agent --workspace ~/personal-agent
openclaw agents bind --agent personal-agent --bind telegram:personal
</code></pre><h2 id="2-环境变量配置">2. 环境变量配置</h2>
<p>自定义运行时路径：</p>
<pre tabindex="0"><code>export OPENCLAW_HOME=&#34;$HOME/.openclaw-custom&#34;      # 主目录
export OPENCLAW_STATE_DIR=&#34;/var/openclaw&#34;          # 可变状态
export OPENCLAW_CONFIG_PATH=&#34;/etc/openclaw.json&#34;   # 配置文件
</code></pre><h2 id="3-开发模式">3. 开发模式</h2>
<pre tabindex="0"><code># 使用隔离的开发环境
openclaw --dev dashboard

# 使用自定义配置文件
openclaw --profile work dashboard
</code></pre><h2 id="4-acp-桥接ide-集成">4. ACP 桥接（IDE 集成）</h2>
<pre tabindex="0"><code># 启动 ACP 桥接，连接 IDE 到网关
openclaw acp
</code></pre><hr>
<h1 id="更新与卸载">更新与卸载</h1>
<h2 id="更新-openclaw">更新 OpenClaw</h2>
<pre tabindex="0"><code># 通过 npm
npm update -g openclaw

# 或通过安装脚本重新安装
curl -fsSL https://openclaw.ai/install.sh | bash
</code></pre><h2 id="重置配置">重置配置</h2>
<pre tabindex="0"><code># 重置配置（保留 CLI）
openclaw reset --scope config

# 完全重置（包括凭证和会话）
openclaw reset --scope full --yes
</code></pre><h2 id="完全卸载">完全卸载</h2>
<pre tabindex="0"><code># 卸载服务和数据（保留 CLI）
openclaw uninstall --all --yes

# 然后手动删除全局安装
npm uninstall -g openclaw
</code></pre><hr>
<h1 id="总结">总结</h1>
<p>OpenClaw 是一个功能丰富的 AI 助手平台，主要特点包括：</p>
<ul>
<li><strong>多种安装方式</strong>：安装脚本、npm、源码、Docker</li>
<li><strong>多代理支持</strong>：隔离的工作区和路由</li>
<li><strong>丰富的技能生态</strong>：浏览器自动化、搜索、语音等</li>
<li><strong>跨平台消息</strong>：WhatsApp、Telegram、Discord、Slack 等</li>
<li><strong>移动设备集成</strong>：iOS/Android 节点配对</li>
<li><strong>定时任务</strong>：Cron 表达式支持</li>
<li><strong>浏览器自动化</strong>：完整的网页操作能力</li>
</ul>
<p><strong>快速开始命令：</strong></p>
<pre tabindex="0"><code># 安装
curl -fsSL https://openclaw.ai/install.sh | bash

# 初始化
openclaw onboard --install-daemon

# 验证
openclaw doctor
openclaw status

# 打开控制面板
openclaw dashboard
</code></pre><hr>
<p><strong>参考链接：</strong></p>
<ul>
<li><a href="https://docs.openclaw.ai">OpenClaw 官方文档</a></li>
<li><a href="https://clawhub.com">ClawdHub 技能市场</a></li>
<li><a href="https://github.com/openclaw/openclaw">GitHub 仓库</a></li>
<li><a href="https://discord.gg/clawd">Discord 社区</a></li>
</ul>
<hr>
<p><em>本文基于 OpenClaw 官方文档编写，最后更新于 2026-03-06</em></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Minecraft 服务器调参指南</title>
      <link>https://zoranzhou.com/posts/minecraft-configuration/</link>
      <pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://zoranzhou.com/posts/minecraft-configuration/</guid>
      <description>优化 Minecraft 服务器性能</description>
      <content:encoded><![CDATA[<h1 id="服务器常见列表">服务器常见列表</h1>
<h2 id="serverproperties">server.properties</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">属性</th>
          <th style="text-align: left">类型</th>
          <th style="text-align: left">默认值</th>
          <th style="text-align: left">描述</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">allow-flight</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">允许玩家在安装添加飞行功能的mod前提下在生存模式下飞行。 允许飞行可能会使恶意破坏者更加常见，因为此设定会使他们更容易达成目的。在创造模式下无作用。</td>
      </tr>
      <tr>
          <td style="text-align: left">allow-nether</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">允许玩家进入下界。</td>
      </tr>
      <tr>
          <td style="text-align: left">broadcast-console-to-ops</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">向所有在线OP发送所执行命令的输出。</td>
      </tr>
      <tr>
          <td style="text-align: left">broadcast-rcon-to-ops</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">向所有在线OP发送通过RCON执行的命令的输出。</td>
      </tr>
      <tr>
          <td style="text-align: left">difficulty</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">easy</td>
          <td style="text-align: left">定义服务器的游戏难度（例如生物对玩家造成的伤害，饥饿和中毒对玩家的影响方式等）。</td>
      </tr>
      <tr>
          <td style="text-align: left">enable-command-block</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">是否启用命令方块。</td>
      </tr>
      <tr>
          <td style="text-align: left">enable-jmx-monitoring</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">用于暴露以毫秒为单位的tick时间。 为了启用JRE的JMX，你需要添加在此处所述的一些JVM标志。</td>
      </tr>
      <tr>
          <td style="text-align: left">enable-query</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">允许使用GameSpy4协议的服务器监听器。用于获取服务器信息。</td>
      </tr>
      <tr>
          <td style="text-align: left">enable-rcon</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">是否允许远程访问服务器控制台。</td>
      </tr>
      <tr>
          <td style="text-align: left">enable-status</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">使服务器在服务器列表中看起来是“在线”的。</td>
      </tr>
      <tr>
          <td style="text-align: left">enforce-secure-profile</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">要求玩家必须具有Mojang签名的公钥才能进入服务器。</td>
      </tr>
      <tr>
          <td style="text-align: left">enforce-whitelist</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">在服务器上强制执行白名单。 当启用后，不在白名单（前提是启用）中的用户将在服务器重新加载白名单文件后从服务器踢出。</td>
      </tr>
      <tr>
          <td style="text-align: left">entity-broadcast-range-percentage</td>
          <td style="text-align: left">整数（10-1000）</td>
          <td style="text-align: left">100</td>
          <td style="text-align: left">此选项控制实体需要距离玩家有多近才会将数据包发送给客户端。</td>
      </tr>
      <tr>
          <td style="text-align: left">force-gamemode</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">强制玩家加入时为默认游戏模式。</td>
      </tr>
      <tr>
          <td style="text-align: left">function-permission-level</td>
          <td style="text-align: left">整数（1-4）</td>
          <td style="text-align: left">2</td>
          <td style="text-align: left">设定函数的默认权限等级。 4个等级的详情见 #op-permission-level。</td>
      </tr>
      <tr>
          <td style="text-align: left">gamemode</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">survival</td>
          <td style="text-align: left">定义默认游戏模式。</td>
      </tr>
      <tr>
          <td style="text-align: left">generate-structures</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">定义是否能生成结构（例如村庄）。</td>
      </tr>
      <tr>
          <td style="text-align: left">generator-settings</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left"></td>
          <td style="text-align: left">本属性质用于自定义世界的生成。详见超平坦世界和自定义了解正确的设定及例子。</td>
      </tr>
      <tr>
          <td style="text-align: left">hardcore</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">如果设为 true，服务器难度的设置会被忽略并且设为hard（困难），玩家在死后会自动切换至旁观模式。</td>
      </tr>
      <tr>
          <td style="text-align: left">hide-online-players</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">如果设为 true，服务端在响应客户端状态请求时不会返回在线玩家列表。</td>
      </tr>
      <tr>
          <td style="text-align: left">initial-disabled-packs</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">需要在创建世界过程中禁用的数据包名称，以逗号分隔。</td>
      </tr>
      <tr>
          <td style="text-align: left">initial-enabled-packs</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">vanilla</td>
          <td style="text-align: left">需要在创建世界过程中启用的数据包名称，以逗号分隔。特别地，功能数据包必须在此指定才能生效。</td>
      </tr>
      <tr>
          <td style="text-align: left">level-name</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">world</td>
          <td style="text-align: left">“level-name”的值将作为世界名称及其文件夹名。</td>
      </tr>
      <tr>
          <td style="text-align: left">level-seed</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">与单人游戏类似，为你的世界定义一个种子。</td>
      </tr>
      <tr>
          <td style="text-align: left">level-type</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">minecraft:normal</td>
          <td style="text-align: left">使用世界预设ID，确定地图所生成的类型。</td>
      </tr>
      <tr>
          <td style="text-align: left">log-ips</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">是否在有新玩家加入游戏时，在服务器日志中记录其IP地址。</td>
      </tr>
      <tr>
          <td style="text-align: left">max-build-height</td>
          <td style="text-align: left">整数</td>
          <td style="text-align: left">256</td>
          <td style="text-align: left">玩家在游戏中能够建造的最大高度。可能会在该值较小时生成超过该值的地形。</td>
      </tr>
      <tr>
          <td style="text-align: left">max-chained-neighbor-updates</td>
          <td style="text-align: left">整数</td>
          <td style="text-align: left">1000000</td>
          <td style="text-align: left">限制连锁NC更新的数量，超过此数量的连锁NC更新会被跳过。若为负数则无限制。</td>
      </tr>
      <tr>
          <td style="text-align: left">max-players</td>
          <td style="text-align: left">整数（0-2147483647）</td>
          <td style="text-align: left">20</td>
          <td style="text-align: left">服务器同时能容纳的最大玩家数量。请注意，在线玩家越多，对服务器造成的负担也就越大。</td>
      </tr>
      <tr>
          <td style="text-align: left">max-tick-time</td>
          <td style="text-align: left">整数（0–(2^63 - 1)）</td>
          <td style="text-align: left">60000</td>
          <td style="text-align: left">设置每个tick花费的最大毫秒数。超过该毫秒数时，服务器watchdog插件将停止服务器程序并附带上信息：</td>
      </tr>
      <tr>
          <td style="text-align: left">max-world-size</td>
          <td style="text-align: left">整数（1-29999984）</td>
          <td style="text-align: left">29999984</td>
          <td style="text-align: left">设置可让世界边界获得的最大半径值，单位为方块。通过成功执行的命令能把世界边界设置得更大，但不会超过这里设置的最大方块限制。</td>
      </tr>
      <tr>
          <td style="text-align: left">motd</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">A Minecraft Server</td>
          <td style="text-align: left">本属性值是玩家客户端的多人游戏服务器列表中显示的服务器信息，显示于名称下方。</td>
      </tr>
      <tr>
          <td style="text-align: left">network-compression-threshold</td>
          <td style="text-align: left">整数</td>
          <td style="text-align: left">256</td>
          <td style="text-align: left">默认会允许n-1字节的数据包正常发送, 如果数据包为n字节或更大时会进行压缩。所以，更低的数值会使得更多的数据包被压缩，但是如果被压缩的数据包字节太小将反而使压缩后字节更大。 -1 - 完全禁用数据包压缩 0 - 压缩全部数据包 注：以太网规范要求把小于64字节的数据包填充为64字节。因此，设置一个低于64的值可能没有什么好处。也不推荐让设置的值超过MTU（通常为1500字节）。</td>
      </tr>
      <tr>
          <td style="text-align: left">online-mode</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">是否让服务器对比Minecraft账户数据库验证登录信息。</td>
      </tr>
      <tr>
          <td style="text-align: left">op-permission-level</td>
          <td style="text-align: left">整数（1-4）</td>
          <td style="text-align: left">4</td>
          <td style="text-align: left">设定使用/op命令时OP的权限等级。所有存档会从之前的存档继承能力和命令。 1 - OP可以绕过重生点保护。 2 - OP可以使用所有单人游戏作弊命令（除了/publish，因为不能在服务器上使用；/debug也是）并使用命令方块。命令方块和领域服服主/管理员有此等级权限。 3 - OP可以使用大多数多人游戏中独有的命令，包括 /debug，以及管理玩家的命令（/ban，/op等等）。 4 - OP可以使用所有命令，包括 /stop, /save-all, /save-on 和 /save-off。</td>
      </tr>
      <tr>
          <td style="text-align: left">player-idle-timeout</td>
          <td style="text-align: left">整数</td>
          <td style="text-align: left">0</td>
          <td style="text-align: left">如果不为0，服务器将在玩家的空闲时间达到设置的时间（单位为分钟）时将玩家踢出服务器 注：当服务器接受到下列数据包之一时将会重置空闲时间：点击窗口附魔物品更新告示牌 玩家挖掘方块玩家放置方块 更换拿着的物品 动画（挥动手臂） 实体动作客户端状态聊天信息 使用实体</td>
      </tr>
      <tr>
          <td style="text-align: left">prevent-proxy-connections</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">如果服务器发送的ISP/AS和Mojang的验证服务器的不一样，玩家将会被踢出。</td>
      </tr>
      <tr>
          <td style="text-align: left">pvp</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">是否允许PvP。也只有在允许PvP时玩家自己的箭才会受到伤害。</td>
      </tr>
      <tr>
          <td style="text-align: left">query.port</td>
          <td style="text-align: left">整数（1-65534）</td>
          <td style="text-align: left">25565</td>
          <td style="text-align: left">设置监听服务器的端口号（参见 enable-query）。</td>
      </tr>
      <tr>
          <td style="text-align: left">rate-limit</td>
          <td style="text-align: left">整数</td>
          <td style="text-align: left">0</td>
          <td style="text-align: left">设置玩家被踢出服务器前，可以发送的数据包数量。 设置为0表示关闭此功能。</td>
      </tr>
      <tr>
          <td style="text-align: left">rcon.password</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">设置RCON远程访问的密码（参见enable-rcon）。</td>
      </tr>
      <tr>
          <td style="text-align: left">rcon.port</td>
          <td style="text-align: left">整数（1-65534)</td>
          <td style="text-align: left">25575</td>
          <td style="text-align: left">设置RCON远程访问的端口号。</td>
      </tr>
      <tr>
          <td style="text-align: left">require-resource-pack</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">当此选项启用（设为true）时，玩家会被提示作出选择（是否启用服务器资源包）。如果玩家拒绝则会被服务器断开连接。 但是，若玩家使用Linux系统加入服务器，游戏目录内的server-resource-packs没有写权限，则会提示“无法应用服务器资源包”“所有依赖自定义资源包的功能都有可能不按预期工作”，并提示玩家“继续”或“断开连接”。若玩家选择“继续”，则仍可在此服务器中游戏。</td>
      </tr>
      <tr>
          <td style="text-align: left">resource-pack</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">可选选项，可输入指向一个资源包的URI。</td>
      </tr>
      <tr>
          <td style="text-align: left">resource-pack-prompt</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">可选，用于在使用require-resource-pack时在资源包提示界面显示自定义信息。 与聊天组件语法一致，可以包含多行文本。</td>
      </tr>
      <tr>
          <td style="text-align: left">resource-pack-sha1</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">资源包的SHA-1值，必须为小写十六进制，建议填写它。这还没有用于验证资源包的完整性，但是它提高了资源包缓存的有效性和可靠性。</td>
      </tr>
      <tr>
          <td style="text-align: left">server-ip</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">将服务器与一个特定IP绑定。</td>
      </tr>
      <tr>
          <td style="text-align: left">server-port</td>
          <td style="text-align: left">整数（1-65534）</td>
          <td style="text-align: left">25565</td>
          <td style="text-align: left">改变服务器（监听的）端口号。</td>
      </tr>
      <tr>
          <td style="text-align: left">simulation-distance</td>
          <td style="text-align: left">整数（3-32）</td>
          <td style="text-align: left">10</td>
          <td style="text-align: left">设置服务端可更新实体范围的最大值，即玩家各个方向上的区块数量（是以玩家为中心的半径，不是直径）。</td>
      </tr>
      <tr>
          <td style="text-align: left">spawn-animals</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">决定动物是否可以生成。</td>
      </tr>
      <tr>
          <td style="text-align: left">spawn-monsters</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">决定攻击型生物（怪物）是否可以生成。</td>
      </tr>
      <tr>
          <td style="text-align: left">spawn-npcs</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">决定是否生成村民。 true - 启用。生成村民。 false - 禁用。不生成村民。</td>
      </tr>
      <tr>
          <td style="text-align: left">spawn-protection</td>
          <td style="text-align: left">整数</td>
          <td style="text-align: left">16</td>
          <td style="text-align: left">通过将该值进行2x+1的运算来决定出生点的保护半径。设置为1会保护以出生点为中心的3×3方块的区域，2会保护5×5方块的区域，3会保护7×7方块的区域。</td>
      </tr>
      <tr>
          <td style="text-align: left">sync-chunk-writes</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">启用后区块文件以同步模式写入。</td>
      </tr>
      <tr>
          <td style="text-align: left">text-filtering-config</td>
          <td style="text-align: left">字符串</td>
          <td style="text-align: left">空白</td>
          <td style="text-align: left">服务器中需要被屏蔽的文本。</td>
      </tr>
      <tr>
          <td style="text-align: left">use-native-transport</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">true</td>
          <td style="text-align: left">是否使用针对Linux平台的数据包收发优化。此选项仅会在Linux平台上生成。</td>
      </tr>
      <tr>
          <td style="text-align: left">view-distance</td>
          <td style="text-align: left">整数（3-32）</td>
          <td style="text-align: left">10</td>
          <td style="text-align: left">设置服务端发送给客户端的世界数据量，也就是设置玩家各个方向上的区块数量（是以玩家为中心的半径，不是直径）。</td>
      </tr>
      <tr>
          <td style="text-align: left">white-list</td>
          <td style="text-align: left">布尔值</td>
          <td style="text-align: left">false</td>
          <td style="text-align: left">启用服务器的白名单。</td>
      </tr>
  </tbody>
</table>
<h1 id="服务器滞后指标">服务器滞后指标</h1>
<h2 id="tps">TPS</h2>
<p>TPS：TickPerSecond。它也是服务器所有者可以直接控制唯一项目，下述指南专门用于提高 TPS。 服务器以 20 TPS 的速率处理所有任务。诸如怪物移动、作物生长和玩家与块的交互等任务需要由服务器Ticks才能正常运行。TPS 低于 20 意味着服务器运行滞后，必须跳过任务才能按时执行重要任务。</p>
<p><strong>20.0</strong> = 无卡顿</p>
<p><strong>19.95 - 19.99</strong> = 几乎无卡顿</p>
<p><strong>18.5 - 19.94</strong> = 一般。可能有一些卡顿，但对游戏无明显影响。</p>
<p><strong>16.0 - 18.4</strong> = 差。</p>
<h1 id="优化推荐">优化推荐</h1>
<p><strong>simulation-distance</strong>：模拟距离是服务器将在玩家周围互动的距离。</p>
<ul>
<li>推荐值: 4-8</li>
<li>性能影响: 中</li>
</ul>
<p><strong>view-distance</strong>：渲染距离。</p>
<ul>
<li>默认值: 10</li>
<li>推荐值: 4-8</li>
<li>性能影响: 重</li>
</ul>
<p><strong>network-compression-threshold</strong>：服务器尝试压缩之前限制数据包的大小。</p>
<ul>
<li>默认值：256</li>
<li>推荐值：64-128（过小容易造成过大的服务器 CPU 负担）</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Minecraft 本地虚拟化联机进阶玩法</title>
      <link>https://zoranzhou.com/posts/minecraft-local-project/</link>
      <pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://zoranzhou.com/posts/minecraft-local-project/</guid>
      <description>虚拟化 Minecraft 联机控制面板及其内网穿透</description>
      <content:encoded><![CDATA[<h1 id="传统方案">传统方案</h1>
<p>网上常见的联机方案是买一台 VPS 服务器，用它的公网 IP 来做联机映射。这种方法操作起来最简单，但 VPS 的配置往往和预算挂钩，预算有限的话，性能很难跟上 <strong>Minecraft</strong> 的运行需求。</p>
<p>既然如此，我们能否借助本地电脑的算力，用内网映射的方式来提升游戏性能，让联机体验更丝滑？</p>
<p>接下来，我将使用  <strong>VMware Workstation</strong>  搭建一台本地的  <strong>Minecraft</strong>  服务器。</p>
<p><strong>注：以下配置需要基础的交换网络技术功底！</strong></p>
<h1 id="安装-ubuntu-系统">安装 Ubuntu 系统</h1>
<p>在 VMware Workstation 上部署 Ubuntu 系统</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223184012710.png" alt="image-20251223184012710"  /></p>
<p>为了方便后续的内网传统，VM 选择桥接模式（该模式可以让虚拟机直接直连网卡，网卡通过有线网络连接路由器），最终实现的效果就是 Ubuntu 直连路由器。之后在 Ubuntu 图形化中修改 IP 地址与路由器同网段。</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223184828438.png" alt="image-20251223184828438"  /></p>
<p>桥接原理：</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223210655233.png" alt="image-20251223210655233"  /></p>
<p>之后在 Terminal 中安装控制面板套件：</p>
<pre tabindex="0"><code>sudo su -c &#34;wget -qO- https://script.mcsmanager.com/setup_cn.sh | bash&#34;

# 先启动面板守护进程。
# 这是用于进程控制，终端管理的服务进程。
systemctl start mcsm-daemon.service
# 再启动面板 Web 服务。
# 这是用来实现支持网页访问和用户管理的服务。
systemctl start mcsm-web.service

# 重启面板命令
systemctl restart mcsm-daemon.service
systemctl restart mcsm-web.service

# 停止面板命令
systemctl stop mcsm-web.service
systemctl stop mcsm-daemon.service
</code></pre><p>之后通过 <code>{IP}:23333</code> 访问控制面板，做初步配置。</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223190902081.png" alt="image-20251223190902081"  /></p>
<p>安装 Minecraft 所需的 JAVA JDK 21 环境</p>
<pre tabindex="0"><code>sudo apt install openjdk-21-jdk
java -version
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223192206195.png" alt="image-20251223192206195"  /></p>
<h1 id="nps-服务端配置">NPS 服务端配置</h1>
<p>VPS 防火墙请开启 80/443/8080/8024 端口，用于内网穿透映射</p>
<pre tabindex="0"><code>sudo ./nps install
The default configuration file of nps use 80，443，8080，8024 ports
80 and 443 ports for host mode default ports
8080 for web management access port
8024 for net bridge port, to communicate between server and client

配置conf/nps.conf
#web
web_username=xxx           //用户名
web_password=xxx           //密码
web_port = 8080         //默认8080端口登录
web_ip=0.0.0.0
</code></pre><p>NPS 开机自启</p>
<pre tabindex="0"><code>systemctl enable Nps
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223201913781.png" alt="image-20251223201913781"  /></p>
<p>防火墙端口开启，这里以阿里云为例：</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223201618757.png" alt="image-20251223201618757"  /></p>
<p>通过 {IP/域名}:8080 访问服务端控制面板，如下：</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223202018281.png" alt="image-20251223202018281"  /></p>
<p>创建客户端列表</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223202632165.png" alt="image-20251223202632165"  /></p>
<p>创建客户端隧道至 25565 端口（游戏默认25565端口，可按需修改）</p>
<p><strong>注</strong>：记得放行 25565 端口防火墙规则</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223202859258.png" alt="image-20251223202859258"  /></p>
<p>配置 Server Port</p>
<pre tabindex="0"><code>Server port: 25565
Target:{127.0.0.1/内网IP地址}:25565  // 25565 公网端口映射到私网 25565 端口
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223203109753.png" alt="image-20251223203109753"  /></p>
<h2 id="vm-ubuntu-nps-客户端服务">VM Ubuntu NPS 客户端服务</h2>
<p>安装 NPS Client ，按照 NPS Server 提示运行内网穿透配置</p>
<pre tabindex="0"><code>wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_386_client.tar.gz
./npc -server={服务端IP/域名}:8024 -vkey={秘钥信息} -type=tcp
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223210352889.png" alt="image-20251223210352889"  /></p>
<p>Ubuntu Terminal 中运行，保持虚拟机后台运行！</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223210044136.png" alt="image-20251223210044136"  /></p>
<h1 id="minecraft-服务端安装">Minecraft 服务端安装</h1>
<p>访问内网 IP:23333，进入 Mincraft 服务器控制面板。创建新实例</p>
<pre tabindex="0"><code>启动命令
java -jar xxx.jar   //具体请根据服务端文件名称填写
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223203352299.png" alt="image-20251223203352299"  /></p>
<p>上传服务端文件：</p>
<p>这里以 paper server 1.20.4 为例：</p>
<p><strong>下载地址：</strong></p>
<pre tabindex="0"><code>https://fill-data.papermc.io/v1/objects/cabed3ae77cf55deba7c7d8722bc9cfd5e991201c211665f9265616d9fe5c77b/paper-1.20.4-499.jar
</code></pre><p>上传至服务器文件根目录内启动服务：</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223203548710.png" alt="image-20251223203548710"  /></p>
<p>按照要求同意通用协议：</p>
<p><strong>这里只需要在配置服务端配置文件中打开即可！</strong></p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223203805442.png" alt="image-20251223203805442"  /></p>
<h1 id="总结">总结</h1>
<p>最终通过 Minecraft 多人服务器即可联机！</p>
<p>虽然总体上比较复杂，但可以最大化解决服务器配置不足的问题，只需要按需调整公网带宽即可。常规 1M 公网带宽可以支持 2-3 人原生服务器游玩。</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251223204230564.png" alt="image-20251223204230564"  /></p>
<h1 id="参考链接">参考链接</h1>
<p><strong>以下链接为所需要用到的原始下载链接：</strong></p>
<pre tabindex="0"><code>https://github.com/ehang-io/nps
https://docs.mcsmanager.com/zh_cn/
https://papermc.io/downloads/paper
</code></pre>]]></content:encoded>
    </item>
    
    <item>
      <title>自用 OPENWRT 编译流程分享</title>
      <link>https://zoranzhou.com/posts/openwrt-building/</link>
      <pubDate>Fri, 20 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://zoranzhou.com/posts/openwrt-building/</guid>
      <description>Ubuntu 虚拟机本地编译 Openwrt 系统</description>
      <content:encoded><![CDATA[<h1 id="openwrt编译">OpenWrt编译</h1>
<h2 id="前提条件">前提条件</h2>
<ol>
<li>Vmware Workstation 或者同类产品的虚拟化软件</li>
<li>已经安装好的Ubuntu 64bit 系统</li>
</ol>
<p><strong>警告：不要使用 root 用户去编译！</strong></p>
<pre tabindex="0"><code>sudo apt-get update
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync  //编译预配环境
</code></pre><h2 id="克隆-lede-仓库">克隆 Lede 仓库</h2>
<pre tabindex="0"><code>git clone https://github.com/coolsnowwolf/lede 
cd lede   //进入克隆好的仓库
</code></pre><p>编辑 feeds.conf.default</p>
<pre tabindex="0"><code>按照这个库去填，包含科学上网插件等等
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
src-git packages https://github.com/coolsnowwolf/packages
src-git luci https://github.com/coolsnowwolf/luci
src-git routing https://github.com/coolsnowwolf/routing
src-git telephony https://github.com/openwrt/telephony.git;openwrt-23.05
</code></pre><h2 id="编译">编译</h2>
<p>更新插件库，开始编译</p>
<pre tabindex="0"><code>./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209233905105.png" alt="image-20251209233905105"  /></p>
<p><code>Target System</code> : 选择系统架构，这里默认 x86 平台</p>
<p><code>Target Images</code> ：</p>
<pre tabindex="0"><code>ext4：小型 Linux，适合装软件，需要大空间，软路由/NAS 场景推荐。
Squashfs：系统不可直接写入，只能通过 overlay 存储配置和数据，适合跑在嵌入式、小闪存设备（刷机+恢复出厂设置玩法。
combined：boot 分区和 rootfs 合成在一起。刷在硬盘或者 U 盘可以直接启动。 x86架构装机默认推荐此版本，适合 SSD 启动。
generic：通用固件（非特定硬件化优化），适合搭配不同文件系统。
</code></pre><p>推荐选择方案：</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209234838229.png" alt="image-20251209234838229"  /></p>
<p>重要科学上网插件库路径：</p>
<pre tabindex="0"><code>LUCI/Applications/luci-app-xxx   //按需选择
第一次编译不推荐选择过多，建议删除非必要插件，提高编译成功率
</code></pre><pre tabindex="0"><code>编译清单
LuCI ---&gt; Applications ---&gt; luci-app-accesscontrol  #访问时间控制
LuCI ---&gt; Applications ---&gt; luci-app-acme  #ACME自动化证书管理环境（丢弃）
LuCI ---&gt; Applications ---&gt; luci-app-adblock   #ADB广告过滤
...（略）

来自：https://www.right.com.cn/forum/thread-344825-1-1.html
</code></pre><p>下载编译所需要的文件</p>
<pre tabindex="0"><code>make -j8 download V=s   // 8 代表八线程
make -j1 V=s   //编译，第一次推荐使用一线程，方便检查报错信息，如果报错请删除报错的插件
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209235924990.png" alt="image-20251209235924990"  /></p>
<p>编译结束后在此文件夹中可见导出文件：</p>
<pre tabindex="0"><code>/lede/bin/target/x86/64/
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251210000129216.png" alt="image-20251210000129216"  /></p>
<h3 id="二次编译">二次编译：</h3>
<pre tabindex="0"><code>./scripts/feeds update -a &amp;&amp; ./scripts/feeds install -a             # 更新Feeds
rm -rf ./tmp &amp;&amp; rm -rf .config                                      # 清除编译配置和缓存
make menuconfig                                                      # 进入编译配置菜单
make -j8 download
make -j$(($(nproc) + 1)) V=s
</code></pre><h3 id="更改配置编译">更改配置编译</h3>
<pre tabindex="0"><code>cd lede
rm -rf ./tmp &amp;&amp; rm -rf .config
make menuconfig
make -j$(($(nproc) + 1)) V=s
</code></pre><h3 id="更改-lan-口默认-ip-地址">更改 LAN 口默认 IP 地址</h3>
<pre tabindex="0"><code>cd lede
vim package/base-files/files/bin/config_generate
</code></pre><p><strong>默认密码</strong>：password</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Waline 评论系统嵌入 BLOG 方案</title>
      <link>https://zoranzhou.com/posts/waline-review-system/</link>
      <pubDate>Thu, 02 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://zoranzhou.com/posts/waline-review-system/</guid>
      <description>使用 Waline方案，涉及 Vercel &#43; LeanCloud</description>
      <content:encoded><![CDATA[<h1 id="waline-评论系统">Waline 评论系统</h1>
<p>Waline 是一个基于 LeanCloud 等后端的无后端评论系统，在 Hugo 等静态站点中非常流行。</p>
<p>优势：</p>
<ul>
<li>前端资源小，加载快；</li>
<li>云端存储，无需部署数据库；</li>
<li>支持托管后台，配合 LeanCloud 效果很好；</li>
<li>支持多种样式；</li>
<li>支持游客或者QQ/微博等登录方式；</li>
</ul>
<p>我选择此方案原因是支持社交媒体登录，评论区样式美观~</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209172100285.png" alt="image-20251209172100285"  /></p>
<h1 id="部署流程">部署流程</h1>
<h2 id="创建-leancloud-账号">创建 LeanCloud 账号</h2>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/leancloud-1-CucZPnJ0.png" alt="创建应用"  /></p>
<pre tabindex="0"><code>获取三个 API
AppID
AppKey
MasterKey
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/leancloud-2-C9bCeSu_.png" alt="ID 和 Key"  /></p>
<p><strong>国内版需要完成备案接入：</strong></p>
<p>如果你正在使用 Leancloud 国内版 (<a href="https://leancloud.cn/">leancloud.cn</a>)，推荐你切换到国际版 (<a href="https://leancloud.app/">leancloud.app</a>)。否则，你需要为应用额外绑定已备案的域名，同时购买独立 IP 并完成备案接入:</p>
<ul>
<li>登录国内版并进入需要使用的应用</li>
<li>选择 <code>设置</code> &gt; <code>域名绑定</code> &gt; <code>API 访问域名</code> &gt; <code>绑定新域名</code> &gt; 输入域名 &gt; <code>确定</code>。</li>
<li>按照页面上的提示按要求在 DNS 上完成 CNAME 解析。</li>
<li>购买独立 IP 并提交工单完成备案接入。(独立 IP 目前价格为 ￥ 50/个/月)</li>
</ul>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/leancloud-3-CT_lZM0A.png" alt="域名设置"  /></p>
<h2 id="vercel部署服务端">Vercel部署（服务端）</h2>
<p>输入个人喜好的 Vercel 项目名称，并且创建</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209172854011.png" alt="image-20251209172854011"  /></p>
<p>点击顶部的 <code>Settings</code> - <code>Environment Variables</code> 进入环境变量配置页，并配置三个环境变量 <code>LEAN_ID</code>, <code>LEAN_KEY</code> 和 <code>LEAN_MASTER_KEY</code> 。它们的值分别对应上一步在 LeanCloud 中获得的 <code>APP ID</code>, <code>APP KEY</code>, <code>Master Key</code>。</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/vercel-5-CIj2EZQq.png" alt="设置环境变量"  /></p>
<p>环境变量配置完成之后点击顶部的 <code>Deployments</code> 点击顶部最新的一次部署右侧的 <code>Redeploy</code> 按钮进行重新部署。该步骤是为了让刚才设置的环境变量生效。</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/vercel-6-CQnJ4Agt.png" alt="redeploy"  /></p>
<p>此时会跳转到 <code>Overview</code> 界面开始部署，等待片刻后 <code>STATUS</code> 会变成 <code>Ready</code>。此时请点击 <code>Visit</code> ，即可跳转到部署好的网站地址，此地址即为你的服务端地址。</p>
<h3 id="绑定域名可选">绑定域名（可选）</h3>
<ol>
<li>点击顶部的 <code>Settings</code> - <code>Domains</code> 进入域名配置页</li>
<li>输入需要绑定的域名并点击 <code>Add</code></li>
</ol>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/vercel-8-BDTeHH3e.png" alt="Add domain"  /></p>
<p>最终可以通过域名访问评论系统和管理系统：</p>
<ul>
<li>评论系统：example.yourdomain.com</li>
<li>评论管理：example.yourdomain.com/ui</li>
</ul>
<p>注：第一个注册的用户默认为管理员！！！</p>
<h1 id="嵌入html">嵌入HTML</h1>
<pre tabindex="0"><code>嵌入Html文件路径
创建 waline.html
/layouts/partials/comments.html  //取决于theme网页结构
</code></pre><h2 id="walinehtml">Waline.html</h2>
<pre tabindex="0"><code>&lt;!-- Waline Comment System --&gt;
&lt;link
  rel=&#34;stylesheet&#34;
  href=&#34;https://unpkg.com/@waline/client@v3/dist/waline.css&#34;
/&gt;

&lt;div id=&#34;waline&#34;&gt;&lt;/div&gt;

&lt;script type=&#34;module&#34;&gt;
  import { init } from &#39;https://unpkg.com/@waline/client@v3/dist/waline.js&#39;;

  init({
    el: &#39;#waline&#39;,
    serverURL: &#39;{{ .serverURL }}&#39;,   //从 config.toml 获取
    locale: &#39;{{ .locale | default &#34;en&#34; }}&#39;,
    dark: &#39;{{ .dark | default &#34;auto&#34; }}&#39;,
  });
&lt;/script&gt;
</code></pre><h2 id="commentshtml">Comments.html</h2>
<pre tabindex="0"><code>  {{- if $pageCommentSystems.waline }}
    {{- with .waline }}
      {{- partial &#34;waline.html&#34; . }}
</code></pre><p>本教程参考网站：https://waline.js.org/en/guide/get-started</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>从零开始搭建你的免费 BLOG 博客（Github&#43;Cloudflare）</title>
      <link>https://zoranzhou.com/posts/building-blog/</link>
      <pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://zoranzhou.com/posts/building-blog/</guid>
      <description>基于 GitHub 与 Cloudflare 的静态站点部署方案（Hugo）</description>
      <content:encoded><![CDATA[<h1 id="前言">前言</h1>
<p>由于我是长期 VPS 服务器的持有用户，最开始我尝试使用阿里云的 VPS 服务器作为平台作为Hugo Blog站点，随着部署的过程和最终的效果呈现，我觉得存在以下几方面的问题：</p>
<ul>
<li>性能受限于 VPS 的性能配置；</li>
<li>使用 HTTPS，需要在 WEB 服务上配置 https 证书；</li>
<li>发布内容繁琐复杂，后台数据更新不够及时，依赖于脚本；</li>
<li>网页可靠性较低；</li>
<li>与 VPS 其他部署的服务部分处在冲突。</li>
</ul>
<p><strong>最后我选择 GitHub Pages 配合 Cloudflare 托管的方案实现 BLOG 的搭建。可以解决以上所以问题，重要的是免费！</strong></p>
<h1 id="github--cloudflare">GitHub + Cloudflare</h1>
<h2 id="注册配置-github-仓库">注册配置 GitHub 仓库</h2>
<pre tabindex="0"><code>Respsitory name： example.com （自定义填写Blog网站的仓库名）
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209154251574.png" alt="image-20251209154251574"  /></p>
<h2 id="安装-git">安装 Git</h2>
<h3 id="安装-git-1">安装 Git</h3>
<p>后续为了方便本地化管理 GitHub仓库。</p>
<pre tabindex="0"><code>官网地址：https://git-scm.com/
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209155117127.png" alt="image-20251209155117127"  /></p>
<h3 id="本地-ssh-秘钥">本地 SSH 秘钥</h3>
<p>在 Windows 本地使用 cmd 生成本地 SSH 秘钥</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209155528735.png" alt="image-20251209155528735"  /></p>
<h3 id="设置-ssh-keys">设置 SSH keys</h3>
<p>在 GitHub 设置的 SSH and GPG keys 中填写生成的秘钥 SSH Keys</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209155251700.png" alt="image-20251209155251700"  /></p>
<p><strong>之后就可以通过 Git 命令，https 上传文件到仓库了~</strong></p>
<h2 id="hugo-主题">Hugo 主题</h2>
<p>在 Hugo themes 中挑选自己合适的主题，作为BLOG的模版。</p>
<pre tabindex="0"><code>https://themes.gohugo.io/
</code></pre><p>本网站主题如下：</p>
<pre tabindex="0"><code>https://github.com/reorx/hugo-PaperModX
</code></pre><h3 id="git-拉取仓库">Git 拉取仓库</h3>
<pre tabindex="0"><code>git clone https://github.com/reorx/hugo-PaperModX.git
</code></pre><p><strong>文件格式</strong></p>
<ul>
<li><strong>content</strong>：存储posts等</li>
<li><strong>data</strong>：社交媒体的配置</li>
<li><strong>layouts</strong>：整个静态网页的布局（重要！）</li>
<li><strong>assets</strong>：存储 css，js 文件，默认 toml 拉取头像</li>
<li><strong>i18n</strong>：多语言</li>
<li>我这里选择覆盖 ExampleSite 和仓库根目录，具体不同 theme 会有不同的配置方案。该教程不适配任何主题。</li>
</ul>
<h3 id="拉取文件到-github">拉取文件到 GitHub</h3>
<ol>
<li><strong>git init</strong> ：在此文件夹生成一个.git隐藏文件；</li>
<li><strong>git add .</strong> : 将文件添加到缓存区( 注意这个&quot;.&quot;，是有空格的，&quot;.&ldquo;代表这个test这个文件夹下的目录全部都提交，也可以通过git add 文件名 提交指定的文件)；</li>
<li><strong>git status</strong>：查看现在的状态，也可以不看，随你啦，可以看到picture文件夹里面的内容都提交上去了；</li>
<li><strong>git commit -m</strong> &ldquo;这里是注释&rdquo;：提交添加到缓存区的文件；</li>
<li><strong>git remote add origin remote_url</strong> ： 添加新的git方式的origin, github上创建好的仓库和本地仓库进行关联；</li>
<li><strong>git push origin main</strong>：推送文件到仓库。</li>
</ol>
<p><strong>注：</strong></p>
<ul>
<li>第4步可能会让你配置个人信息，否则无法推送文件，具体请看 CLI 提示。</li>
<li>确保推送的仓库主分支和 CLI 一致。</li>
</ul>
<h2 id="配置-toml-文件">配置 toml 文件</h2>
<pre tabindex="0"><code>title = &#34;ZORAN&#34;  //BLOG标题
baseURL = &#34;https://zoranzhou.com/&#34;  //主网站信息
languageCode = &#34;en-us&#34;
defaultContentLanguage = &#34;en&#34;
enableEmoji = true
ignoreErrors = [&#34;additional-script-loading-error&#34;]
disqusShortname = &#34;&#34;

[pagination]  //主页显示文章数量
pagerSize = 10

##############################
# Params
##############################
[params]
TocSide = &#34;left&#34;   //左对齐
EnableInstantClick = false  //这里因为加了waline方案，所以需要false，确保html正确的刷新出来

# --- Logo ---
[params.logo] 
icon = &#34;favicon.png&#34; //存储在assets/favicon.png
iconWidth = 128        
iconHeight = 128
text = &#34;&#34;             

##############################
# Menu 确保导航分页都正常显示
##############################
[menu]

  [[menu.main]]
  name = &#34;Home&#34;
  url = &#34;/&#34;
  weight = 1

  [[menu.main]]
  name = &#34;Blog&#34;
  url = &#34;/posts/&#34;
  weight = 2
  
  [[menu.main]]
  name = &#34;Archives&#34;
  url = &#34;/archives/&#34;
  weight = 3
    [menu.main.params]
    external = false

# --- Social Icons --- 社交媒体配置
[[params.social]]
name = &#34;github&#34;
url = &#34;xxx&#34;

[[params.social]]
name = &#34;twitter&#34;
url = &#34;xxx&#34;

##############################
# Comments 评论区方案（可选）
##############################
[params.commentSystems.waline]
serverURL = &#34;xxx&#34; 评论区后台URL
locale = &#34;en&#34;

[params.defaultCommentSystems]
waline = true
</code></pre><h2 id="其他常用属性">其他常用属性</h2>
<h3 id="theme-switch-toggle-白天夜晚主题相关">Theme Switch Toggle (白天夜晚主题相关)</h3>
<p>Shows icon besides title of page to change theme</p>
<p>To disable it :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">disableThemeToggle</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>You can refer following table for better understanding&hellip;</p>
<table>
  <thead>
      <tr>
          <th><code>defaultTheme</code></th>
          <th><code>disableThemeToggle</code></th>
          <th>checks local storage?</th>
          <th>checks system theme?</th>
          <th>Info</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>auto</code></td>
          <td>true</td>
          <td>No</td>
          <td>Yes</td>
          <td>only system theme</td>
      </tr>
      <tr>
          <td></td>
          <td>false</td>
          <td>Yes (if not-&gt;2)</td>
          <td>Yes (2)</td>
          <td><em>switch present</em></td>
      </tr>
      <tr>
          <td><code>dark</code></td>
          <td>true</td>
          <td>No</td>
          <td>No</td>
          <td>force dark only</td>
      </tr>
      <tr>
          <td></td>
          <td>false</td>
          <td>Yes</td>
          <td>No</td>
          <td><em>switch present</em></td>
      </tr>
      <tr>
          <td><code>light</code></td>
          <td>true</td>
          <td>No</td>
          <td>No</td>
          <td>force light only</td>
      </tr>
      <tr>
          <td></td>
          <td>false</td>
          <td>Yes</td>
          <td>No</td>
          <td><em>switch present</em></td>
      </tr>
  </tbody>
</table>
<h3 id="archives-layout存档页面布局">Archives Layout（存档页面布局）</h3>
<p>Create a page with <code>archive.md</code> in <code>content</code> directory with following content</p>
<pre tabindex="0"><code>.
├── config.toml
├── content/
│   ├── archives.md   &lt;--- Create archive.md here
│   └── posts/
 ── static/
</code></pre><p>and add the following to it</p>
<pre tabindex="0"><code>---
title: &#34;Archive&#34;
layout: &#34;archives&#34;
url: &#34;/archives/&#34;
summary: archives
---
</code></pre><p><strong>注</strong>：Archives 布局不支持多语言月份翻译。</p>
<h3 id="search-page-搜索">Search Page （搜索）</h3>
<p>PaperModX uses <a href="https://fusejs.io/getting-started/different-builds.html#explanation-of-different-builds">Fuse.js Basic</a> for seach functionality</p>
<p>Add the following to site config, <code>config.yml</code></p>
<pre tabindex="0"><code>[outputs]
  home = [&#34;HTML&#34;, &#34;JSON&#34;,&#34;RSS&#34;]
</code></pre><p>Create a page with <code>search.md</code> in <code>content</code> directory with following content.</p>
<pre tabindex="0"><code>---
title: &#34;Search&#34; # in any language you want
layout: &#34;search&#34; # is necessary
# url: &#34;/archive&#34;
# description: &#34;Description for Search&#34;
summary: &#34;search&#34;
---
</code></pre><p>To hide a particular page from being searched, add it in post&rsquo;s fron&rsquo;t matter</p>
<pre tabindex="0"><code>searchHidden: true
</code></pre><h3 id="share-buttons-on-post-分享按钮">Share Buttons on post （分享按钮）</h3>
<p>Displays Share Buttons at Bottom of each post</p>
<p>to show share buttons add</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">params</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ShowShareButtons</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><hr>
<h3 id="show-post-reading-time-显示阅读时间">Show post reading time （显示阅读时间）</h3>
<p>Displays Reading Time (the estimated time, in minutes, it takes to read the content.)</p>
<p>To show reading time add</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">Params</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ShowReadingTime</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><hr>
<h3 id="show-table-of-contents-toc-on-blog-post-目录">Show Table of Contents (Toc) on blog post （目录）</h3>
<p>Displays ToC on blog-pages</p>
<p>To show ToC add following to page-variables</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">ShowToc</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>To keep Toc Open <strong>by default</strong> on a post add following to page-variables:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">TocOpen</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><h3 id="breadcrumb-navigation-返回主页">BreadCrumb Navigation （返回主页）</h3>
<p>Adds BreadCrumb Navigation above Post&rsquo;s Title to show subsections and Navigation to Home</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">params</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ShowBreadCrumbs</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>Can be diabled for particular page&rsquo;s front-matter</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">ShowBreadCrumbs</span>: <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><h2 id="cloudflare配置">Cloudflare配置</h2>
<h3 id="workers--pages">Workers &amp; Pages</h3>
<p>配置workers &amp; Pages</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209161458013.png" alt="image-20251209161458013"  /></p>
<p>链接 GitHub 仓库</p>
<p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209161531167.png" alt="image-20251209161531167"  /></p>
<p>选择刚才创建好的仓库</p>
<pre tabindex="0"><code>Project name：随意
Production branch：选择正确的分支
Framework preset：选择Hugo
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209161700588.png" alt="image-20251209161700588"  /></p>
<p>之后默认部署即可</p>
<h3 id="添加自定义域名">添加自定义域名</h3>
<pre tabindex="0"><code>填写自己拥有的域名即可，Cloudflare会自动化处理。
</code></pre><p>
  <img loading="lazy" src="https://e5d9f02.webp.fi/image-20251209162312838.png" alt="image-20251209162312838"  /></p>
<hr>
<p><strong>最后就可以通过域名访问到 BLOG了！</strong></p>
<hr>
<h2 id="cloudflare-r2-对象存储--webp-cloud-代理加速">Cloudflare R2 对象存储 + WebP Cloud 代理加速</h2>
<p>随着博客内容的增加，图片资源的存储和加载速度成为影响用户体验的关键因素。这里介绍一套免费的图片存储与加速方案：<strong>Cloudflare R2</strong> 配合 <strong>WebP Cloud</strong> 代理。</p>
<h3 id="为什么需要这套方案">为什么需要这套方案？</h3>
<ul>
<li><strong>GitHub 仓库限制</strong>：大量图片会增加仓库体积，影响克隆和部署速度</li>
<li><strong>加载速度</strong>：直接从 GitHub 或 Cloudflare Pages 加载图片，跨国访问速度不稳定</li>
<li><strong>格式优化</strong>：现代浏览器支持 WebP 格式，体积更小，加载更快</li>
<li><strong>成本考量</strong>：R2 提供 10GB 免费存储，WebP Cloud 提供免费代理转换服务</li>
</ul>
<h3 id="cloudflare-r2-配置">Cloudflare R2 配置</h3>
<p>R2 是 Cloudflare 提供的兼容 S3 API 的对象存储服务。</p>
<h4 id="创建-r2-存储桶">创建 R2 存储桶</h4>
<ol>
<li>登录 Cloudflare Dashboard，进入 <strong>R2</strong> 页面</li>
<li>点击 <strong>Create bucket</strong>，输入存储桶名称（如 <code>blog-storage</code>）</li>
<li>选择存储桶位置，建议选 <strong>Automatic</strong> 让 Cloudflare 自动优化</li>
</ol>
<h4 id="配置公开访问">配置公开访问</h4>
<p>R2 默认是私有的，需要配置公开访问才能通过 URL 直接访问图片：</p>
<ol>
<li>进入存储桶设置，找到 <strong>Public Access</strong> 选项</li>
<li>开启 <strong>Allow Public Access</strong></li>
<li>绑定自定义域名（推荐）：
<ul>
<li>在 <strong>Custom Domains</strong> 中添加你的子域名，如 <code>images.yourdomain.com</code></li>
<li>或者使用 WebP Cloud 提供的代理域名</li>
</ul>
</li>
</ol>
<h4 id="获取-api-凭证">获取 API 凭证</h4>
<p>用于通过 API 上传图片：</p>
<ol>
<li>进入 <strong>R2</strong> → <strong>Manage R2 API Tokens</strong></li>
<li>点击 <strong>Create API Token</strong></li>
<li>选择 <strong>Object Read &amp; Write</strong> 权限</li>
<li>复制 <strong>Access Key ID</strong> 和 <strong>Secret Access Key</strong></li>
</ol>
<p><strong>API 连接信息示例：</strong></p>
<pre tabindex="0"><code>Account ID: your-account-id
Access Key ID: your-access-key
Secret Access Key: your-secret-key
Bucket: blog-storage
S3 API Endpoint: https://your-account-id.r2.cloudflarestorage.com
</code></pre><h4 id="上传图片到-r2">上传图片到 R2</h4>
<p>可以使用多种方式上传：</p>
<p><strong>方式一：Cloudflare Dashboard 网页上传</strong></p>
<ul>
<li>适合偶尔上传少量图片</li>
</ul>
<p><strong>方式二：AWS CLI / boto3 脚本</strong></p>
<ul>
<li>适合批量上传和自动化工作流</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> boto3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>s3 <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;s3&#39;</span>,
</span></span><span style="display:flex;"><span>    endpoint_url<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;https://your-account-id.r2.cloudflarestorage.com&#39;</span>,
</span></span><span style="display:flex;"><span>    aws_access_key_id<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;your-access-key&#39;</span>,
</span></span><span style="display:flex;"><span>    aws_secret_access_key<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;your-secret-key&#39;</span>,
</span></span><span style="display:flex;"><span>    region_name<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;auto&#39;</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 上传文件</span>
</span></span><span style="display:flex;"><span>s3<span style="color:#f92672">.</span>upload_file(<span style="color:#e6db74">&#39;local-image.jpg&#39;</span>, <span style="color:#e6db74">&#39;blog-storage&#39;</span>, <span style="color:#e6db74">&#39;image-20250101.jpg&#39;</span>)
</span></span></code></pre></div><p><strong>方式三：第三方工具（如 rclone、Cyberduck）</strong></p>
<ul>
<li>图形化界面，操作直观</li>
</ul>
<h3 id="webp-cloud-代理加速">WebP Cloud 代理加速</h3>
<p>WebP Cloud（webp.fi）是一个免费的图片代理服务，可以自动将图片转换为 WebP 格式，并提供全球 CDN 加速。</p>
<h4 id="配置-webp-cloud">配置 WebP Cloud</h4>
<ol>
<li>访问 <a href="https://webp.fi">WebP Cloud</a> 官网</li>
<li>注册账号并添加你的 R2 存储桶作为源站</li>
<li>配置自定义域名（可选）</li>
</ol>
<h4 id="使用方式">使用方式</h4>
<p>假设你的 R2 图片原始链接是：</p>
<pre tabindex="0"><code>https://your-bucket.your-account-id.r2.cloudflarestorage.com/image.jpg
</code></pre><p>通过 WebP Cloud 代理后：</p>
<pre tabindex="0"><code>https://your-proxy.webp.fi/image.jpg
</code></pre><p>WebP Cloud 会自动：</p>
<ul>
<li>将图片转换为 WebP 格式（浏览器支持时）</li>
<li>压缩图片体积</li>
<li>通过 Cloudflare CDN 全球加速</li>
</ul>
<h4 id="在博客中使用">在博客中使用</h4>
<p>在 Hugo 的 Markdown 文章中引用：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>![<span style="color:#f92672">图片描述</span>](<span style="color:#a6e22e">https://your-proxy.webp.fi/image-20250101.jpg</span>)
</span></span></code></pre></div><h3 id="完整工作流示例">完整工作流示例</h3>
<ol>
<li><strong>撰写文章</strong>时，将图片保存到本地</li>
<li><strong>上传图片</strong>到 R2 存储桶</li>
<li><strong>获取 WebP Cloud 代理链接</strong></li>
<li><strong>在 Markdown 中引用</strong>代理链接</li>
<li><strong>部署博客</strong>，图片会自动通过 WebP Cloud 加速加载</li>
</ol>
<h3 id="成本与限额">成本与限额</h3>
<table>
  <thead>
      <tr>
          <th>服务</th>
          <th>免费额度</th>
          <th>超出后</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cloudflare R2</td>
          <td>10GB 存储/月</td>
          <td>$0.015/GB/月</td>
      </tr>
      <tr>
          <td>Cloudflare R2</td>
          <td>100 万次请求/月</td>
          <td>$0.36/百万次</td>
      </tr>
      <tr>
          <td>WebP Cloud</td>
          <td>无限（目前免费）</td>
          <td>免费</td>
      </tr>
  </tbody>
</table>
<p>对于个人博客来说，免费额度完全够用。</p>
<h3 id="总结">总结</h3>
<p>这套方案的优势：</p>
<ul>
<li>✅ <strong>完全免费</strong>：R2 + WebP Cloud 对个人用户免费</li>
<li>✅ <strong>全球加速</strong>：Cloudflare CDN 覆盖全球</li>
<li>✅ <strong>自动优化</strong>：WebP 格式自动压缩，提升加载速度</li>
<li>✅ <strong>兼容性好</strong>：S3 API 标准，工具生态丰富</li>
<li>✅ <strong>与现有工作流集成</strong>：不影响 Hugo + GitHub + Cloudflare Pages 的部署流程</li>
</ul>
<p>通过这套方案，你的博客图片可以实现快速、稳定、低成本的全球分发。</p>
<hr>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
