<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>笔记 on Qing</title>
    <link>https://nick-zheng-q.top/notes/</link>
    <description>Recent content in 笔记 on Qing</description>
    <image>
      <title>Qing</title>
      <url>https://nick-zheng-q.top/social.png</url>
      <link>https://nick-zheng-q.top/social.png</link>
    </image>
    <generator>Hugo -- 0.149.0</generator>
    <language>zh</language>
    <lastBuildDate>Sat, 22 Aug 2026 23:35:56 +0800</lastBuildDate>
    <atom:link href="https://nick-zheng-q.top/notes/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>从 Obsidian 到线上：我的 Hugo 发布脚本是如何工作的</title>
      <link>https://nick-zheng-q.top/notes/obsidian-hugo/</link>
      <pubDate>Sat, 22 Aug 2026 23:35:56 +0800</pubDate>
      <guid>https://nick-zheng-q.top/notes/obsidian-hugo/</guid>
      <description>&lt;p&gt;这个站的文章发布，现在只需要在本地跑一条命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./publish.sh my-note.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这篇文章记录这个脚本的工作原理，以及它和 Obsidian 的配合方式。&lt;/p&gt;
&lt;h2 id=&#34;为什么不用-git也不用-cms&#34;&gt;为什么不用 git，也不用 CMS&lt;/h2&gt;
&lt;p&gt;静态博客的常见发布方式有几种：git push 触发 CI、网页版 CMS、或者 Hugo 自带的 &lt;code&gt;hugo deploy&lt;/code&gt;。我的场景有点特殊：写作在本地 Obsidian 里完成，服务器是自己的一台 VPS，中间不想引入第三方平台。那么最朴素的方案反而是最合适——&lt;code&gt;scp&lt;/code&gt; 把文件传上去，&lt;code&gt;ssh&lt;/code&gt; 触发服务器上现成的部署脚本。不需要守护进程，不需要 webhook，不需要在服务器上装任何新东西。&lt;/p&gt;
&lt;h2 id=&#34;脚本做了什么&#34;&gt;脚本做了什么&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;publish.sh&lt;/code&gt; 按顺序做七件事，任何一步失败都会中止，线上内容保持原样：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定位正文。&lt;/strong&gt; 接受一个 &lt;code&gt;.md&lt;/code&gt; 文件或一个目录。如果是目录，约定正文叫 &lt;code&gt;index.md&lt;/code&gt;——这是 Hugo 的 page bundle 结构，文章和它的图片放在同一个文件夹里，作为一个整体发布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成 slug。&lt;/strong&gt; URL 取自文件名：剥掉 &lt;code&gt;2026-08-22-&lt;/code&gt; 这样的日期前缀，转小写，非法字符转成连字符。&lt;code&gt;Obsidian Hugo Publish.md&lt;/code&gt; 变成&lt;code&gt;obsidian-hugo-publish&lt;/code&gt;。纯中文文件名会报错退出——这是有意的，URL 里的拼音或机器翻译都不如一个自己起的英文 slug 体面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;校验 front matter。&lt;/strong&gt; 检查 &lt;code&gt;title&lt;/code&gt; 存在；检查正文里没有 Obsidian 的 wiki 图片语法 &lt;code&gt;![[...]]&lt;/code&gt;（Hugo 不认识它）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;校验图片。&lt;/strong&gt; 扫描正文里所有 &lt;code&gt;![](...)&lt;/code&gt; 引用，确认每一个本地图片文件都真实存在。少了图片就中止——线上出现裂图比不发更糟。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补齐 date。&lt;/strong&gt; 所有校验通过后，才往 front matter 里补 &lt;code&gt;date&lt;/code&gt;。顺序很重要：先校验后改文件，失败的文章不会被留下修改痕迹。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组装并上传。&lt;/strong&gt; 把正文和被引用的图片拷进一个临时目录，组成 &lt;code&gt;content/notes/&amp;lt;slug&amp;gt;/&lt;/code&gt; 的结构，&lt;code&gt;scp&lt;/code&gt; 整包传上服务器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发部署，回写状态。&lt;/strong&gt; &lt;code&gt;ssh&lt;/code&gt; 到服务器执行 &lt;code&gt;deploy.sh&lt;/code&gt;（构建 → 同步到 nginx 目录 → reload)，最后把 Obsidian 笔记里的 &lt;code&gt;status:&lt;/code&gt; 改成&lt;code&gt;published&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;和-obsidian-的配合&#34;&gt;和 Obsidian 的配合&lt;/h2&gt;
&lt;p&gt;在每篇笔记的 Properties 里维护一个 &lt;code&gt;status&lt;/code&gt; 字段（&lt;code&gt;idea&lt;/code&gt; / &lt;code&gt;draft&lt;/code&gt; / &lt;code&gt;published&lt;/code&gt;)，配合 Dataview 插件拉一张表就是内容流水线看板：哪些是想法，哪些在写，哪些已发布。脚本发布成功后会自动把这个字段改成 &lt;code&gt;published&lt;/code&gt;，看板不需要手动维护。&lt;/p&gt;</description>
    </item>
    <item>
      <title>最终测试</title>
      <link>https://nick-zheng-q.top/notes/2025-09-29--/</link>
      <pubDate>Mon, 29 Sep 2025 01:14:34 +0800</pubDate>
      <guid>https://nick-zheng-q.top/notes/2025-09-29--/</guid>
      <description>&lt;p&gt;这是最终测试文章。&lt;/p&gt;</description>
    </item>
    <item>
      <title>测试部署演示</title>
      <link>https://nick-zheng-q.top/notes/test-deployment-demo/</link>
      <pubDate>Sat, 27 Sep 2025 22:28:56 +0800</pubDate>
      <guid>https://nick-zheng-q.top/notes/test-deployment-demo/</guid>
      <description>这是一个测试文章，用于演示博客的自动化部署流程</description>
    </item>
    <item>
      <title>My 1st post</title>
      <link>https://nick-zheng-q.top/notes/new-post/</link>
      <pubDate>Tue, 15 Sep 2020 11:30:03 +0000</pubDate>
      <guid>https://nick-zheng-q.top/notes/new-post/</guid>
      <description>Desc Text.</description>
    </item>
  </channel>
</rss>
