<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>魂灵宝藏</title><description>收藏灵感，记录生活</description><link>https://thesoullove.fun/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.8</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月14日 15:31:58</lastBuildDate><item><title>从零配置 Firefly 博客：部署过程与踩坑记录</title><link>https://thesoullove.fun/posts/firefly-deployment-notes/</link><guid isPermaLink="true">https://thesoullove.fun/posts/firefly-deployment-notes/</guid><description>记录 Firefly 博客从服务器部署到自动化发布的完整过程，以及构建卡顿、内存压力和部署方案调整。</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最近给自己部署了一个 Firefly 博客，并将它命名为「魂灵宝藏」。&lt;/p&gt;&lt;p&gt;Firefly 是一个基于 Astro 的静态博客主题。博客访问时不需要服务器实时生成页面，因此速度快、资源占用低，也比较容易维护。&lt;/p&gt;&lt;p&gt;不过，“静态博客”只是指网站运行时是静态的，并不代表构建过程也很轻量。实际部署过程中，我就在一台 2 核、约 2GB 内存的服务器上遇到了构建卡顿、内存压力过大，以及服务器暂时无法连接的问题。&lt;/p&gt;&lt;p&gt;这篇文章记录一下完整的配置过程，以及最后为什么改成了 GitHub Actions 自动构建。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;最初的服务器环境&lt;a href=&quot;#最初的服务器环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;服务器的基本配置如下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;2 核 CPU&lt;/li&gt;
&lt;li&gt;约 2GB 内存&lt;/li&gt;
&lt;li&gt;40GB 硬盘&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;Node.js 22&lt;/li&gt;
&lt;li&gt;pnpm 9.14.4&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Firefly 的源代码需要通过 Node.js 和 pnpm 安装依赖，然后使用 Astro 生成最终的静态页面。&lt;/p&gt;&lt;p&gt;基本流程是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;构建成功后，会生成一个 &lt;code&gt;dist&lt;/code&gt; 目录。里面是 HTML、CSS、JavaScript、图片和搜索索引等静态文件，Nginx 只需要把这个目录提供给访问者即可。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一次尝试：直接在服务器上构建&lt;a href=&quot;#第一次尝试直接在服务器上构建&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最开始采用的是最直接的方案：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;把 Firefly 源代码放到服务器。&lt;/li&gt;
&lt;li&gt;安装 Node.js 和 pnpm。&lt;/li&gt;
&lt;li&gt;在服务器上运行构建命令。&lt;/li&gt;
&lt;li&gt;让 Nginx 指向构建完成的目录。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;为了避免内存不足，还提前创建了 Swap，并限制了 Node.js 可使用的内存：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NODE_OPTIONS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;--max-old-space-size&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1400&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;但实际构建时，服务器很快变得非常卡顿。&lt;/p&gt;&lt;p&gt;SSH 连接开始超时，网页控制台也很难打开，看起来就像服务器直接“死机”了一样。重启后没有找到明确的系统级 OOM 记录，因此不能完全断定是内核杀掉了进程，但可以确认当时服务器已经处在非常明显的资源压力下。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么静态博客构建也会卡顿？&lt;a href=&quot;#为什么静态博客构建也会卡顿&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Firefly 不只是简单地复制几个 Markdown 文件。一次完整构建还可能包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;解析 Markdown 和 MDX&lt;/li&gt;
&lt;li&gt;生成所有文章页面&lt;/li&gt;
&lt;li&gt;处理和压缩图片&lt;/li&gt;
&lt;li&gt;生成低质量图片占位图&lt;/li&gt;
&lt;li&gt;打包 CSS 和 JavaScript&lt;/li&gt;
&lt;li&gt;复制或裁剪字体&lt;/li&gt;
&lt;li&gt;压缩内联脚本&lt;/li&gt;
&lt;li&gt;清理不需要的主题资源&lt;/li&gt;
&lt;li&gt;使用 Pagefind 创建全文搜索索引&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;其中图片处理、JavaScript 打包和搜索索引都会占用一定的 CPU 和内存。&lt;/p&gt;&lt;p&gt;所以静态博客的真实运行逻辑更接近：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Markdown 与配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;执行一次较重的构建&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;生成轻量的静态文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Nginx 提供访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;访问博客时很轻量，但生成博客的过程不一定轻量。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;尝试限制构建资源&lt;a href=&quot;#尝试限制构建资源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;为了防止构建再次拖垮整台服务器，我尝试把构建任务放进单独的后台服务，并设置资源限制，例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;内存软限制约 900MB&lt;/li&gt;
&lt;li&gt;内存上限约 1.2GB&lt;/li&gt;
&lt;li&gt;Swap 上限约 1.5GB&lt;/li&gt;
&lt;li&gt;限制 CPU 使用率&lt;/li&gt;
&lt;li&gt;降低磁盘读写优先级&lt;/li&gt;
&lt;li&gt;将 Node.js 堆内存限制为约 850MB&lt;/li&gt;
&lt;li&gt;减少并行线程数量&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这样做之后，服务器确实能够保持连接，不再轻易失去响应。&lt;/p&gt;&lt;p&gt;但是新的问题是：构建速度非常慢。&lt;/p&gt;&lt;p&gt;一次构建持续了一个多小时，Astro 和 esbuild 长时间占用 CPU。虽然理论上继续等待也可能完成，但这种方式显然不适合以后频繁发布文章。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;最终方案：GitHub Actions 构建&lt;a href=&quot;#最终方案github-actions-构建&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最后决定不再让小型服务器承担构建任务，而是把构建工作交给 GitHub Actions。&lt;/p&gt;&lt;p&gt;新的发布流程是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;修改文章或配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;推送到 GitHub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GitHub Actions 安装依赖并构建&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;生成 dist 静态文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;上传到服务器的新版本目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;切换 current 软链接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Nginx 立即提供新版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;同一个项目在 GitHub Actions 中构建只用了不到一分钟。相比服务器本地构建一个多小时，差别非常明显。&lt;/p&gt;&lt;p&gt;这也说明问题并不在 Firefly 无法正常构建，而是原服务器的 CPU、内存和磁盘性能不适合承担完整构建任务。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;部署目录设计&lt;a href=&quot;#部署目录设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;服务器上使用了类似下面的目录结构：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/var/www/firefly-site/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── current -&amp;gt; releases/当前版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── releases/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 版本一&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 版本二&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── 版本三&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;每次部署时，GitHub Actions 会：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;创建一个新的版本目录。&lt;/li&gt;
&lt;li&gt;将本次构建结果上传进去。&lt;/li&gt;
&lt;li&gt;检查关键文件是否存在。&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;current&lt;/code&gt; 软链接切换到新版本。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这种方式比直接覆盖线上文件安全。如果上传过程中失败，旧版本仍然可以正常访问；只有新版本完整上传后，网站才会切换过去。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用独立的部署用户&lt;a href=&quot;#使用独立的部署用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;为了减少安全风险，没有让 GitHub Actions 直接使用服务器的 root 用户。&lt;/p&gt;&lt;p&gt;服务器上创建了一个权限受限的部署用户，它只能操作博客部署目录，没有 sudo 权限。GitHub 中保存的则是专门用于部署的 SSH 私钥和服务器连接信息。&lt;/p&gt;&lt;p&gt;需要保存的内容通常包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;服务器地址&lt;/li&gt;
&lt;li&gt;SSH 端口&lt;/li&gt;
&lt;li&gt;部署用户名&lt;/li&gt;
&lt;li&gt;SSH 私钥&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些信息应该放在 GitHub Actions Secrets 中，不能直接写进公开仓库。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用 Nginx 提供静态文件&lt;a href=&quot;#使用-nginx-提供静态文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Nginx 指向 &lt;code&gt;current&lt;/code&gt; 目录，而不是某个固定版本：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;thesoullove.fun;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root &lt;/span&gt;&lt;span&gt;/var/www/firefly-site/current;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index &lt;/span&gt;&lt;span&gt;index.html;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;try_files &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;uri&lt;/span&gt;&lt;span&gt;/ /404.html;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ~* &lt;/span&gt;&lt;span&gt;\.(css|js|png|jpg|jpeg|gif|svg|webp|woff|woff2)$ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;expires &lt;/span&gt;&lt;span&gt;30d&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Cache-Control &lt;/span&gt;&lt;span&gt;&quot;public&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样每次切换 &lt;code&gt;current&lt;/code&gt; 软链接后，Nginx 不需要重新安装，也不需要重新启动整个服务器。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;域名与 HTTPS&lt;a href=&quot;#域名与-https&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;域名解析到服务器后，再通过 Certbot 为以下地址申请 HTTPS 证书：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;thesoullove.fun&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;www.thesoullove.fun&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最终让 HTTP 自动跳转到 HTTPS，并将 &lt;code&gt;www&lt;/code&gt; 地址统一跳转到主域名。&lt;/p&gt;&lt;p&gt;配置完成后，访问者看到的就是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://thesoullove.fun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;以后如何发布文章&lt;a href=&quot;#以后如何发布文章&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;采用 GitHub Actions 后，日常维护会简单很多。&lt;/p&gt;&lt;p&gt;新增文章时只需要：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;新建 Markdown 文件。&lt;/li&gt;
&lt;li&gt;填写标题、日期、分类和标签。&lt;/li&gt;
&lt;li&gt;编写正文。&lt;/li&gt;
&lt;li&gt;提交并推送到 GitHub。&lt;/li&gt;
&lt;li&gt;等待自动构建和部署完成。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;仍然需要执行一次构建，但不需要在自己的电脑或服务器上手动执行。GitHub 会自动完成这些工作。&lt;/p&gt;&lt;p&gt;分类和标签也不是单独维护的固定页面。Firefly 会读取文章头部的 &lt;code&gt;category&lt;/code&gt; 和 &lt;code&gt;tags&lt;/code&gt; 信息，在构建过程中自动生成对应页面。&lt;/p&gt;&lt;p&gt;如果没有任何文章使用分类或标签，可以把相关入口隐藏；以后添加了分类或标签，下一次构建时再自动显示。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;这次部署得到的经验&lt;a href=&quot;#这次部署得到的经验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;静态网站不代表构建过程很轻&lt;a href=&quot;#静态网站不代表构建过程很轻&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;静态网站上线后的资源占用很低，但构建时仍然可能需要大量 CPU、内存和磁盘读写。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;小型服务器更适合提供文件&lt;a href=&quot;#小型服务器更适合提供文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对于 2 核、2GB 左右的服务器，让它负责 Nginx 和静态文件访问非常合适，但没有必要同时让它承担依赖安装、图片处理和前端打包。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Swap 只能缓解问题&lt;a href=&quot;#swap-只能缓解问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Swap 可以降低进程因为内存不足而被终止的概率，但磁盘速度远低于内存。大量使用 Swap 后，服务器可能不会立即崩溃，却会变得非常卡顿。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;自动化构建更适合长期维护&lt;a href=&quot;#自动化构建更适合长期维护&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将源码和文章保存在 GitHub，由 GitHub Actions 构建，再将结果部署到服务器，可以同时获得：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;更快的构建速度&lt;/li&gt;
&lt;li&gt;更稳定的服务器&lt;/li&gt;
&lt;li&gt;可追踪的修改记录&lt;/li&gt;
&lt;li&gt;更安全的部署过程&lt;/li&gt;
&lt;li&gt;更方便的版本回退&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Firefly 最终采用的是“GitHub 负责构建，服务器负责运行”的方案。&lt;/p&gt;&lt;p&gt;这个结构比较适合低配置服务器：平时运行博客几乎不需要多少资源，而发布新文章时，也不会再因为构建任务导致服务器卡顿或连接中断。&lt;/p&gt;&lt;p&gt;整个过程里最大的误区，就是一开始认为静态博客的构建也一定很轻量。实际体验后才发现，把构建和运行分开，才是更稳定、更适合长期维护的方式。&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>