Obsidian 发布方案之 Quartz + Cloudflare:免费搭建个人博客(数字花园)网站,无需编程基础,小白也能上手

很多人用 Obsidian 积累了大量笔记,但这些内容一直锁在本地仓库里,只有自己能看。偶尔想把某篇写得不错的文章分享给别人,要么截图、要么复制粘贴,既麻烦又失去了双向链接、标签导航这些 Obsidian 原生的阅读体验。

Obsidian 官方提供了一项叫做 Obsidian Publish 的原生发布服务,月付定价为每个站点 10 美元/月(按年订阅则为 8 美元/月,合计 96 美元/年)。它的最大优势是零配置——在 Obsidian 里直接勾选文章点击发布,几秒钟内就能上线,双向链接、图谱、悬浮预览一应俱全,还包含 4 GB 托管空间、自定义域名、密码保护等功能,适合完全不想碰命令行的用户。但它的代价是持续的订阅费用,且样式自定义空间相对有限,数据也托管在 Obsidian 的服务器上,而非你自己掌控。

本文介绍的是另一条路:用 Quartz + Cloudflare Pages 搭建一套永久免费、完全自主的发布方案。两条路各有所长,第 2 节会做详细对比,帮你在动手之前做出适合自己的选择。

Quartz 解决的正是这个问题。它是一个开源的静态网站生成器,专门为 Obsidian 用户设计,能把你的 Markdown 笔记直接转换成一个保留双向链接、关系图谱和标签系统的完整网站,发布到互联网上让任何人都可以访问。搭配 Cloudflare Pages 托管,整套方案永久免费,你每次在 Obsidian 里写完笔记、运行一条命令,几分钟后网站就自动更新了。

本文从零开始,完整记录了从安装必要工具、初始化 Quartz、配置 GitHub 仓库,到最终部署上线的每一个操作步骤。读者不需要有任何前端开发背景,只需要按照步骤逐步操作即可。文章后半部分也覆盖了日常使用流程、Frontmatter 格式说明、常见报错排查,以及主题颜色、统计接入等进阶配置。


目录

  1. Quartz 是什么
  2. 为什么选择 Quartz + Cloudflare Pages
  3. 前提条件与准备工作
  4. 安装 Node.js 与 Git
  5. 安装与初始化 Quartz
  6. 配置 Quartz
  7. 配置 GitHub 仓库
  8. 部署到 Cloudflare Pages
  9. 日常使用:发布新内容
  10. 文章格式与发布控制
  11. 绑定自定义域名
  12. 进阶配置参考
  13. 常见问题排查
  14. 参考资源

1. Quartz 是什么

Quartz 是由开发者 Jacky Zhao 开发的开源静态网站生成器,专为把 Obsidian 笔记发布成网站而设计。与一般的博客框架不同,Quartz 理解 Obsidian 的双向链接语法([[笔记名]])、嵌入(![[图片]])、标签,并在生成的网站中完整还原这些功能,包括可交互的关系图谱、页面间的反向链接列表,以及鼠标悬停时弹出预览的链接卡片。对于长期积累 Obsidian 笔记的用户而言,Quartz 生成的网站不只是 ” 把笔记变成网页 “,而是一个保留了知识库完整语义结构的数字花园。

Quartz 还原生支持 Obsidian 的 Callout(标注块)语法,可以把 > [!note]> [!warning] 等 Callout 在网站上以对应样式正确显示,无需额外配置。此外,Quartz 内置对 LaTeX 公式渲染(基于 KaTeX)的支持,理工科笔记可以直接带公式发布。Mermaid 图表、代码块语法高亮也均属开箱即用的功能。

目前的主流版本是 Quartz v4,相比 v3 完全重写,基于 TypeScript 构建,配置文件更清晰,构建速度大幅提升,官方文档也更为完善。

整个发布流程中涉及三个主要角色:Quartz 负责把 Markdown 文件转换成静态 HTML;GitHub 负责存储代码,充当版本仓库;Cloudflare Pages 负责托管并把网站发布到互联网,每次你把更新推送到 GitHub,Cloudflare 会自动重新构建并发布最新版本。这三者的组合是 Quartz 官方推荐的部署方案,全程免费,国内访问速度也相对友好。


2. 为什么选择 Quartz + Cloudflare Pages

如果你已经在考虑发布自己的 Obsidian 笔记,这一节可以帮助你判断这套方案是否适合自己。

2.1 与 Obsidian Publish 的深度对比

Obsidian 官方提供的 Publish 服务是功能最完整、体验最流畅的发布方案,值得在决定使用 Quartz 之前认真了解。

定价: Obsidian Publish 按月计费为每个站点 10 美元/月;选择年付则折算为 8 美元/月(即 96 美元/年)。学生、教师和非营利组织员工可申请 40% 折扣,折后月付约为 6 美元、年付约为 4.8 美元/月。Obsidian 官网还支持 7 天无理由退款,试用成本较低。

下表从多个维度对两套方案进行对比,供你做出选择:

对比维度Obsidian PublishQuartz + Cloudflare Pages
费用8/月(年付)永久免费
配置门槛极低,Obsidian 内点击发布,无需命令行中等,初次配置需运行约 10 条命令
双向链接✅ 原生支持✅ 原生支持
关系图谱✅ 内置✅ 内置
悬浮预览✅ 内置✅ 内置
全文搜索✅ 内置✅ 内置
Mermaid 图表✅ 支持✅ 支持
Callout 标注块✅ 支持✅ 支持
LaTeX 公式✅ 支持✅ 支持(基于 KaTeX)
样式自定义支持自定义 CSS完全开源,可修改任意源代码
自定义域名✅ 支持(含在订阅内)✅ 支持(免费)
密码保护✅ 支持(含在订阅内)❌ 需自行实现
SEO 优化✅ 官方内置✅ 内置,可进一步定制
移动端发布✅ Obsidian 移动端直接操作需借助第三方 Git 应用
数据所有权托管于 Obsidian 服务器存储在自有 GitHub 仓库
托管空间4 GB(含在订阅内)Cloudflare Pages 免费层(无存储上限)
停服风险依赖 Obsidian 服务连续性自主可控,可随时迁移

如何选择: 如果你愿意为省去配置时间付费,对命令行没有兴趣,并且预算允许每年约 100 美元的持续支出,Obsidian Publish 是更舒适的选择。如果你不排斥一次性花 30~60 分钟完成初始配置,之后希望零成本运营,且有兴趣深度定制网站外观,Quartz 是更经济灵活的方案。

💡 说明 两套方案并不互斥。有用户同时运营 Obsidian Publish 站(用于主要内容,享受极致便捷)和 Quartz 站(用于实验性内容或需要深度定制的项目)。选择并非一刀切,可以根据具体需求灵活组合。

2.2 自由度与可定制性

Quartz 是完全开源的项目,网站的样式、布局、组件都可以通过修改源代码来定制。颜色主题、字体、侧边栏内容、页脚信息,都可以精细调整。社区已有开发者将 Obsidian 的主流主题(包括 Kanagawa、Rosé Pine 等)完整移植到 Quartz,一键切换即可让你的网站外观与 Obsidian 库保持一致。

2.3 数据所有权

使用 Quartz,你的笔记存储在自己的 GitHub 仓库里,网站文件也在自己的 Cloudflare 项目下,不依赖任何订阅服务,随时可以迁移或备份。

2.4 Cloudflare Pages 的选择理由

官方文档列出了 GitHub Pages、Cloudflare Pages、Vercel、Netlify 等多个部署目标。选择 Cloudflare Pages 有几个实际优势:Cloudflare 的 CDN 节点覆盖广,国内访问速度通常优于 GitHub Pages;Cloudflare Pages 不要求仓库必须公开,可以使用私有仓库;Cloudflare 处理 HTML 文件路径的方式(不带尾部斜线)与 Quartz 的链接生成逻辑完全吻合,不会出现 GitHub Pages 上偶发的链接跳转问题。

⚠️ 注意(Cloudflare Pages 产品动向) Cloudflare 自 2025 年起已将产品重心从 Pages 转向 Workers,并鼓励新项目使用 Workers 进行部署。目前 Cloudflare Pages 仍可正常创建新项目并使用,Quartz 官方文档也将其列为推荐的部署平台,本文教程流程仍然有效。但需了解:Cloudflare 的新功能会优先落地在 Workers,Pages 主要维持现有功能。如果你在若干年后看到本文,建议在操作前先查阅 Quartz 官方文档(quartz.jzhao.xyz/hosting)确认最新推荐的部署方式,再行操作。

当然,这套方案也有自己的边界:初次配置需要安装 Node.js、Git 并运行几条终端命令,对完全没有命令行经验的用户会有一定门槛。如果你从未打开过终端,本文后面的步骤会详细解释每个命令的含义,跟着操作即可。


3. 前提条件与准备工作

在开始之前,需要确认以下几项。

账号准备。 你需要一个 GitHub 账号(免费注册,地址:github.com)用来存储博客代码,以及一个 Cloudflare 账号(免费注册,地址:dash.cloudflare.com)用来托管网站。这两项注册只需要邮箱,整个过程无需付费。

设备要求。 Windows、macOS、Linux 均支持完整的部署流程,本文对三个平台的差异步骤均有说明。移动端无法完成初次配置,但配置完成后日常发布在移动端借助 Git 类应用也可以实现。

网络。 部分步骤需要访问 GitHub,建议在网络连接稳定的环境下操作。npm i 安装依赖时会从 npm 服务器下载文件,若速度过慢可以考虑设置 npm 镜像(见第 13 节常见问题)。

已有 Obsidian 仓库(可选)。 你不需要已有 Obsidian 仓库才能开始。Quartz 初始化时可以选择从空白内容开始,之后再把已有笔记逐步放进来。如果你已有仓库,第 6 节会说明几种不同的内容接入方式。

基本的文件管理与终端操作能力。 配置过程中需要找到文件夹路径、在终端中执行命令。如果你从未打开过终端,下面的步骤会一一解释。Windows 用户搜索「cmd」或「PowerShell」可以打开命令行工具,macOS 用户在「应用程序 → 实用工具」中找到「终端」,或者直接用 Spotlight 搜索「Terminal」。

下表是完整部署所需的工具与账号速览:

所需项目说明是否需要付费
Node.js v22 或更高Quartz 的运行环境免费
npm v10.9.2 或更高Node.js 包管理器(随 Node.js 一起安装)免费
Git代码版本管理工具免费
GitHub 账号存储代码免费
Cloudflare 账号网站托管免费

4. 安装 Node.js 与 Git

Quartz 的运行依赖 Node.js 和 Git 这两个基础工具,必须在开始安装 Quartz 之前完成这一步。

4.1 安装 Node.js

⚠️ 注意(版本要求) Quartz v4 要求 Node.js v22 或更高版本,以及 npm v10.9.2 或更高版本,官方文档明确指定了这两项最低要求。旧版本(如 v18、v20)在执行 npm i 时会报 EBADENGINE 错误,请务必安装 v22 而非 LTS 通道的旧版本。npm 会随 Node.js 一起安装,安装 v22 后 npm 通常也会满足版本要求。

Windows / macOS 安装方式: 打开 nodejs.org/zh-cn/download,选择你的操作系统对应的安装包(Windows 下载 .msi,macOS 下载 .pkg),双击安装,全程点击 ” 下一步 ” 即可。macOS 用户也可以用 Homebrew 安装:

brew install node@22

Linux / macOS 推荐用 nvm 安装,nvm 是 Node.js 的版本管理工具,方便日后在不同项目中切换版本:

# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
 
# 重启终端后安装并激活 Node 22
nvm install 22
nvm use 22

4.2 安装 Git

打开 git-scm.com/downloads,选择你的操作系统下载并安装。Windows 安装时所有选项保持默认即可,不需要做额外选择。macOS 用户可以通过 Homebrew 安装:

brew install git

4.3 验证安装

安装完成后,打开终端,依次运行以下三条命令:

node -v
npm -v
git -v

三条命令均有输出,且 Node.js 版本显示为 v22.x.x 或更高,npm 版本显示为 10.9.2 或更高,说明安装成功,可以继续下一步。预期输出类似:

v22.14.0
10.9.2
git version 2.47.0

⚠️ 注意(Windows 常见问题) 如果 git -v 提示 ” 不是内部或外部命令 “,说明 Git 安装后终端未刷新环境变量。请关闭当前终端窗口,重新打开一个新的终端再执行命令。若问题仍然存在,重启电脑后重试。


5. 安装与初始化 Quartz

5.1 选择存放位置并克隆 Quartz

首先在终端中进入你希望存放博客代码的文件夹。建议放在用户主目录下一个专门的项目文件夹里,方便日后管理。

macOS / Linux:

cd ~
mkdir Projects
cd Projects

Windows(PowerShell):

cd C:\Users\你的用户名\
mkdir Projects
cd Projects

💡 说明(Windows 用户名怎么看) 打开文件资源管理器,在地址栏输入 C:\Users\ 并回车,看到的文件夹名称即为你的用户名。

进入目标文件夹后,依次运行以下命令:

# 从 GitHub 下载 Quartz 代码
git clone https://github.com/jackyzha0/quartz.git
 
# 进入 quartz 文件夹
cd quartz
 
# 安装依赖(需联网,约 1~3 分钟)
npm i

npm i 执行期间终端会持续输出下载进度,等待它完成即可,不要中断。

5.2 初始化 Quartz 内容目录

依赖安装完成后,运行初始化命令:

npx quartz create

终端会依次出现两个交互式选择题。

第一个问题:如何初始化内容目录。

? Choose how to initialize the content in `/path/to/quartz/content`
  ❯ Empty Quartz
    Copy an existing folder
    Symlink an existing folder

用键盘方向键 ↑↓ 移动光标,按 Enter 确认。三个选项的含义分别是:Empty Quartz 从空白开始,你之后手动把笔记放入 content 文件夹;Copy an existing folder 把现有 Obsidian 库整个复制进来;Symlink an existing folder 创建一个符号链接指向现有库,修改立即反映。

💡 说明(如何选择初始化方式) 新手建议选择 Empty Quartz,先让整套流程跑通,再把笔记放进去,不容易出错。如果你已有大量笔记且希望立刻全部发布,可以选择 Copy an existing folder。如果你熟悉符号链接的概念,Symlink 是最方便日常同步的方式——在 Obsidian 里修改笔记,Quartz 的 content 目录同步更新,无需手动复制。

第二个问题:链接解析方式。

? Choose how Quartz should resolve links in your content.
  ❯ Treat links as shortest path
    Treat links as relative paths
    Treat all links as absolute paths

选择第一项 Treat links as shortest path,这与 Obsidian 的默认链接行为完全一致。

5.3 本地预览效果

初始化完成后,运行以下命令在本地预览博客样式:

npx quartz build --serve

终端输出 Started a Quartz server listening at http://localhost:8080 后,打开浏览器访问 http://localhost:8080 即可看到博客的初始外观。

Ctrl + C 可以停止预览服务器,之后继续进行后续配置步骤。


6. 配置 Quartz

6.1 打开配置文件

Quartz 的核心配置集中在根目录下的 quartz.config.ts 文件里。用你习惯的文本编辑器打开它,推荐使用 VS Code(code.visualstudio.com),如果没有安装,用系统自带的记事本(Windows)或文本编辑(macOS)也可以完成基础修改。

找到文件的方式:在文件管理器中打开第 5 节里 cd quartz 进入的那个文件夹,里面有 quartz.config.tspackage.json 等文件,右键点击 quartz.config.ts 选择用编辑器打开即可。

6.2 修改核心配置项

打开文件后,找到 configuration: { … } 部分,需要修改以下几个字段:

configuration: {
  pageTitle: "我的数字花园",         // 改成你想要的网站名称
  pageTitleSuffix: "",               // 网站标题后缀,可留空
  enableSPA: true,                   // 单页应用模式,保持默认
  enablePopovers: true,              // 悬浮预览,保持默认
  analytics: null,                   // null 表示暂不启用统计
  locale: "zh-CN",                   // 改成 zh-CN,让日期显示为中文格式
  baseUrl: "your-site.pages.dev",    // 暂时先不改,部署后再填写
  ignorePatterns: ["private", "templates", ".obsidian"],
  defaultDateType: "modified",
  // ...其余字段
}

💡 说明(按需调整) 上面的 pageTitle: "我的数字花园" 是示例名称,请替换为你自己的博客名称。baseUrl 字段暂时不用填写,等第 8 节完成 Cloudflare 部署后会拿到实际域名,届时再回来填入并重新同步即可。

baseUrl 填写格式说明: 这个字段仅用于站点地图、RSS 订阅等需要绝对路径的功能。填写时不要加 https://,不要有首尾的 /。正确示例:myblog.pages.dev;错误示例:https://myblog.pages.dev/

ignorePatterns 说明: 这个字段控制哪些文件夹不会被发布到网站。默认值已经包含了 private(私有笔记)、templates(模板文件夹)和 .obsidian(Obsidian 配置文件夹),这三个文件夹内的内容不会出现在网站上。

💡 说明(按需调整) ignorePatterns 中的文件夹名称是示例值,对应的是配置中预设的文件夹名称,并非 Quartz 的固定规则。如果你的 Obsidian 库中用来存放私稿的文件夹叫别的名字(例如 草稿inbox),请将 private 替换为你实际使用的文件夹名称。你也可以在列表中添加多个文件夹名,例如 ["草稿", "模板", ".obsidian"]

项目示例值替换建议
私有内容文件夹名private替换为你实际的草稿/私有文件夹名称
模板文件夹名templates替换为你 Templater 或 Templates 插件设置的模板文件夹名称

6.3 把笔记放进 Quartz

Quartz 读取的内容存放在 quartz/content/ 文件夹里,有以下几种方式把笔记放进去:

方式 A:直接复制(新手推荐)。 把 Obsidian 库中想公开发布的 .md 文件,复制粘贴到 quartz/content/ 文件夹里。这是最稳妥的方式,不会影响你原始的 Obsidian 库。

方式 B:把 content 文件夹作为 Obsidian 库打开。 在 Obsidian 中点击左下角「打开其他库」→「打开文件夹作为库」,选择 quartz/content 这个文件夹。这样你在 Obsidian 里写的笔记就直接存到了 Quartz 的内容目录,不需要额外复制,日常使用最方便。

方式 C:初始化时选择 Symlink(进阶)。 如果在 5.2 节初始化时选择了 Symlink an existing folder,则已经将你的 Obsidian 库软链接到 content 目录,两边是同一份文件,无需任何额外操作。

必须创建首页文件。 无论哪种方式,都需要在 content/ 根目录下创建一个名为 index.md 的文件作为博客首页。内容可以很简单:

---
title: 首页
---

# 欢迎来到我的博客

这里是我记录知识和想法的地方。

如果 content/ 里没有 index.md,本地预览时首页会显示空白。


7. 配置 GitHub 仓库

GitHub 在这套方案中充当代码仓库:Quartz 的代码和你的 Markdown 笔记都存储在这里,Cloudflare Pages 会监听这个仓库,每次有新提交就自动触发重新构建和部署。

7.1 配置 Git 身份信息

如果你是第一次在这台电脑上使用 Git,需要先告诉 Git 你的姓名和邮箱,这些信息会出现在提交记录里:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

建议使用与 GitHub 账号注册时相同的邮箱,方便提交记录与账号关联。

7.2 在 GitHub 上新建仓库

登录 GitHub,点击右上角「+」号 →「New repository」,按以下方式填写:

仓库名可以任意填写(如 my-blog),建议用纯英文小写字母,避免中文和特殊字符。可见性选择 Public(公开)。

⚠️ 注意 创建时不要勾选「Add a README file」、「.gitignore」、「Choose a license」这三项,保持全部未勾选,否则仓库会产生一个初始提交,导致后续推送 Quartz 代码时产生冲突。

填写完成后点击「Create repository」。

7.3 配置 SSH 连接 GitHub

SSH 连接方式一旦配置好,之后推送代码不需要每次输入密码,是更稳定、安全的连接方式。

第一步:检查是否已有 SSH 密钥。

ls ~/.ssh

如果看到 id_ed25519id_ed25519.pub 这两个文件,说明已有密钥,可以跳到第三步。

第二步:生成新密钥。

ssh-keygen -t ed25519 -C "你的邮箱@example.com"

连续按三次回车(接受默认路径,密码留空),终端显示随机密钥图表示生成成功。

第三步:复制公钥内容。

macOS / Linux:

cat ~/.ssh/id_ed25519.pub

Windows(PowerShell):

Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"

输出以 ssh-ed25519 开头的一长串文本,全部选中并复制。

第四步:把公钥添加到 GitHub。

登录 GitHub,点击右上角头像 → Settings → 左侧菜单 「SSH and GPG keys」「New SSH key」。Title 填写任意名称(如「我的电脑」),Key type 选 Authentication Key,将复制的公钥粘贴到 Key 字段,点击「Add SSH key」。

第五步:测试连接。

ssh -T git@github.com

看到 Hi 你的用户名! You've successfully authenticated 说明连接成功。如果出现 Are you sure you want to continue connecting? 的提示,输入 yes 回车即可。

7.4 将 Quartz 推送到 GitHub

回到终端,确认当前在 quartz 目录中,运行以下命令:

# 查看当前远程仓库地址
git remote -v
 
# 将 origin 改为你自己的 GitHub 仓库地址(SSH 格式)
git remote set-url origin git@github.com:你的用户名/仓库名.git
 
# 添加 upstream,用于日后接收 Quartz 官方更新
git remote add upstream https://github.com/jackyzha0/quartz.git
 
# 验证设置是否正确
git remote -v

💡 说明(按需调整) 命令中的 你的用户名仓库名 需要替换为你的实际 GitHub 用户名和第 7.2 节创建的仓库名。GitHub 用户名是登录后个人主页 URL 中的那段,例如 github.com/zhangsan 中的 zhangsan,不是昵称。

git remote -v 应当显示类似以下内容:

origin    git@github.com:你的用户名/仓库名.git (fetch)
origin    git@github.com:你的用户名/仓库名.git (push)
upstream  https://github.com/jackyzha0/quartz.git (fetch)
upstream  https://github.com/jackyzha0/quartz.git (push)

设置正确后,执行第一次推送:

npx quartz sync --no-pull

第一次推送使用 --no-pull 参数,避免因为远端仓库为空而产生合并冲突。看到 Done! 或类似提示说明推送成功。

⚠️ 注意(推送失败时的处理) 如果提示缓冲区不足,执行以下命令后重试:

git config http.postBuffer 524288000
npx quartz sync --no-pull

如果提示权限错误,检查 SSH 密钥是否已添加到 GitHub,并重新运行 ssh -T git@github.com 确认连接。


8. 部署到 Cloudflare Pages

8.1 创建 Pages 项目并连接 GitHub

登录 Cloudflare Dashboard(dash.cloudflare.com),在左侧菜单找到 「Compute (Workers)」「Workers & Pages」,点击 「Create application」

⚠️ 注意(Cloudflare 界面变更) Cloudflare 在 2025 年底更新了创建入口界面。点击「Create application」后,你会看到一个名为 「Ship something new」 的页面,这个页面是用来创建 Workers 的,不是 Pages。不要在这里点击「Continue with GitHub」——那样会创建 Worker 项目而非 Pages 项目。

正确做法:忽略该页面上所有选项,直接找到并点击页面底部「Looking to deploy Pages? Get started」 链接,才会进入真正的 Pages 部署流程。

如果误点创建了 Worker 项目,可以回到「Workers & Pages」列表,进入错误创建的项目,在「Settings」底部找到「Delete」,输入项目名称确认删除,然后重新操作。删除 Worker 项目不会影响你的 GitHub 仓库。

8.2 连接 GitHub 账号

进入 Pages 部署流程后,点击 「Connect to Git」「Connect GitHub」,在弹出的 GitHub 授权页面中点击 「Authorize Cloudflare Pages」

授权方式可以选择「All repositories」(授权全部仓库,方便日后管理多个站点)或「Only select repositories」(仅授权你创建的这个仓库)。点击「Save」完成授权后,页面会显示你的 GitHub 仓库列表,选择第 7.2 节创建的仓库,继续下一步。

8.3 配置构建参数

进入「Set up builds and deployments」配置页面,按照下表填写:

配置项填写内容
Production branch(生产分支)v4
Framework preset(框架预设)None(不选任何框架)
Build command(构建命令)npx quartz build
Build output directory(输出目录)public

⚠️ 注意(Production branch 必须填 v4) Quartz 使用 v4 作为主分支名称,不是常规的 mainmaster。如果这里填错,Cloudflare 监听不到你的代码更新,每次推送后网站都不会自动重新部署。

填写完成后点击 「Save and deploy」,Cloudflare 开始自动构建,通常需要 1~3 分钟。

8.4 查看部署结果与获取域名

构建成功后,Cloudflare 会为你的项目分配一个免费域名,格式类似:

https://你的项目名-随机字符.pages.dev

点击这个地址即可看到已经上线的博客。记下这个域名,下一步需要把它填回 Quartz 的配置文件里。

8.5 将域名填回配置文件

拿到 Cloudflare 分配的域名后,回到本地的 quartz.config.ts,找到第 6 节中留空的 baseUrl 字段,填入实际域名(不含 https://):

baseUrl: "你的项目名-随机字符.pages.dev",

保存后,在终端中运行:

npx quartz sync

Cloudflare 检测到代码更新后会自动触发重新构建。至此,完整的部署流程全部完成。


9. 日常使用:发布新内容

配置完成后,日常的发布流程极为简单。每次在 Obsidian 里写完新笔记或修改了已有文章,想把更新推送到网站,只需要在终端中运行一条命令:

macOS / Linux:

cd ~/Projects/quartz
npx quartz sync

Windows(PowerShell):

cd C:\Users\你的用户名\Projects\quartz
npx quartz sync

💡 说明(按需调整) 上面的路径 ~/Projects/quartz 是第 5.1 节中建议的存放位置,如果你当时选择了其他路径,替换为实际路径即可。~/ 在 macOS / Linux 中代表用户主目录,在 Windows 中等同于 C:\Users\你的用户名\

npx quartz sync 执行后,Cloudflare Pages 会自动检测到 GitHub 上的新提交,1~2 分钟内完成重新构建和发布,打开网站即可看到最新内容。

9.1 借助插件实现免终端发布

如果你安装了 Obsidian 的 Git 社区插件(由 Vinzent 开发),也可以在 Obsidian 内直接点击工具栏按钮完成推送,不需要打开终端。该插件支持定时自动提交,是桌面端最流畅的日常发布体验。

⚠️ 注意(移动端限制) Obsidian Git 插件在移动端(iOS / Android)通过 isomorphic-git(一个 JavaScript 版的 Git 实现)运行,并非原生 Git,存在已知的性能问题和功能限制——在文件数量较多的仓库中,检测文件变更会非常耗时(数千文件的仓库可能需要数分钟),且 SSH 认证在移动端不受支持,只能使用 HTTPS + Personal Access Token 方式连接 GitHub。如果你的仓库规模较大,移动端的发布体验可能并不理想,仍建议以桌面端为主。

此外,社区还有一款专为 Quartz 设计的 Quartz Syncer 插件(由 saberzero1 开发),可以在 Obsidian 内直接把指定文件夹的笔记推送到 GitHub 上的 Quartz 仓库,适合 ” 主库与发布内容分离 ” 的工作流——你的 Obsidian 库保持不变,Quartz Syncer 只将你选定的笔记同步过去,无需手动移动或复制文件。该插件通过 GitHub REST API 进行操作,也适用于移动端。在 Obsidian 社区插件库中搜索「Quartz Syncer」即可找到。

以下是几条常用命令的速查表:

命令作用
npx quartz build --serve本地预览博客(访问 http://localhost:8080
npx quartz build仅构建静态文件,不推送也不启动服务器
npx quartz sync推送更新到 GitHub,自动触发 Cloudflare 重新部署
npx quartz sync --no-pull第一次推送时使用,避免空仓库合并冲突
npx quartz update从 upstream 拉取 Quartz 官方更新

10. 文章格式与发布控制

Quartz 支持在每篇 Markdown 文件顶部添加 Frontmatter(前置属性),通过 YAML 格式的键值对来控制文章在网站上的显示行为。这套系统与 Obsidian 的 Properties 功能完全兼容。

常用的 Frontmatter 字段如下:

---
title: 我的第一篇文章        # 网站上显示的文章标题(不填则用文件名)
date: 2024-01-15             # 创建日期,影响排序和显示
tags:
  - 笔记
  - 学习
draft: true                  # 设为 true 则该文章不会发布到网站
---
 
正文内容从这里开始...

关于 draft 字段。 将某篇笔记的 draft 设为 true,这篇文章会被 Quartz 跳过,不会出现在网站的任何页面上。这是控制个别文章是否发布最干净的方式,不需要移动文件的位置。

关于私有文件夹。 除了 draft 字段,也可以把不想发布的笔记放入 content/private/ 文件夹,Quartz 会完整忽略这个文件夹及其子文件夹内的所有内容。两种方式可以配合使用:private 文件夹适合整批隐藏,draft: true 适合在正常文件夹内临时隐藏单篇文章。

💡 说明(按需调整) content/private/ 是 Quartz 在 quartz.config.tsignorePatterns 配置中预设的忽略文件夹,private 这个名称本身并没有特殊含义,完全可以改用其他名称(如 草稿inbox)。修改的地方是 quartz.config.tsignorePatterns 数组,与实际文件夹名称保持一致即可。

图片的存放位置。 Quartz 能正确处理 Obsidian 的图片嵌入语法(![[图片.png]]),但前提是图片文件必须存放在 content/ 目录内。建议在 content/ 下创建 images/ 子文件夹统一存放附件,同时在 Obsidian「设置 → 文件与链接」中将「新附件的默认存放位置」改为 当前文件所在文件夹指定文件夹,并将路径设为 images,确保每次粘贴图片时 Obsidian 自动存放到正确位置。

关于 Callout 标注块。 Quartz 原生支持 Obsidian 的 Callout 语法,无需任何额外配置。你在 Obsidian 里使用的 > [!note]> [!warning]> [!tip] 等标注块,在发布后会以对应的样式正确渲染。如果你大量使用 Callout 来组织笔记内容,发布后的阅读体验与 Obsidian 内部高度一致。


11. 绑定自定义域名

如果你拥有自己购买的域名(如 myblog.com),可以将其绑定到 Cloudflare Pages,替换掉默认的 .pages.dev 域名。

在 Cloudflare Pages 的项目页面中,点击 「Custom domains」(自定义域名)→ 「Set up a custom domain」,输入你的域名,按照页面提示配置 DNS 记录。如果你的域名本身也托管在 Cloudflare,整个过程几乎自动完成;如果域名在其他注册商,需要在那边的 DNS 后台手动添加 Cloudflare 提供的 CNAME 或 A 记录。

完成域名绑定后,回到本地的 quartz.config.ts,将 baseUrl 更新为你的自定义域名:

baseUrl: "myblog.com",   // 不含 https://,不含结尾斜线

保存后运行 npx quartz sync 重新部署即可。

💡 说明(SSL 证书) Cloudflare 会自动为自定义域名签发并续期 SSL 证书,无需额外配置,域名绑定完成后通常几分钟内即可通过 HTTPS 访问。


12. 进阶配置参考

这一节涵盖几项常见的进阶设置,均为可选内容,不影响基础部署流程,可以在网站上线后按需逐步调整。

12.1 自定义颜色主题与字体

quartz.config.tstheme 部分可以修改字体和配色方案。字体字段接受 Google Fonts 上的任意字体名称,配色字段分别对应亮色模式和暗色模式:

theme: {
  typography: {
    header: "Schibsted Grotesk",   // 标题字体
    body: "Source Sans Pro",        // 正文字体
    code: "IBM Plex Mono",          // 代码字体
  },
  colors: {
    lightMode: {
      light: "#faf8f8",             // 页面背景色
      secondary: "#284b63",         // 链接颜色
    },
    darkMode: {
      light: "#161618",
      // ...
    },
  },
},

修改后运行 npx quartz build --serve 本地预览确认效果,满意后再 npx quartz sync 推送到线上。

💡 说明(Obsidian 主题移植) 社区已有开发者将多款 Obsidian 主流主题完整移植到 Quartz,涵盖 Kanagawa、Kanagawa Paper、Rosé Pine 等,可以在 emilebangma.com/Quartz/ 找到对应资源。如果你在 Obsidian 里长期使用某款主题,移植版能让你的网站与知识库保持视觉一致性。

12.2 接入网站访问统计

Quartz 支持 Plausible、Umami、Google Analytics 等多种分析服务,在 quartz.config.tsanalytics 字段中配置即可。将 analytics: null 修改为对应服务的配置对象后重新部署,具体各服务的配置格式可以参考 Quartz 官方文档(quartz.jzhao.xyz)。

12.3 接收 Quartz 官方更新

Quartz 持续迭代,会修复 bug 并添加新功能。在第 7.4 节中已经添加了 upstream 远程仓库,当 Quartz 官方发布更新后,可以运行以下命令将更新合并到你的本地版本:

git fetch upstream
git merge upstream/v4
 
npm i
npx quartz sync

合并时可能会出现冲突,通常是 quartz.config.ts 中你修改过的字段与官方更新产生冲突。冲突文件中会出现 <<<<<<< HEAD>>>>>>> upstream/v4 标记,手动保留你自己的修改部分,删除标记行,保存后再继续推送。

⚠️ 注意 如果你修改了 Quartz 的组件源代码(quartz/components/ 下的文件),更新时冲突的概率更高,需要仔细对比官方修改和你的自定义内容。建议尽量只通过 quartz.config.ts 进行配置调整,减少直接修改框架代码,以便更顺滑地接收官方更新。

12.4 设置 Cloudflare 构建时 git 时间戳

Cloudflare Pages 默认执行浅克隆(shallow clone),只拉取最近一次提交,这会导致 Quartz 无法读取文件的 git 历史来准确计算「最后修改时间」,所有文章的日期可能显示不正确。

解决方式是将构建命令从 npx quartz build 改为:

git fetch --unshallow && npx quartz build

在 Cloudflare Pages 的项目设置中,找到「Settings → Builds & deployments → Build configurations」,将 Build command 更新为上面这条命令后保存即可。

💡 说明 这条命令先拉取完整的 git 历史记录(git fetch --unshallow),再执行 Quartz 构建,能确保每篇文章的修改时间戳准确。如果你在 Frontmatter 里为每篇文章手动填写了 date 字段,也可以不做此修改——Quartz 会优先使用 Frontmatter 中的日期值。


13. 常见问题排查

13.1 运行 npm i 报错 EBADENGINE

这个错误说明 Node.js 版本过低,不满足 Quartz v4 的最低要求(v22+)。运行 node -v 确认当前版本,如果低于 v22,参考第 4.1 节用 nvm 安装 v22:

nvm install 22
nvm use 22

安装完成后,在 quartz 目录中重新运行 npm i。如果版本已经是 v22 但仍报错,可以先清除缓存再重试:

npm cache clean --force
npm i

13.2 npm i 下载速度极慢

npm 默认连接海外服务器,国内网络环境下速度有时不理想。可以临时切换到淘宝镜像:

npm i --registry https://registry.npmmirror.com

也可以永久切换镜像(注意:使用镜像后官方包的最新版本可能有延迟):

npm config set registry https://registry.npmmirror.com

13.3 npx quartz sync 提示权限错误

常见原因是 SSH 密钥未正确添加到 GitHub,或当前仓库地址不是 SSH 格式。依次检查:运行 ssh -T git@github.com 测试连接;运行 git remote -v 确认 origin 地址以 git@github.com: 开头,而非 https://。如果 origin 地址是 HTTPS 格式,运行以下命令切换为 SSH:

git remote set-url origin git@github.com:你的用户名/仓库名.git

13.4 Cloudflare 构建失败

在 Cloudflare Pages 项目页面点击失败的部署记录,查看完整构建日志定位具体错误。

最常见的原因一:Production branch 填写错误。 检查「Settings → Builds & deployments」中的 Production branch 是否为 v4,不是 mainmaster

最常见的原因二:git 时间戳问题。 如果日志中出现与时间戳相关的警告,将 Build command 改为:

git fetch --unshallow && npx quartz build

其他情况: 如果日志显示依赖安装失败,检查 Build command 是否完整,Framework preset 是否已设为 None

13.5 本地 http://localhost:8080 打开是空白页

两个常见原因:一是 content/ 文件夹里没有 index.md 文件,Quartz 找不到首页;二是某个 Markdown 文件存在语法错误导致构建异常。先确认 content/index.md 存在,再重新运行 npx quartz build --serve,观察终端输出是否有报错信息。

13.6 网站上图片不显示

确认图片文件存放在 content/ 目录内(如 content/images/),并且 Markdown 中的图片引用路径正确。Obsidian 的 ![[图片.png]] 语法 Quartz 能识别,但图片文件本身必须在 content/ 目录内,存放在外部 Obsidian 库里的图片不会被打包进去。

13.7 如何更新 Quartz 到最新版本

git fetch upstream
git merge upstream/v4
npm i
npx quartz sync

合并时若出现冲突,按第 12.3 节的说明手动解决。

13.8 推送后 Cloudflare 迟迟没有重新部署

登录 Cloudflare Dashboard,在项目页面的「Deployments」选项卡下查看是否有新的构建任务。如果没有,检查 Production branch 是否确实是 v4,以及 GitHub 授权是否仍然有效(可以在 Cloudflare 项目设置的「Connected Git repository」处查看)。

13.9 Callout 在网站上显示为普通引用块而非标注样式

这种情况通常是因为 quartz.config.ts 中没有启用 ObsidianFlavoredMarkdown 插件或其 callouts 选项被关闭。检查配置文件中的 plugins.transformers 数组,找到 Plugin.ObsidianFlavoredMarkdown(…) 条目,确认其中 callouts: true(这是默认值,一般无需修改)。如果该插件整体被注释掉,取消注释重新部署即可恢复 Callout 渲染。


14. 参考资源

  • Quartz 官方文档quartz.jzhao.xyz):涵盖所有配置项说明、插件系统、主题定制等完整内容,遇到本文未覆盖的问题首先查阅这里。
  • Quartz GitHub 仓库github.com/jackyzha0/quartz):源代码、Issue 追踪和 Release 记录,查看最新版本更新内容和已知问题的最佳入口。
  • Quartz Hosting 官方文档quartz.jzhao.xyz/hosting):包含 Cloudflare Pages、GitHub Pages、Vercel、Netlify 等各平台的官方部署指引,本文 Cloudflare 部分所用的构建配置均出自这里。
  • Cloudflare Pages 官方文档developers.cloudflare.com/pages):自定义域名配置、构建参数说明、访问限制等高级功能的完整参考。
  • Obsidian Publish 官方页面obsidian.md/publish):Obsidian 原生发布服务的完整功能说明与定价,适合在选择方案前做对比参考。
  • Obsidian 社区论坛 Quartz 相关讨论forum.obsidian.md):搜索「Quartz」可以找到大量用户在部署和定制过程中的实际经验与踩坑记录,中英文均有。
  • nvm 官方 GitHubgithub.com/nvm-sh/nvm):Node.js 版本管理工具,Linux / macOS 上管理多个 Node 版本的标准方案。
  • Obsidian Git 插件(Obsidian 社区插件库搜索「Git」,由 Vinzent 开发):在 Obsidian 内直接完成提交和推送,是最流畅的桌面端免终端日常发布方案。注意移动端功能受限,详见第 9.1 节说明。
  • Quartz Syncer 插件(Obsidian 社区插件库搜索「Quartz Syncer」,由 saberzero1 开发):专为 Quartz 设计的发布插件,支持从独立 Obsidian 库向 Quartz GitHub 仓库同步指定文件夹,适合主库与发布内容分离的工作流,桌面端与移动端均可使用。
  • Obsidian 主题移植资源emilebangma.com/Quartz/):汇集了社区将多款主流 Obsidian 主题移植到 Quartz 的成果,可以让你的知识网站与 Obsidian 库保持视觉一致性。