<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare on 快乐宅家</title><link>https://blog.zhaijia.fun/tags/cloudflare/</link><description>Recent content in Cloudflare on 快乐宅家</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 01 May 2022 18:37:23 +0800</lastBuildDate><atom:link href="https://blog.zhaijia.fun/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>实战教程: 个人博客问题修正 pt.1</title><link>https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/</link><pubDate>Sun, 01 May 2022 18:37:23 +0800</pubDate><guid>https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/</guid><description>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/feat-img.jpg" alt="Featured image of post 实战教程: 个人博客问题修正 pt.1" />&lt;p>在完整经历了下面三个部分的系列教程后, 任何人应该已可访问你的静态博客:&lt;/p>
&lt;ul>
&lt;li>pt.1 - &lt;a class="link" href="../tutorial-how-to-build-a-personal-blog-part-1/" >创建本地博客网站项目&lt;/a>
&lt;ul>
&lt;li>使用 Hugo 构建静态博客.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pt.2 - &lt;a class="link" href="../tutorial-how-to-build-a-personal-blog-part-2/" >同步静态博客至 QNAP NAS&lt;/a>
&lt;ul>
&lt;li>使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pt.3 - &lt;a class="link" href="../tutorial-how-to-build-a-personal-blog-part-3/" >同步静态博客至 Backblaze B2 和 Cloudflare&lt;/a>
&lt;ul>
&lt;li>使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>一切看上去都很完美, 不论是 Hugo 构建, Qsync 同步 还是 HBS 3 (Hybrid Backup Sync 3) 同步.&lt;/p>
&lt;p>但在深入查看了同步至 Backblaze B2 的静态博客文件后, 却发现其中存在着不需要的隐藏文件, 比如 .bzEmpty, 或者某些深层次的错乱目录结构. 虽然这并不影响对静态博客的访问, 但同步这些文件却要消耗事务次数以及更多的时间.&lt;/p>
&lt;p>另外, 由于每当 Hugo 构建时, 都会更改图片等文件的修改时间, 这导致 Qsync 和 HBS 3 (Hybrid Backup Sync 3) 均认为相应的文件被更新, 从而触发上传/同步. 这同样会消耗事务次数以及更多的时间.&lt;/p>
&lt;p>以上这些问题暂时没法解决, 那么就只好从其他角度考虑解决方案了.&lt;/p>
&lt;p>这里暂时搁置 Qsync 同步的问题, 毕竟 QNAP NAS 通常部署在 LAN, 因此即便多些同步时间还是可忍受的, 而 HBS 3 (Hybrid Backup Sync 3) 却可使用 rclone 来代替, 唯一的缺点是暂时不能在 QNAP NAS 上运行 rclone.&lt;/p>
&lt;blockquote>
&lt;p>&lt;em>&lt;strong>注意:&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>请勿照抄, 务必将其替换为你自己的域名!&lt;/strong>&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;h2 id="安装-kapitainsky-rclone-browser">安装 Kapitainsky rclone browser&lt;/h2>
&lt;p>&lt;a class="link" href="https://github.com/kapitainsky/RcloneBrowser" target="_blank" rel="noopener"
>Kapitainsky rclone browser&lt;/a> 是一个跨平台, 带 UI 的 rclone 应用, 支持主流的桌面系统:&lt;/p>
&lt;ul>
&lt;li>MacOS&lt;/li>
&lt;li>GNU/Linux&lt;/li>
&lt;li>BSD family&lt;/li>
&lt;li>Windows&lt;/li>
&lt;/ul>
&lt;p>这里以 MacOS 为例, 演示该应用的安装和使用.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install kapitainsky-rclone-browser --cask
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="使用-kapitainsky-rclone-browser">使用 Kapitainsky rclone browser&lt;/h2>
&lt;h3 id="配置">配置&lt;/h3>
&lt;p>首次启动 Kapitainsky rclone browser (应用名为 Rclone Browser), 可能会提示无法确认 rclone 的版本, 并弹出设置窗口.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-1.png"
width="2244"
height="1372"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-1_hu54299e7b0078b82ebaf2c45d47cf4a4b_196222_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-1_hu54299e7b0078b82ebaf2c45d47cf4a4b_196222_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;blockquote>
&lt;p>rclone location: /usr/local/bin/rclone&lt;/p>
&lt;p>rclone.conf location: 填写一个你方便记忆的路径, 比如: ~/rclone.conf, 这个文件无需创建, 可直接使用后面的示例文件.&lt;/p>
&lt;/blockquote>
&lt;p>点击 &amp;ldquo;OK&amp;rdquo;.&lt;/p>
&lt;p>此时可点击 &amp;ldquo;Config&amp;hellip;&amp;rdquo; 创建 rclone.conf, 这是一个冗长的过程, 其中可以设置很多选项. 不过大部分选项其实只使用默认值即可, 因此可直接使用下面的 rclone.conf, 保存到前面设置窗口里的 rclone.conf location 即可:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>B2-blog-zhaijia-fun&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">type&lt;/span> &lt;span class="o">=&lt;/span> b2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">account&lt;/span> &lt;span class="o">=&lt;/span> &amp;lt;Backblaze B2 中已创建的 keyID&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">key&lt;/span> &lt;span class="o">=&lt;/span> &amp;lt;Backblaze B2 中已创建的 applicationKey&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">hard_delete&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">download_url&lt;/span> &lt;span class="o">=&lt;/span> https://blog.zhaijia.fun
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>第一行是配置名称, 随意.&lt;/p>
&lt;p>account, key 请按说明填写.&lt;/p>
&lt;p>hard_delete = true, 删除远程存储库文件时, 真正删除而不是转为隐藏文件.&lt;/p>
&lt;/blockquote>
&lt;p>点击 &amp;ldquo;Refresh&amp;rdquo;, 即可显示出上面的配置.&lt;/p>
&lt;h3 id="创建同步任务">创建同步任务&lt;/h3>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-2.png"
width="2244"
height="1372"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-2_hu372ce5d75c2075b6826470c1d466522a_45483_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-2_hu372ce5d75c2075b6826470c1d466522a_45483_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;p>选中该配置, 点击 &amp;ldquo;Open&amp;rdquo;, 会在一个新的标签页中打开它.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-3.png"
width="2244"
height="1372"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-3_hu407e62151eb9cdba3194133f94e68603_67627_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-3_hu407e62151eb9cdba3194133f94e68603_67627_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;p>等待一会儿, 直到远程存储库加载完毕, 选中它, 点击工具栏上的 &amp;ldquo;Upload&amp;rdquo;.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-4.png"
width="2244"
height="1372"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-4_hu2353c87f04a6503b238572c1153e16f3_243713_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-4_hu2353c87f04a6503b238572c1153e16f3_243713_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;blockquote>
&lt;p>Source: 选择本地 Hugo 构建静态网站的默认发布目录 public, &lt;em>&lt;strong>末尾必须要添加一个 &amp;ldquo;/&amp;rdquo;&lt;/strong>&lt;/em>.&lt;/p>
&lt;p>Destination: 远程存储库名, &lt;em>&lt;strong>必须以 &amp;ldquo;/&amp;rdquo; 结尾&lt;/strong>&lt;/em>.&lt;/p>
&lt;p>Mode: 勾选 &amp;ldquo;Sync&amp;rdquo;.&lt;/p>
&lt;p>勾选 &amp;ldquo;Compare&amp;rdquo; (该项默认为选中), 右侧下拉, 选择 &amp;ldquo;Size &amp;amp; checksum&amp;rdquo;.&lt;/p>
&lt;p>Task description: 同步 blog.zhaijia.fun&lt;/p>
&lt;/blockquote>
&lt;p>点击 &amp;ldquo;Save task&amp;rdquo;.&lt;/p>
&lt;h3 id="运行同步任务">运行同步任务&lt;/h3>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-5.png"
width="2244"
height="1372"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-5_hu911e24f9ebdec81fb49144c9cf5e7adb_56451_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-5_hu911e24f9ebdec81fb49144c9cf5e7adb_56451_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;h4 id="模拟运行">模拟运行&lt;/h4>
&lt;p>点击 &amp;ldquo;Dry Run&amp;rdquo;, 只是模拟并未真正运行.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-6.png"
width="2244"
height="1372"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-6_hu58aa0ad450bcafc3f9465ab055122087_159017_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/rclone-browser-6_hu58aa0ad450bcafc3f9465ab055122087_159017_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;p>查看日志, 可看到类似:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">2022/05/01 13:10:53 NOTICE: p/tutorial-how-to-build-a-personal-blog-part-3/.bzEmpty: Skipped delete as --dry-run is &lt;span class="nb">set&lt;/span> &lt;span class="o">(&lt;/span>size 0&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>意为将从远程存储库删除该文件, 但实际上略过了, 因为现在是模拟运行 (&amp;ndash;dry-run).&lt;/p>
&lt;p>最后可看到类似:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">2022/05/01 13:10:53 INFO : There was nothing to transfer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>意为当前并无可同步的目录/文件.&lt;/p>
&lt;p>这是因为 rclone 通过文件大小与校验和 (Size &amp;amp; checksum) 的检查发现两方的目录/文件是相同的, 即使两方的修改时间不同. 这种检查方式相比 Qsync 和 HBS 3 (Hybrid Backup Sync 3) 更加精确, 高效.&lt;/p>
&lt;h4 id="正式运行">正式运行&lt;/h4>
&lt;p>点击 &amp;ldquo;Run&amp;rdquo;, 真正执行同步.&lt;/p>
&lt;p>查看日志, 即可浏览同步详情.&lt;/p></description></item><item><title>实战教程: 搭建个人博客 pt.3</title><link>https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/</link><pubDate>Thu, 21 Apr 2022 10:24:11 +0800</pubDate><guid>https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/</guid><description>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/feat-img.png" alt="Featured image of post 实战教程: 搭建个人博客 pt.3" />&lt;blockquote>
&lt;p>本系列教程为你展示搭建个人博客的技巧, 分为三个部分:&lt;/p>
&lt;ul>
&lt;li>pt.1 - 创建本地博客网站项目
&lt;ul>
&lt;li>使用 Hugo 构建静态博客.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pt.2 - 同步静态博客至 QNAP NAS
&lt;ul>
&lt;li>使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&lt;em>pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare (本文)&lt;/em>&lt;/strong>
&lt;ul>
&lt;li>使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>在经历了第二部分的&lt;a class="link" href="../tutorial-how-to-build-a-personal-blog-part-2/" >实战教程: 搭建个人博客 pt.2 - 同步静态博客至 QNAP NAS&lt;/a>后, 你的静态博客应该已可用于测试且相当于多了一个备份. 但这并非最终目的, 因为它还未公开发布.&lt;/p>
&lt;p>要想公开发布一个博客网站, 就必须准备一个类似 QNAP NAS 的部署环境, 不同之处在于它必须是对任何人都可访问的.&lt;/p>
&lt;p>通常可以使用服务器或虚拟主机空间作为部署环境, 但为了节省成本 (毕竟只是搭建个人博客), 这里选择将静态博客部署至 Backblaze B2 和 Cloudflare.&lt;/p>
&lt;p>非常幸运的是可以使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.&lt;/p>
&lt;h2 id="backblaze-b2-云存储简介">Backblaze B2 云存储简介&lt;/h2>
&lt;p>Backblaze B2 云存储是一个类似 Amazon S3 的对象存储服务, 但&lt;a class="link" href="https://www.backblaze.com/b2/cloud-storage-pricing.html" target="_blank" rel="noopener"
>价格&lt;/a>却低很多:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/logo-amazon.png"
width="284"
height="100"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/logo-amazon_huead16a91d89dc98cf609c0c041501328_14221_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/logo-amazon_huead16a91d89dc98cf609c0c041501328_14221_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="284"
data-flex-basis="681px"
>&lt;/th>
&lt;th>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/logo-backblaze.png"
width="284"
height="100"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/logo-backblaze_hu4cfc5085a55dc6d7e2f4f55b62ef2986_4473_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/logo-backblaze_hu4cfc5085a55dc6d7e2f4f55b62ef2986_4473_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="284"
data-flex-basis="681px"
>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>存储空间 ($/GB/月)&lt;/td>
&lt;td>0.021 GB/月&lt;/td>
&lt;td>0.005 GB/月&lt;/td>
&lt;td>76%+ 降低成本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>下载 ($/GB)&lt;/td>
&lt;td>0.05 GB/月&lt;/td>
&lt;td>0.01 GB/月&lt;/td>
&lt;td>成本降低 80% 以上&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>此外, 它还提供免费额度:&lt;/p>
&lt;ul>
&lt;li>存储
&lt;ul>
&lt;li>前 10GB 的存储空间是免费的.&lt;/li>
&lt;li>超过 10GB, 收取 $ 0.005 /GB/月的费用, 大约是其他领先的云对象存储 (比如 S3) 成本的四分之一.&lt;/li>
&lt;li>存储成本按小时计算, 没有最低保留要求, 按月计费.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>下载流量
&lt;ul>
&lt;li>每天下载的前 1GB 流量是免费的.&lt;/li>
&lt;li>超过 1GB, 收取 $ 0.01 /GB,&lt;/li>
&lt;li>但是通过 CDN 和计算合作伙伴 (Cloudflare 就是其中之一) 下载是免费的.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>事务
&lt;ul>
&lt;li>每个下载操作都算作一个 B 类事务.&lt;/li>
&lt;li>每天前 2,500 个 B 类事务是免费的.&lt;/li>
&lt;li>超过 2,500 个 B 类事务, 按 $ 0.004/10,000 个事务的费率收费.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>没有 &amp;ldquo;惊喜&amp;rdquo; 账单
&lt;ul>
&lt;li>如果你已经注册了 Backblaze B2, 你可能已经注意到你不必提供信用卡号. 你的 10GB 免费存储空间永不过期, 你也不会意外产生任何费用.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>由于 Backblaze B2 和 Cloudflare 的合作伙伴关系, 二者之间的流量无需客户付费. 再加上 Cloudflare 本身的 CDN 功能会大大减少回源 (事务) 次数, 因此只需通过 Cloudflare 访问部署于 Backblaze B2 的静态博客, 就近乎于全免费, 这也是选择 Backblaze B2 的重要原因之一.&lt;/p>
&lt;h2 id="设置-backblaze-b2">设置 Backblaze B2&lt;/h2>
&lt;h3 id="注册-b2-账号">注册 B2 账号&lt;/h3>
&lt;p>点击&lt;a class="link" href="https://www.backblaze.com/b2/sign-up.html" target="_blank" rel="noopener"
>此处&lt;/a>进行注册, 这里 Region 选择 &amp;ldquo;US-West&amp;rdquo;.&lt;/p>
&lt;h3 id="绑定手机号">绑定手机号&lt;/h3>
&lt;p>登录后, 提示要给手机发验证码, 目前支持中国大陆的手机号, 接收时可能会有比较大的延迟, 比如延迟 1~2 小时, 但也可能立即收到.&lt;/p>
&lt;p>验证码的有效期是 24 小时, 如遇延迟, 请等待.&lt;/p>
&lt;h3 id="创建存储库-bucket">创建存储库 (Bucket)&lt;/h3>
&lt;p>绑定了手机号再次登录后, 默认进入 &amp;ldquo;Buckets&amp;rdquo; 页, 也可点击&lt;a class="link" href="https://secure.backblaze.com/b2_buckets.htm" target="_blank" rel="noopener"
>此处&lt;/a>进入该页.&lt;/p>
&lt;p>现在创建一个存储库 (Bucket), 点击 &amp;ldquo;Create a Bucket&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/create-a-bucket.png"
width="597"
height="799"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/create-a-bucket_hu7af80153f8440fc4cac5ae2f3a64ade6_48256_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/create-a-bucket_hu7af80153f8440fc4cac5ae2f3a64ade6_48256_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="74"
data-flex-basis="179px"
>&lt;/p>
&lt;blockquote>
&lt;p>Bucket Unique Name: blog-zhaijia-fun, 不能包含 &amp;ldquo;.&amp;rdquo;, 即不能与域名同名, 最少6个字符, 且需在 Backblaze B2 全站范围内唯一.&lt;/p>
&lt;p>Files in Bucket are: 选择 &amp;ldquo;public&amp;rdquo;, 表示对所有人都是可访问的.&lt;/p>
&lt;p>其他选项保持默认值即可.&lt;/p>
&lt;/blockquote>
&lt;h3 id="获取存储库的域名">获取存储库的域名&lt;/h3>
&lt;p>随意上传一张示例图片, 例如: smiley.png
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/upload-an-image.png"
width="1346"
height="628"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/upload-an-image_hu05694fabd72826dfc5101bd54eb73414_51825_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/upload-an-image_hu05694fabd72826dfc5101bd54eb73414_51825_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="514px"
>&lt;/p>
&lt;p>并查看其信息:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/review-an-image-1.png"
width="1328"
height="114"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/review-an-image-1_hued82b7aa3281000b12abead733e23e63_7466_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/review-an-image-1_hued82b7aa3281000b12abead733e23e63_7466_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="1164"
data-flex-basis="2795px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/review-an-image-2.png"
width="1798"
height="1558"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/review-an-image-2_hu6baf194776d85a900ba2360f0a785730_149896_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/review-an-image-2_hu6baf194776d85a900ba2360f0a785730_149896_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="115"
data-flex-basis="276px"
>&lt;/p>
&lt;p>记下其中的域名 (图中红线所示的部分), 即: &lt;strong>f000.backblazeb2.com&lt;/strong>, 你的可能和示例不同, 请以你自己的为准.&lt;/p>
&lt;h3 id="创建-app-key">创建 App Key&lt;/h3>
&lt;p>为使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 首先要创建一个 App Key.&lt;/p>
&lt;p>进入 &amp;ldquo;App Keys&amp;rdquo; 页, 也可点击&lt;a class="link" href="https://secure.backblaze.com/app_keys.htm" target="_blank" rel="noopener"
>此处&lt;/a>进入该页.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-1.png"
width="1356"
height="338"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-1_hue0f3f00155dcda11a545ed68a0fc460a_11316_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-1_hue0f3f00155dcda11a545ed68a0fc460a_11316_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="401"
data-flex-basis="962px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-2.png"
width="594"
height="681"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-2_hu489a89c5ef9dcf6e7899b082bb734eae_41438_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-2_hu489a89c5ef9dcf6e7899b082bb734eae_41438_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="87"
data-flex-basis="209px"
>&lt;/p>
&lt;blockquote>
&lt;p>Name of Key: NAS-HBS&lt;/p>
&lt;p>Allow access to Bucket(s): 允许访问的存储库 (Bucket), 只选中 blog-zhaijia-fun&lt;/p>
&lt;p>其他选项保持默认值即可.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-3.png"
width="1324"
height="430"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-3_hu7ba2f43be69249a408d589286b252064_24404_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/b2-app-key-3_hu7ba2f43be69249a408d589286b252064_24404_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="307"
data-flex-basis="738px"
>&lt;/p>
&lt;p>点击 &amp;ldquo;Copy to Clipboard&amp;rdquo;, 会将 applicationKey 的值拷贝至剪贴板.&lt;/p>
&lt;blockquote>
&lt;p>该值只在此处显示一次, 以后将无法查到.&lt;/p>
&lt;p>强烈建议你将 applicationKey 和相对应的 keyID 保存至安全的地方, 它们是执行同步所需的关键参数, 千万不要泄露!&lt;/p>
&lt;/blockquote>
&lt;h2 id="设置-cloudflare-加速">设置 Cloudflare 加速&lt;/h2>
&lt;blockquote>
&lt;p>你必须要有一个 Cloudflare 账号, 如果没有, 点击&lt;a class="link" href="https://dash.cloudflare.com/sign-up" target="_blank" rel="noopener"
>此处&lt;/a>注册.&lt;/p>
&lt;p>你必须要有一个域名并按照 Cloudflare 的指引将其导入 Cloudflare.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;em>&lt;strong>注意:&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>请勿照抄, 务必将其替换为你自己的域名!&lt;/strong>&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>登录 Cloudflare 后, 选择域名 zhaijia.fun .&lt;/p>
&lt;h3 id="设置-ssltls">设置 SSL/TLS&lt;/h3>
&lt;p>切换到 &amp;ldquo;SSL/TLS&amp;rdquo; 项.&lt;/p>
&lt;p>点击右侧的 &amp;ldquo;Full (strict)&amp;quot;,确保它被选中:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-ssl.png"
width="2040"
height="926"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-ssl_hu17648a30c491e22dc2e087d721fc497b_89777_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-ssl_hu17648a30c491e22dc2e087d721fc497b_89777_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="220"
data-flex-basis="528px"
>&lt;/p>
&lt;h3 id="设置-dns">设置 DNS&lt;/h3>
&lt;p>切换到 &amp;ldquo;DNS&amp;rdquo; 项.&lt;/p>
&lt;p>添加一个类型为 &amp;ldquo;CNAME&amp;rdquo; 的解析项目:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-dns-1.png"
width="2048"
height="296"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-dns-1_huc93511b2f7ff5fcfa133b89867ac020a_20649_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-dns-1_huc93511b2f7ff5fcfa133b89867ac020a_20649_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="691"
data-flex-basis="1660px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-dns-2.png"
width="2048"
height="675"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-dns-2_hu6e4efa0dc6cc21e53de4486929246ad8_62641_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-dns-2_hu6e4efa0dc6cc21e53de4486929246ad8_62641_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="303"
data-flex-basis="728px"
>&lt;/p>
&lt;p>这里将域名 (子) blog.zhaijia.fun 作为前面找到的 f000.backblazeb2.com 的别名 (CNAME).&lt;/p>
&lt;p>也就是说访问 blog.zhaijia.fun 就相当于访问 f000.backblazeb2.com.&lt;/p>
&lt;p>请确保最右侧的开关是打开的 (图中红线所示的部分), 并点击 &amp;ldquo;Save&amp;rdquo; 保存.&lt;/p>
&lt;blockquote>
&lt;p>此 CNAME 的 DNS 解析可能需要一定的时间才能生效, 请耐心等待.&lt;/p>
&lt;/blockquote>
&lt;p>此时, 拷贝示例图片的 Friendly URL, 并将其中的域名替换为 blog.zhaijia.fun, 可得:&lt;/p>
&lt;p>&lt;a class="link" href="https://blog.zhaijia.fun/file/blog-zhaijia-fun/smiley.png" target="_blank" rel="noopener"
>https://blog.zhaijia.fun/file/blog-zhaijia-fun/smiley.png&lt;/a>.&lt;/p>
&lt;p>如果一切正常, 在浏览器中访问新的图片 URL, 你将看到这张图片.&lt;/p>
&lt;h3 id="设置-transform-rules">设置 Transform Rules&lt;/h3>
&lt;p>切换到 &amp;ldquo;Rules&amp;rdquo; -&amp;gt; &amp;ldquo;Transform Rules&amp;rdquo; 项.&lt;/p>
&lt;h4 id="缩减-url">缩减 URL&lt;/h4>
&lt;p>点击 &amp;ldquo;Create transform rule&amp;rdquo; -&amp;gt; &amp;ldquo;Rewrite URL&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-1.png"
width="2048"
height="1370"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-1_hu4c8de176dd734d34860418e6756577ff_96162_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-1_hu4c8de176dd734d34860418e6756577ff_96162_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="149"
data-flex-basis="358px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-2.png"
width="1055"
height="580"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-2_hubffe770e25dd514c642306975767b1ba_26825_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-2_hubffe770e25dd514c642306975767b1ba_26825_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="181"
data-flex-basis="436px"
>&lt;/p>
&lt;blockquote>
&lt;p>Rule name: fix url path 1&lt;/p>
&lt;/blockquote>
&lt;p>然后点击 &amp;ldquo;Edit expression&amp;rdquo;, 并在下方输入框中输入:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-basic" data-lang="basic">&lt;span class="line">&lt;span class="cl">&lt;span class="vg">not&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">starts_with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">uri&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/file/blog-zhaijia-fun&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">and&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">not&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">ends_with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">uri&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>该文本中的 blog-zhaijia-fun 为存储库 (Bucket) 名称&lt;/p>
&lt;/blockquote>
&lt;p>点击 &amp;ldquo;Path&amp;rdquo; 下方的 &amp;ldquo;Rewrite to&amp;hellip;&amp;rdquo; -&amp;gt; &amp;ldquo;Dynamic&amp;rdquo;, 并在右侧的输入框中输入:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-basic" data-lang="basic">&lt;span class="line">&lt;span class="cl">&lt;span class="vg">concat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/file/blog-zhaijia-fun&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">uri&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-3.png"
width="1068"
height="656"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-3_hua718b91b26862c1af639048572e04eac_38240_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-3_hua718b91b26862c1af639048572e04eac_38240_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="162"
data-flex-basis="390px"
>&lt;/p>
&lt;p>最后点击 &amp;ldquo;Deploy&amp;rdquo;.&lt;/p>
&lt;p>现在删除示例图片 URL 中的 &amp;ldquo;&lt;strong>/file/blog-zhaijia-fun&lt;/strong>&amp;rdquo;, 可得:&lt;/p>
&lt;p>&lt;a class="link" href="https://blog.zhaijia.fun/smiley.png" target="_blank" rel="noopener"
>https://blog.zhaijia.fun/smiley.png&lt;/a>&lt;/p>
&lt;p>如果一切正常, 在浏览器中访问新的图片 URL, 你将看到这张图片.&lt;/p>
&lt;p>至此, 该 URL 将被用作示例图片的最终 URL .&lt;/p>
&lt;h4 id="自动搜索索引文件">自动搜索索引文件&lt;/h4>
&lt;p>Backblaze B2 提供的云存储服务并不像 Web 服务器那样在收到一个以 &amp;ldquo;/&amp;rdquo; 结尾的 URL 时会自动搜索索引文件, 比如: index.html, 而是返回 HTTP 404 (Not Found) 错误. 不过只需创建特定的 Transform Rule 就可模拟自动搜索索引文件.&lt;/p>
&lt;p>类似前面的创建过程, 再次创建一个 &amp;ldquo;Rewrite URL&amp;rdquo; 规则:&lt;/p>
&lt;blockquote>
&lt;p>Rule name: fix url path 2&lt;/p>
&lt;/blockquote>
&lt;p>然后点击 &amp;ldquo;Edit expression&amp;rdquo;, 并在下方输入框中输入:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-basic" data-lang="basic">&lt;span class="line">&lt;span class="cl">&lt;span class="vg">not&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">starts_with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">uri&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/file/blog-zhaijia-fun&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">and&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">ends_with&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">uri&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>该文本中的 blog-zhaijia-fun 为存储库 (Bucket) 名称&lt;/p>
&lt;/blockquote>
&lt;p>点击 &amp;ldquo;Path&amp;rdquo; 下方的 &amp;ldquo;Rewrite to&amp;hellip;&amp;rdquo; -&amp;gt; &amp;ldquo;Dynamic&amp;rdquo;, 并在右侧的输入框中输入:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-basic" data-lang="basic">&lt;span class="line">&lt;span class="cl">&lt;span class="vg">concat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/file/blog-zhaijia-fun&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">uri&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;index.html&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-3-1.png"
width="1050"
height="644"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-3-1_hu878cd88cfbe27dd78073897381460b7d_37870_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-3-1_hu878cd88cfbe27dd78073897381460b7d_37870_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="391px"
>&lt;/p>
&lt;p>最后点击 &amp;ldquo;Deploy&amp;rdquo;.&lt;/p>
&lt;h4 id="从响应中删除-backblaze-b2-http-标头">从响应中删除 Backblaze B2 HTTP 标头&lt;/h4>
&lt;p>通常, 下面的 Backblaze B2 HTTP 标头将被包含在响应中:&lt;/p>
&lt;ul>
&lt;li>x-bz-file-name&lt;/li>
&lt;li>x-bz-file-id&lt;/li>
&lt;li>x-bz-content-sha1&lt;/li>
&lt;li>x-bz-upload-timestamp&lt;/li>
&lt;li>x-bz-info-src_last_modified_millis&lt;/li>
&lt;/ul>
&lt;p>删除它们, 除了可以防止某些信息的泄露之外, 还能减少网络传输的字节数.&lt;/p>
&lt;p>点击 &amp;ldquo;Create transform rule&amp;rdquo; -&amp;gt; &amp;ldquo;Modify Response Header&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-4.png"
width="2048"
height="1370"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-4_huf10a92d5d178377e04f757f4818d4367_95858_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-4_huf10a92d5d178377e04f757f4818d4367_95858_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="149"
data-flex-basis="358px"
>&lt;/p>
&lt;blockquote>
&lt;p>Rule name: remove b2 headers&lt;/p>
&lt;/blockquote>
&lt;p>然后点击 &amp;ldquo;Edit expression&amp;rdquo;, 并在下方输入框中输入: true
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-5.png"
width="2132"
height="1414"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-5_hu8a7776e0d28899e2634405b7070af79f_68376_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-5_hu8a7776e0d28899e2634405b7070af79f_68376_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="150"
data-flex-basis="361px"
>&lt;/p>
&lt;p>点击 &amp;ldquo;Select item&amp;hellip;&amp;rdquo; -&amp;gt; &amp;ldquo;Remove&amp;rdquo;, 并在右边的输入框中输入某个 Backblaze B2 HTTP 标头.&lt;/p>
&lt;p>可通过点击 &amp;ldquo;Set new header&amp;rdquo;, 添加另一个待删除的 Backblaze B2 HTTP 标头.&lt;/p>
&lt;p>重复这个过程, 直至上面的 5 个 Backblaze B2 HTTP 标头都被添加:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-6.png"
width="1058"
height="686"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-6_hu70078c563a3f3cd85cdf4eebfe3bae8c_34211_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/cf-rule-6_hu70078c563a3f3cd85cdf4eebfe3bae8c_34211_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="154"
data-flex-basis="370px"
>&lt;/p>
&lt;p>最后点击 &amp;ldquo;Deploy&amp;rdquo;.&lt;/p>
&lt;h4 id="通过-etag-http-标头优化缓存效率">通过 ETag HTTP 标头优化缓存效率&lt;/h4>
&lt;p>编辑刚才创建的规则 &amp;ldquo;remove b2 headers&amp;rdquo;, 点击 &amp;ldquo;Set new header&amp;rdquo;, 选择 &amp;ldquo;Set dynamic&amp;rdquo;, 在下方的两个输入框中分别输入:&lt;/p>
&lt;ul>
&lt;li>左边:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-basic" data-lang="basic">&lt;span class="line">&lt;span class="cl">&lt;span class="vg">ETag&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>右边:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-basic" data-lang="basic">&lt;span class="line">&lt;span class="cl">&lt;span class="vg">concat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">headers&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;x-bz-content-sha1&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="il">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">headers&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;x-bz-info-src_last_modified_millis&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="il">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="vg">http&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vg">headers&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;x-bz-file-id&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="il">0&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>这表示使用所访问资源的 sha1, src_last_modified_millis 和 file-id 构造 ETag HTTP 标头.&lt;/p>
&lt;/blockquote>
&lt;p>最后, 点击 &amp;ldquo;Save&amp;rdquo; 保存.&lt;/p>
&lt;h2 id="创建-hbs-3-同步任务">创建 HBS 3 同步任务&lt;/h2>
&lt;p>登录 QNAP NAS Web 端, 打开 &amp;ldquo;HBS 3 Hybrid Backup Sync&amp;rdquo;.&lt;/p>
&lt;p>点击 &amp;ldquo;同步&amp;rdquo; -&amp;gt; &amp;ldquo;立即同步&amp;rdquo; -&amp;gt; &amp;ldquo;单向同步作业&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-1.png"
width="2388"
height="1198"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-1_hucf84497522dfd0b1c2247ea2b0543ffa_226138_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-1_hucf84497522dfd0b1c2247ea2b0543ffa_226138_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-2.png"
width="2390"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-2_hufd83ce63efbbc268f6afce4c6c33fbe8_195488_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-2_hufd83ce63efbbc268f6afce4c6c33fbe8_195488_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-3.png"
width="2390"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-3_hu2d4de9e483ce64c8c884a855aa9ca570_151960_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-3_hu2d4de9e483ce64c8c884a855aa9ca570_151960_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
>&lt;/p>
&lt;blockquote>
&lt;p>名称: B2 blog-zhaijia-fun&lt;/p>
&lt;p>keyID: Backblaze B2 中已创建的 keyID&lt;/p>
&lt;p>应用程序密钥: Backblaze B2 中已创建的 applicationKey&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-4.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-4_hud251bede993b07a8a99f7e3312faa25c_180732_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-4_hud251bede993b07a8a99f7e3312faa25c_180732_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-5.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-5_hudf06fbc82d7cafce3637e5b3fe8ce23a_177008_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-5_hudf06fbc82d7cafce3637e5b3fe8ce23a_177008_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-6.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-6_hua38909fc9476a481006207de3a02b99e_177512_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-6_hua38909fc9476a481006207de3a02b99e_177512_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
>&lt;/p>
&lt;blockquote>
&lt;p>作业名称: 同步 blog.zhaijia.fun&lt;/p>
&lt;p>描述: 从 QNAP NAS 将静态博客同步至 Backblaze B2&lt;/p>
&lt;p>操作: 镜像, 意为同步后, QNAP NAS 和 Backblaze B2 两方的目录/文件是相同的, 而 Backblaze B2 方存储的其他数据将被删除.&lt;/p>
&lt;/blockquote>
&lt;p>点击左侧 &amp;ldquo;添加配对文件夹&amp;rdquo; 右边的 &amp;ldquo;+&amp;rdquo;, 选择 QNAP NAS 上的目录: Web/blog.zhaijia.fun
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-7.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-7_hu53c25b8f94c0fb890ee932b0efd0e72e_134085_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-7_hu53c25b8f94c0fb890ee932b0efd0e72e_134085_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
>&lt;/p>
&lt;p>点击右侧 &amp;ldquo;添加配对文件夹&amp;rdquo; 右边的 &amp;ldquo;+&amp;rdquo;, 选择 Backblaze B2 上的目录: /
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-8.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-8_hu363128d8943996514444637e23028b2e_133549_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-8_hu363128d8943996514444637e23028b2e_133549_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-9.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-9_huf1c107675fdbef7922598f76d12592c2_180200_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-9_huf1c107675fdbef7922598f76d12592c2_180200_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-10.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-10_hu52d2f26e6ff43410df2964f8f72c10a1_149751_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-10_hu52d2f26e6ff43410df2964f8f72c10a1_149751_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
>&lt;/p>
&lt;blockquote>
&lt;p>保持默认选项 &amp;ldquo;没有计划&amp;rdquo;, 意为手工运行该同步任务.&lt;/p>
&lt;/blockquote>
&lt;p>点击 &amp;ldquo;下一步&amp;rdquo;, 查看任务摘要, 并 &amp;ldquo;创建&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-11.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-11_huf4474c8c3c9aa5da1f35c8e539ae8981_155368_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-11_huf4474c8c3c9aa5da1f35c8e539ae8981_155368_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
> &lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-12.png"
width="2394"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-12_hu204b972725ba4619a07e0fde5ace756a_224228_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/hbs-12_hu204b972725ba4619a07e0fde5ace756a_224228_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
>&lt;/p>
&lt;p>至此, 同步任务创建完毕.&lt;/p>
&lt;p>任何时候, 只要点击图中的 &amp;ldquo;立即同步&amp;rdquo; 即可将静态博客从 QNAP NAS 同步至 Backblaze B2.&lt;/p>
&lt;h2 id="浏览静态博客">浏览静态博客&lt;/h2>
&lt;p>现在从浏览器中访问 &lt;a class="link" href="https://blog.zhaijia.fun" target="_blank" rel="noopener"
>https://blog.zhaijia.fun&lt;/a>, 看看成果吧!&lt;/p></description></item><item><title>实战教程: 搭建个人博客 pt.2</title><link>https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/</link><pubDate>Wed, 20 Apr 2022 09:32:15 +0800</pubDate><guid>https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/</guid><description>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/feat-img.jpg" alt="Featured image of post 实战教程: 搭建个人博客 pt.2" />&lt;blockquote>
&lt;p>本系列教程为你展示搭建个人博客的技巧, 分为三个部分:&lt;/p>
&lt;ul>
&lt;li>pt.1 - 创建本地博客网站项目
&lt;ul>
&lt;li>使用 Hugo 构建静态博客.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&lt;em>pt.2 - 同步静态博客至 QNAP NAS (本文)&lt;/em>&lt;/strong>
&lt;ul>
&lt;li>使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare
&lt;ul>
&lt;li>使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>在经历了第一部分的&lt;a class="link" href="../tutorial-how-to-build-a-personal-blog-part-1/" >实战教程: 搭建个人博客 pt.1 - 创建本地博客网站项目&lt;/a>后, 你的静态博客应该已经在本地构建完毕了.&lt;/p>
&lt;p>虽然在启动本地博客网站 (Hugo 调试环境) 时可通过浏览器调试博客文章, 但这仅限于你自己. 如果你希望别人 (尤其是团队中的其他人) 也能帮忙测试这个静态博客, 你需要将它部署到一个提供有限访问权限的环境中, 且需要一个提供 Web 服务的软件, 例如: Apache Web Server, Nginx 或 Caddy 等.&lt;/p>
&lt;p>综合下面这几个理由, 这里选择将静态博客部署至 QNAP NAS:&lt;/p>
&lt;ul>
&lt;li>QNAP NAS 通常部署在 LAN, 非常适合用作提供有限访问权限的测试环境.&lt;/li>
&lt;li>QNAP NAS 内置了 Apache Web Server, 且易于使用.&lt;/li>
&lt;li>QNAP NAS 易于连接至 Backblaze B2, 可以很方便地将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速 (即本系列教程的第三部分).&lt;/li>
&lt;li>部署于 QNAP NAS 上的静态博客, 也相当于多了一个备份.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;em>&lt;strong>注意:&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>请勿照抄, 务必将其替换为你自己的域名!&lt;/strong>&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;h2 id="创建共享文件夹">创建共享文件夹&lt;/h2>
&lt;p>为避免繁琐且容易失误的手工上传方式, 这里使用 Qsync 将静态博客从本地同步至 QNAP NAS, 这需要先在 QNAP NAS 上创建一个用于同步的共享文件夹.&lt;/p>
&lt;p>打开 &amp;ldquo;File Station&amp;rdquo;, 点击左侧目录树中 &amp;ldquo;Web&amp;rdquo; 的上级, 比如 &amp;ldquo;DataVol1&amp;rdquo; 右边的三个竖点, 然后点击 &amp;ldquo;创建共享文件夹&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/create-shared-folder.png"
width="2058"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/create-shared-folder_hu45f6187c8631ae89b204b74555712828_105104_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/create-shared-folder_hu45f6187c8631ae89b204b74555712828_105104_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="171"
data-flex-basis="411px"
>&lt;/p>
&lt;blockquote>
&lt;p>文件夹名称: blog.zhaijia.fun&lt;/p>
&lt;p>点选 &amp;ldquo;手动输入路径&amp;rdquo;, 并在其下的输入框中输入: /Web/blog.zhaijia.fun&lt;/p>
&lt;/blockquote>
&lt;h2 id="为共享文件夹启用同步">为共享文件夹启用同步&lt;/h2>
&lt;blockquote>
&lt;p>必须启用 Qsync Central 才能同步文件. 此应用程序默认启用, 必须保持启用状态以进行文件同步.&lt;/p>
&lt;p>必须启用对共享文件夹的同步访问, 以在文件夹和设备之间同步文件. 共享文件夹默认没有同步访问权限.&lt;/p>
&lt;/blockquote>
&lt;ol>
&lt;li>打开 Qsync Central, 然后转到 &amp;ldquo;共享文件夹&amp;rdquo;.&lt;/li>
&lt;li>在右边的列表中找到行 &amp;ldquo;blog.zhaijia.fun&amp;rdquo;, 点击其 &amp;ldquo;允许&amp;rdquo; 列的按钮, 启用同步访问权限.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/enable-qsync.png"
width="2538"
height="1270"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/enable-qsync_hud2932ea88e9a932c252bcf5c5cb85b93_92916_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/enable-qsync_hud2932ea88e9a932c252bcf5c5cb85b93_92916_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="479px"
>&lt;/li>
&lt;/ol>
&lt;h2 id="启用虚拟主机">启用虚拟主机&lt;/h2>
&lt;p>为方便管理, 这里在 QNAP NAS 内置的 Web 服务器 (即 Apache Web Server) 上为静态博客创建专属虚拟主机.&lt;/p>
&lt;p>进入 &amp;ldquo;应用程序&amp;rdquo; -&amp;gt; &amp;ldquo;Web 服务器&amp;rdquo; -&amp;gt; &amp;ldquo;虚拟主机&amp;rdquo;, 勾选 &amp;ldquo;启用虚拟主机&amp;rdquo;, 最后点击 &amp;ldquo;应用&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/enable-vm.png"
width="1157"
height="600"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/enable-vm_hu8a70990ac12cbf07f9ee8ad8c4f1ab3f_28714_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/enable-vm_hu8a70990ac12cbf07f9ee8ad8c4f1ab3f_28714_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="192"
data-flex-basis="462px"
>&lt;/p>
&lt;h2 id="创建专属虚拟主机">创建专属虚拟主机&lt;/h2>
&lt;p>点击 &amp;ldquo;创建虚拟主机&amp;rdquo;:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/create-vm.png"
width="2316"
height="1200"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/create-vm_hubbe0475df781701edf316fb29aa0b545_67551_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/create-vm_hubbe0475df781701edf316fb29aa0b545_67551_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="463px"
>&lt;/p>
&lt;blockquote>
&lt;p>主机名称: test.blog.zhaijia.fun&lt;/p>
&lt;p>根目录: /Web/blog.zhaijia.fun (&lt;strong>&lt;em>该目录必须位于 Web 文件夹下&lt;/em>&lt;/strong>)&lt;/p>
&lt;p>端口号: 该端口号与 Web 服务器所使用的端口号相同, 通常为 80.&lt;/p>
&lt;p>&lt;strong>&lt;em>请注意这里是将主机名称 test.blog.zhaijia.fun 的虚拟主机映射到目录 blog.zhaijia.fun, 意为该虚拟主机用于测试目的.&lt;/em>&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;h2 id="安装-qsync-客户端">安装 Qsync 客户端&lt;/h2>
&lt;p>根据 QNAP 官网的描述:&lt;/p>
&lt;blockquote>
&lt;p>Qsync 让您方便地在 QNAP NAS 及绑定设备间进行文件同步, 适用于PC主机, 笔记本电脑与移动设备. 您可在所有设备上存取实时数据, 并轻松分享给工作团队或家庭成员.&lt;/p>
&lt;/blockquote>
&lt;p>点击下载 &lt;a class="link" href="https://www.qnap.com/zh-cn/utilities/essentials" target="_blank" rel="noopener"
>Qsync (Windows® 及 macOS®、Android™ 及 iOS®)&lt;/a>, 并安装.&lt;/p>
&lt;h2 id="使用-qsync-客户端">使用 Qsync 客户端&lt;/h2>
&lt;p>打开 Qsync 客户端, 连接并登录.&lt;/p>
&lt;p>该过程只需执行一次, 之后可通过点击 Qsync 客户端的系统托盘图标打开主界面.&lt;/p>
&lt;h3 id="打开主界面">打开主界面&lt;/h3>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-1.png"
width="872"
height="1034"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-1_hud5d7c11e6eb691b747c33ad9b1e8cc62_31733_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-1_hud5d7c11e6eb691b747c33ad9b1e8cc62_31733_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="84"
data-flex-basis="202px"
>&lt;/p>
&lt;h3 id="新增配对文件夹">新增配对文件夹&lt;/h3>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-2.png"
width="1972"
height="1398"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-2_hu1257872224ed977ba264c5b1dad3f539_72337_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-2_hu1257872224ed977ba264c5b1dad3f539_72337_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="141"
data-flex-basis="338px"
>
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-3.png"
width="1732"
height="1298"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-3_hud965ca09187c34c60a6988109cd16f89_26571_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-3_hud965ca09187c34c60a6988109cd16f89_26571_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
>
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-4.png"
width="1644"
height="1340"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-4_huaaf3ad9e276ea33f8793ea4f0205214c_44616_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-4_huaaf3ad9e276ea33f8793ea4f0205214c_44616_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="122"
data-flex-basis="294px"
>
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-4-1.png"
width="1064"
height="1014"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-4-1_hu98dfd62d847f4dcb3251217299d38441_24875_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-4-1_hu98dfd62d847f4dcb3251217299d38441_24875_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="104"
data-flex-basis="251px"
>
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-5.png"
width="1644"
height="1340"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-5_hucc89dcce96d6851817224b49761be401_56699_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-5_hucc89dcce96d6851817224b49761be401_56699_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="122"
data-flex-basis="294px"
>
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-6.png"
width="1732"
height="1298"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-6_huffdb3071162214051d5af6f3581e513e_65549_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-6_huffdb3071162214051d5af6f3581e513e_65549_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
>&lt;/p>
&lt;h3 id="在-qnap-nas-上查看同步结果">在 QNAP NAS 上查看同步结果&lt;/h3>
&lt;p>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-7.png"
width="2130"
height="1268"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-7_hu353494a290fe15c11d12899273cd0c51_236601_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-7_hu353494a290fe15c11d12899273cd0c51_236601_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="167"
data-flex-basis="403px"
>&lt;/p>
&lt;h2 id="浏览测试环境的静态博客">浏览测试环境的静态博客&lt;/h2>
&lt;blockquote>
&lt;p>为了能够正常浏览测试环境的静态博客 (即虚拟主机网站), 请先添加测试域名 test.blog.zhaijia.fun 的 DNS 解析记录. 可以使用 &lt;a class="link" href="https://github.com/oldj/SwitchHosts" target="_blank" rel="noopener"
>SwitchHosts&lt;/a>, 或者直接修改本地的 hosts 文件, 例如:&lt;/p>
&lt;p>Linux/MacOS: /etc/hosts&lt;/p>
&lt;p>Windows: C:\WINDOWS\system32\drivers\etc\hosts&lt;/p>
&lt;p>在其中添加行:&lt;/p>
&lt;p>&amp;lt;QNAP NAS IP 地址&amp;gt; test.blog.zhaijia.fun&lt;/p>
&lt;/blockquote>
&lt;p>使用浏览器访问: &lt;a class="link" href="http://test.blog.zhaijia.fun" target="_blank" rel="noopener"
>http://test.blog.zhaijia.fun&lt;/a> 以浏览/测试静态博客.&lt;/p>
&lt;p>至此, 每当在本地新增/删除/修改博客并执行 Hugo 构建之后, 你的静态博客将会被立即同步至 QNAP NAS 上专属虚拟主机目录下.&lt;/p>
&lt;p>如果想暂停此同步:
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-8.png"
width="1732"
height="1298"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-8_hufac51bc1bd9d5c2b383b76198a8b5bcb_70609_480x0_resize_box_3.png 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/using-qsync-8_hufac51bc1bd9d5c2b383b76198a8b5bcb_70609_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
>&lt;/p></description></item><item><title>实战教程: 搭建个人博客 pt.1</title><link>https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/</link><pubDate>Mon, 18 Apr 2022 09:49:47 +0800</pubDate><guid>https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/</guid><description>&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/feat-img.jpg" alt="Featured image of post 实战教程: 搭建个人博客 pt.1" />&lt;blockquote>
&lt;p>本系列教程为你展示搭建个人博客的技巧, 分为三个部分:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;em>pt.1 - 创建本地博客网站项目 (本文)&lt;/em>&lt;/strong>
&lt;ul>
&lt;li>使用 Hugo 构建静态博客.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pt.2 - 同步静态博客至 QNAP NAS
&lt;ul>
&lt;li>使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare
&lt;ul>
&lt;li>使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;h2 id="创建-github-远程-repo">创建 Github 远程 Repo&lt;/h2>
&lt;p>本教程使用 Github 同步/备份所创建的博客网站项目, 因此需要先创建它对应的 Github 远程 Repo.&lt;/p>
&lt;blockquote>
&lt;p>&lt;em>&lt;strong>注意:&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;em>&lt;strong>请勿照抄, 务必将其替换为你自己的域名!&lt;/strong>&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>你必须要有一个 Github 账号, 如果没有, 点击&lt;a class="link" href="https://github.com/join" target="_blank" rel="noopener"
>此处&lt;/a>免费注册.&lt;/p>
&lt;p>登录 Github 后, 进入&lt;a class="link" href="https://github.com/new" target="_blank" rel="noopener"
>此处&lt;/a>创建新的 Repo.&lt;/p>
&lt;blockquote>
&lt;p>这里将此 Repo 的类型设置为 &amp;ldquo;Private&amp;rdquo; (私有的), 意为其中存放的目录/文件只对你自己可见.&lt;/p>
&lt;p>如果将来需要部署至某些要求 Repo 必须是 &amp;ldquo;Public&amp;rdquo; 的静态网站托管服务, 比如 Netlify, 请修改为 &amp;ldquo;Public&amp;rdquo;.&lt;/p>
&lt;/blockquote>
&lt;h2 id="安装-hugo">安装 Hugo&lt;/h2>
&lt;p>进入&lt;a class="link" href="https://github.com/gohugoio/hugo/releases" target="_blank" rel="noopener"
>此处&lt;/a>查看并下载最新版本的 Hugo.&lt;/p>
&lt;p>如果你的本地系统是 macOS, 可按照下面的简洁方式快速安装 Hugo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install hugo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 查看版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">例如:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo v0.97.3+extended darwin/amd64 &lt;span class="nv">BuildDate&lt;/span>&lt;span class="o">=&lt;/span>unknown
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>注意: 必须是扩展版本的 Hugo, 即: &lt;strong>&lt;em>extended&lt;/em>&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;h2 id="创建博客网站项目">创建博客网站项目&lt;/h2>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 在某个指定的目录下执行:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo new site blog.zhaijia.fun
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 进入对应的博客网站项目目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> blog.zhaijia.fun
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### git 初始化&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="安装主题">安装主题&lt;/h2>
&lt;p>请查看&lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"
>此处&lt;/a>或自行搜索你喜欢的主题, 然后按照相关的说明文档安装并配置.&lt;/p>
&lt;h3 id="安装-stack-主题">安装 Stack 主题&lt;/h3>
&lt;p>这里选择安装 &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"
>Stack&lt;/a> 主题:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 以子模块的方式安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 使用样例配置作为开始, 以后可在此基础上再次按需修改&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp themes/hugo-theme-stack/exampleSite/config.yaml .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -R themes/hugo-theme-stack/exampleSite/content .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 删除默认的配置文件 config.toml, 因为已经有了 config.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm config.toml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="基本配置">基本配置&lt;/h2>
&lt;h3 id="网站配置-configyaml">网站配置 config.yaml&lt;/h3>
&lt;h3 id="忽略某些目录文件">忽略某些目录/文件&lt;/h3>
&lt;p>这里创建 .gitignore, 在其中放入不需要同步至 Github 的目录/文件, 例如:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### .gitignore&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### lock for building&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/.hugo_build.lock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### public 是 Hugo 构建静态网站的默认发布目录.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/public/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### Hugo 资源目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/resources/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 图片, 视频, 音频等体积较大的文件, 仅限目录 /content/post/**&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.jpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.jpeg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.gif
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.webp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.mov
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.mp3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/content/post/**/*.m4a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 任意的 .DS_Store (macOS)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">**/.DS_Store
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>此示例意为在同步至 Github 时, 将 Hugo 构建静态网站的默认发布目录 public, Hugo 资源目录, 文章所引用的图片, 视频, 音频等体积较大的文件和任意的 macOS 保存目录自定义属性的隐藏文件 .DS_Store &lt;em>&lt;strong>排除在外&lt;/strong>&lt;/em>.&lt;/p>
&lt;h3 id="启动本地博客网站-hugo-调试环境">启动本地博客网站 (Hugo 调试环境)&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo server -D --disableFastRender --noHTTPCache
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>如果一切正常, 去浏览器查看本地博客网站: &lt;a class="link" href="http://localhost:1313/" target="_blank" rel="noopener"
>http://localhost:1313/&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>&lt;strong>-D&lt;/strong> 意为也对标记为草稿的文章生成页面.&lt;/li>
&lt;li>由于本主题使用了 Hugo 中的 .Scratch 来实现一些特性, 非常建议你为 hugo server 命令添加 &lt;strong>&amp;ndash;disableFastRender&lt;/strong> 参数来实时预览你正在编辑的文章页面.&lt;/li>
&lt;li>&lt;strong>--noHTTPCache&lt;/strong> 意为阻止服务器端的缓存, 总是向浏览器发送内容而不是提示内容已最新 (HTTP 304).
按下 Ctrl + C 退出 Hugo 调试环境.&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>如果需要带域名启动, 只需添加参数 &amp;ndash;baseURL, 例如:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo server -D --disableFastRender --noHTTPCache --baseURL http://blog.zhaijia.fun
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>将会提示: Web Server is available at &lt;a class="link" href="http://blog.zhaijia.fun:1313/" target="_blank" rel="noopener"
>http://blog.zhaijia.fun:1313/&lt;/a> (bind address 127.0.0.1)&lt;/p>
&lt;p>此时需将域名 blog.zhaijia.fun &lt;strong>本地解析到 127.0.0.1&lt;/strong> 才能在浏览器中正常访问上面的地址.&lt;/p>
&lt;/blockquote>
&lt;h2 id="首次同步至-github-远程-repo">首次同步至 Github 远程 Repo&lt;/h2>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 配置连接 Github 时的账户信息 ####&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 配置默认账户,即多个 Repo 共享的 Github 账户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global user.email &lt;span class="s2">&amp;#34;your-email&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global user.name &lt;span class="s2">&amp;#34;your-user-name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 配置仅用于连接当前 Repo 的 Github 账户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config user.email &lt;span class="s2">&amp;#34;your-email&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config user.name &lt;span class="s2">&amp;#34;your-user-name&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 添加当前目录下的所有目录/文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 提交并进行注释&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;首次提交&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 切换至主分支 (main)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git branch -M main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 链接到远程 Repo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git remote add origin https://github.com/your-user-name/blog.zhaijia.fun.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 同步本地的目录/文件至 Github&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push -u origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>配置连接 Github 时的账户信息, 有两种情况:&lt;/p>
&lt;ul>
&lt;li>你只有一个 Github 账户, 则使用&lt;strong>带 &amp;ndash;global&lt;/strong> 的版本.&lt;/li>
&lt;li>你有多个 Github 账户, 则使用&lt;strong>不带 &amp;ndash;global&lt;/strong> 的版本.&lt;/li>
&lt;/ul>
&lt;p>请替换 your-email 为你自己的 Github 账户邮箱.&lt;/p>
&lt;p>请替换 your-user-name 为你自己的 Github 账户用户名.&lt;/p>
&lt;p>提示输入密码时, 请输入你的 personal access token 而非 github 账户密码, 此规定已于 2021-8-13 启用, 详见: &lt;a class="link" href="https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/" target="_blank" rel="noopener"
>https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/&lt;/a>&lt;/p>
&lt;p>请查看&lt;a class="link" href="https://github.com/settings/tokens" target="_blank" rel="noopener"
>此处&lt;/a>来生成一个 personal access token.&lt;/p>
&lt;/blockquote>
&lt;p>至此, 你的博客网站项目已经创建完毕并可随时同步至 Github (通过 git 命令).&lt;/p>
&lt;h2 id="进阶配置">进阶配置&lt;/h2>
&lt;h3 id="网站配置-configyaml-1">网站配置 config.yaml&lt;/h3>
&lt;h4 id="网站域名-baseurl">网站域名 baseurl&lt;/h4>
&lt;p>例如:
baseurl: &amp;ldquo;&lt;a class="link" href="https://blog.zhaijia.fun" target="_blank" rel="noopener"
>https://blog.zhaijia.fun&lt;/a>&amp;rdquo;&lt;/p>
&lt;h4 id="网站名称">网站名称&lt;/h4>
&lt;p>title: 快乐宅家&lt;/p>
&lt;h4 id="首页显示的文章数-paginate">首页显示的文章数 paginate&lt;/h4>
&lt;h4 id="设置为简体中文">设置为简体中文&lt;/h4>
&lt;ul>
&lt;li>languageCode: zh-cn&lt;/li>
&lt;li>DefaultContentLanguage: zh-cn&lt;/li>
&lt;li>hasCJKLanguage: true&lt;/li>
&lt;li>注释掉 languages 以取消多语言设置&lt;/li>
&lt;/ul>
&lt;h4 id="网站图标-paramsfavicon">网站图标 params.favicon&lt;/h4>
&lt;p>请把 favicon.ico 放在网站根目录的 static 文件夹下, 这里填写 /favicon.ico .&lt;/p>
&lt;h4 id="左侧边栏-paramssidebar">左侧边栏 params.sidebar&lt;/h4>
&lt;h5 id="emoji">emoji&lt;/h5>
&lt;p>头像底部的 Emoji, 留空不显示.&lt;/p>
&lt;h5 id="网站介绍-subtitle">网站介绍 subtitle&lt;/h5>
&lt;p>subtitle: 非常用心地随便写&lt;/p>
&lt;h5 id="头像-avatar">头像 avatar&lt;/h5>
&lt;ul>
&lt;li>enabled: true 显示头像.&lt;/li>
&lt;li>local: true 使用本地头像文件.&lt;/li>
&lt;li>src:
&lt;ul>
&lt;li>本地头像: 请把图片放在网站根目录的 assets/img 文件夹下. 例如 assets/img/avatar.png, 并填入 img/avatar.png&lt;/li>
&lt;li>外部头像: 头像文件网址.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="文章-paramsarticle">文章 params.article&lt;/h4>
&lt;h5 id="协议-license">协议 license&lt;/h5>
&lt;p>显示在页面底部&lt;/p>
&lt;ul>
&lt;li>enabled: 是否在所有文章底部显示协议信息. 可以在文章的 Front Matter 插入 license: false 来单独关闭.&lt;/li>
&lt;li>default: 默认文章协议. 可以在文章的 Front Matter 插入 license: &amp;ldquo;My custom licence&amp;rdquo; 来单独关闭.&lt;/li>
&lt;/ul>
&lt;p>default: ZHAIJIA.FUN All Rights Reserved.&lt;/p>
&lt;h4 id="评论系统-paramscomments">评论系统 params.comments&lt;/h4>
&lt;h5 id="是否启用评论-enabled">是否启用评论 enabled&lt;/h5>
&lt;p>enabled: false&lt;/p>
&lt;h5 id="服务提供商-provider">服务提供商 provider&lt;/h5>
&lt;ul>
&lt;li>disqus&lt;/li>
&lt;li>disqusjs&lt;/li>
&lt;li>utterances&lt;/li>
&lt;li>remark42&lt;/li>
&lt;li>vssue&lt;/li>
&lt;li>waline&lt;/li>
&lt;li>twikoo&lt;/li>
&lt;li>cactus&lt;/li>
&lt;li>giscus&lt;/li>
&lt;li>gitalk&lt;/li>
&lt;li>cusdis&lt;/li>
&lt;/ul>
&lt;h4 id="小部件-paramswidgets">小部件 params.widgets&lt;/h4>
&lt;h5 id="主页-homepage">主页 homepage&lt;/h5>
&lt;h5 id="普通页">普通页&lt;/h5>
&lt;h4 id="颜色模式-paramscolorscheme">颜色模式 params.colorScheme&lt;/h4>
&lt;h5 id="是否显示切换按钮-toggle">是否显示切换按钮 toggle&lt;/h5>
&lt;h5 id="默认模式-default">默认模式 default&lt;/h5>
&lt;p>可选项:&lt;/p>
&lt;ul>
&lt;li>auto 自动&lt;/li>
&lt;li>light 亮色&lt;/li>
&lt;li>dark 暗色&lt;/li>
&lt;/ul>
&lt;h4 id="自定义菜单-menu">自定义菜单 menu&lt;/h4>
&lt;ul>
&lt;li>identifier: Id&lt;/li>
&lt;li>name: 名称&lt;/li>
&lt;li>url: URL&lt;/li>
&lt;li>weight: 权重&lt;/li>
&lt;li>params:&lt;/li>
&lt;li>icon: 图标&lt;/li>
&lt;li>newTab: 是否在新 tab 中打开&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>主题自带的 SVG 图标来自 &lt;a class="link" href="https://tablericons.com/" target="_blank" rel="noopener"
>Tabler Icons&lt;/a>, 存放在 assets/icons 目录下.&lt;/p>
&lt;p>你可以在网站根目录下新建同名文件夹, 并下载更多的图标.&lt;/p>
&lt;p>主题使用了 params.icon 字段来指定菜单项的图标. params.icon: &amp;ldquo;archives&amp;rdquo; 会输出 assets/icons/archives.svg 图标.&lt;/p>
&lt;/blockquote>
&lt;h4 id="融合的菜单">融合的菜单&lt;/h4>
&lt;p>左侧边栏此时有5个菜单项:&lt;/p>
&lt;ul>
&lt;li>主页: &lt;strong>&lt;em>非可自定义项, 自动添加且无法删除, 并按当前语言 (zh-cn) 本地化.&lt;/em>&lt;/strong>&lt;/li>
&lt;li>关于: 融合自 content/page/about/&lt;/li>
&lt;li>Archives: 融合自 content/page/archives/&lt;/li>
&lt;li>Search: 融合自 content/page/search/&lt;/li>
&lt;li>Links: 融合自 content/page/links/&lt;/li>
&lt;/ul>
&lt;p>后 4 个菜单项都是融合而来的, 且 &amp;ldquo;关于&amp;rdquo; 菜单项已按当前语言 (zh-cn) 本地化.&lt;/p>
&lt;p>查看目录 content/page/about/ 可以发现其中有两个文件: index.md 和 index.zh-cn.md, 分别对应本地化语言 en (默认语言) 和 zh-cn. 它们都含有 menu Front Matter, 这使得它们出现在左侧边栏的菜单列表中. 此时只需删除该 menu Front Matter 即可移除对应的菜单项.&lt;/p>
&lt;p>如果只需要单一语言菜单项, 比如 zh-cn, 则可只保留 index.md 并对其进行本地化.&lt;/p>
&lt;p>最好在 index.md 中设置英文的 slug Front Matter, 比如 &lt;em>&lt;strong>slug: &amp;ldquo;about&amp;rdquo;&lt;/strong>&lt;/em>, 否则将生成类似 &lt;a class="link" href="http://localhost:1313/%e5%85%b3%e4%ba%8e/" target="_blank" rel="noopener"
>http://localhost:1313/关于/&lt;/a> 的 url.&lt;/p>
&lt;h3 id="给分类--标签添加图片和简介">给分类 / 标签添加图片和简介&lt;/h3>
&lt;p>创建分类子目录: content/categories/分类名.&lt;/p>
&lt;p>创建标签子目录: content/tags/标签名.&lt;/p>
&lt;p>然后在该子目录下新建文件 _index.md, 内容如下:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;分类名&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;简介 Blablabla&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;nichijou.jpg&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>description: 这里是简介.&lt;/p>
&lt;p>image: 这里是图片, 和 _index.md 放在同一目录下.&lt;/p>
&lt;/blockquote>
&lt;p>有关 &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"
>Stack&lt;/a> 主题的更多配置, 请参考&lt;a class="link" href="https://docs.stack.jimmycai.com/zh/" target="_blank" rel="noopener"
>此处&lt;/a>.&lt;/p>
&lt;h3 id="修改原型">修改原型&lt;/h3>
&lt;p>使用以下的 Markdown 代码替换 Hugo 生成的默认原型文件 archetypes/default.md 的内容:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ replace .Name &amp;#34;&lt;/span>-&lt;span class="s2">&amp;#34; &amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34; | title }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{{&lt;span class="w"> &lt;/span>&lt;span class="l">.Date }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">slug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">categories&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">&amp;lt;!--more--&amp;gt;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>该 default.md 默认设置了下列的 Front Matter 字段:&lt;/p>
&lt;p>title: 标题, 即将文件名中的 &amp;ldquo;-&amp;rdquo; 替换为 &amp;quot; &amp;quot; 后的字符串.&lt;/p>
&lt;p>description: 副标题.&lt;/p>
&lt;p>date: 创建时间.&lt;/p>
&lt;p>slug: 自定义 url, 若为 &amp;quot;&amp;quot; (默认值), 则使用文件名作为 url.&lt;/p>
&lt;p>draft: 是否为草稿, 默认为是.&lt;/p>
&lt;p>image: 特色图片 (头图), 若为 &amp;quot;&amp;quot; (默认值), 则表示无图.&lt;/p>
&lt;p>tags: 标签数组, 默认为空数组.&lt;/p>
&lt;p>categories: 分类数组, 默认为空数组.&lt;/p>
&lt;p>&amp;lt;!--more--&amp;gt;: 其上一行 (默认为空行) 作为手工摘要, 但 &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"
>Stack&lt;/a> 主题目前并不在各种列表中显示它.&lt;/p>
&lt;/blockquote>
&lt;p>Hugo 将为创建的新文章自动添加上述的 Front Matter 字段.&lt;/p>
&lt;h2 id="创建一篇文章">创建一篇文章&lt;/h2>
&lt;h3 id="创建示例">创建示例&lt;/h3>
&lt;blockquote>
&lt;p>&lt;strong>以下的命令必须在博客网站项目的根目录下执行!&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new post/&lt;span class="sb">`&lt;/span>date &lt;span class="s2">&amp;#34;+%Y/%m&amp;#34;&lt;/span>&lt;span class="sb">`&lt;/span>/my-page-bundle-post/index.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">可得到:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Content &lt;span class="s2">&amp;#34;/path_to/blog.zhaijia.fun/content/post/2022/02/my-page-bundle-post/index.md&amp;#34;&lt;/span> created
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>这将在 Hugo 的内容目录 &lt;strong>/path_to/blog.zhaijia.fun/content&lt;/strong> 下创建新的 &lt;strong>Page Bundle my-page-bundle-post&lt;/strong> (入口为 &lt;strong>index.md&lt;/strong>), 它的原型是 &lt;strong>post&lt;/strong>, 最终存放于按年份和月份区分的子目录 &lt;strong>2022/02&lt;/strong> 下.&lt;/p>
&lt;p>新的文章 (&lt;strong>index.md&lt;/strong>) 创建完毕后, 只需一个 Markdown 编辑器就可开始写作.&lt;/p>
&lt;blockquote>
&lt;p>Page Bundle 是一种内容组织的方式, 它分为:&lt;/p>
&lt;ul>
&lt;li>Leaf Bundle&lt;/li>
&lt;li>Branch Bundle&lt;/li>
&lt;/ul>
&lt;p>这里使用第一种, 即 Leaf Bundle, 表现为:&lt;/p>
&lt;ul>
&lt;li>一个自定义名称的子目录 (此处为 &lt;strong>my-page-bundle-post&lt;/strong>).&lt;/li>
&lt;li>一个入口 Markdown 文件 (即 &lt;strong>index.md&lt;/strong>).&lt;/li>
&lt;li>一个或多个资源文件 (即图片等文件, 这些文件应该被 Markdown 文件引用).&lt;/li>
&lt;/ul>
&lt;p>关于 Page Bundle 的更多信息, 请参考&lt;a class="link" href="https://gohugo.io/content-management/page-bundles/" target="_blank" rel="noopener"
>此处&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>查看该入口文件 (&lt;strong>index.md&lt;/strong>):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;My Page Bundle Post&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2022-02-24T18:49:02&lt;/span>&lt;span class="m">+08&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">slug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">categories&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">&amp;lt;!--more--&amp;gt;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>可以看到 Hugo 为其自动添加并初始化了来自默认原型文件 archetypes/default.md 的 Front Matter 字段.&lt;/p>
&lt;h3 id="同步至-github-远程-repo">同步至 Github 远程 Repo&lt;/h3>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 查看所有更新的目录/文件 (包括增删改)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">例如:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Untracked files:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>use &lt;span class="s2">&amp;#34;git add &amp;lt;file&amp;gt;...&amp;#34;&lt;/span> to include in what will be committed&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> content/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 添加更新项&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add content/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 提交并进行注释&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;添加了新文章&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 同步至 Github&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>至此,你的博客网站项目的更新已经同步至 Github (通过 git 命令).&lt;/p>
&lt;h2 id="构建静态博客">构建静态博客&lt;/h2>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#### 清空 public 目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -fr public/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo --gc --minify
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>该命令构建静态博客, 并存放在默认的发布目录 public 中.
&lt;img src="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/blog.jpg"
width="1920"
height="1378"
srcset="https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/blog_hub5f83f68bc64e484b7746fc546567c6b_142326_480x0_resize_q75_box.jpg 480w, https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/blog_hub5f83f68bc64e484b7746fc546567c6b_142326_1024x0_resize_q75_box.jpg 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="139"
data-flex-basis="334px"
>&lt;/p></description></item></channel></rss>