news 2026/5/7 17:01:49

Obsidian笔记一键发布:基于Quartz与Cloudflare Pages的静态网站部署方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Obsidian笔记一键发布:基于Quartz与Cloudflare Pages的静态网站部署方案

1. 项目概述:将你的知识库一键发布到云端

如果你和我一样,是个重度 Obsidian 用户,那么你的 Vault 里一定塞满了各种笔记、想法和项目资料。这些内容价值连城,但往往只沉睡在你的本地硬盘里。有没有想过,能像管理代码仓库一样,轻松地把选定的笔记发布成一个美观、可搜索的静态网站,并且拥有自己的专属域名?这就是obsidian-cloudflare-pages-skill这个 OpenClaw 技能要帮你解决的核心问题。

简单来说,它是一个自动化的工作流工具,能将你 Obsidian 笔记库(或任何 Markdown 文件夹)中的特定内容,通过 Quartz 静态网站生成器构建,并一键部署到 Cloudflare Pages 上。整个过程从配置、同步、构建到部署,全部通过命令行搞定,极大地简化了从笔记到公开知识库的发布流程。无论你是想建立一个公开的技术博客、一个团队内部的知识 Wiki,还是一个私人的学习笔记集,这个工具都能让你摆脱繁琐的部署细节,专注于内容创作本身。

2. 核心设计思路与方案选型

2.1 为什么是这套技术栈?

这个项目的设计思路非常清晰:利用成熟、免费或低成本的开源工具,构建一个高度自动化且安全的发布管道。我们拆开来看每个环节的选型考量:

  1. 源内容管理:ObsidianObsidian 以其强大的双向链接、本地优先和丰富的插件生态,成为了个人知识管理的首选。选择它作为内容源,意味着你可以继续在你最熟悉、最高效的环境里写作,无需改变习惯。工具只负责“发布”这个动作,而不干涉“创作”过程。

  2. 静态站点生成:QuartzQuartz 是一个专门为关联笔记(Zettelkasten)优化的静态网站生成器。它原生支持 Obsidian 式的双链语法[[ ]],能自动将笔记间的链接转化为网站内的超链接,并生成反向链接(Backlinks)面板。这对于呈现一个相互关联的知识网络至关重要,是其他通用 SSG(如 Hugo、Jekyll)需要额外配置才能实现的功能。

  3. 部署平台:Cloudflare Pages这是整个方案的成本和易用性核心。Cloudflare Pages 提供免费的静态网站托管、全球 CDN、自动的 HTTPS 证书,并且与 Git 工作流深度集成。虽然本项目绕过了直接的 Git 集成,而是通过 Wrangler CLI 部署,但仍然享受其所有基础设施优势。选择它,意味着你几乎可以零成本拥有一个快速、安全的全球可访问网站。

  4. 自动化粘合剂:OpenClaw SkillOpenClaw 是一个自动化工作流平台,Skill 是其可复用的功能模块。将整个发布流程封装成一个 Skill,带来了几个关键好处:配置集中管理(所有设置在一个config.json里)、流程标准化(通过init,wizard,run等命令提供一致体验)、环境隔离(技能有自己的依赖和.env文件)。这比写一堆散落的脚本要可靠和易于维护得多。

2.2 安全与可控性设计

从项目的更新日志和配置项可以看出,开发者对安全性和操作风险有着深刻的考虑,这也是一个生产级工具必备的素质:

  • SAFE_MODE--dry-run:这是最重要的安全阀。SAFE_MODE=1会完全阻止对外部环境(Cloudflare)的写操作和潜在的破坏性本地操作。--dry-run参数则可以在执行任何实际文件操作或部署前,完整地预览所有将要执行的步骤。在操作不熟悉的系统或关键数据前,务必使用这些选项。
  • 同步模式选择 (syncMode):提供了mirrorappend两种模式。mirror模式会使用rsync--delete选项,使目标目录成为源目录的精确镜像,这可能会删除目标目录中存在而源目录中没有的文件。append模式则只添加或更新文件,不会删除任何已有文件。对于初期或不希望冒任何数据丢失风险的用户,建议从append模式开始。
  • 凭证管理:强烈建议通过.env文件管理 Cloudflare API Token、Account ID 以及 Basic Auth 的账号密码。将.env文件加入.gitignore,避免敏感信息泄露。配置文件 (config.json) 中只应引用环境变量名,而不是写死实际值。

注意:即使提供了 Basic Auth 功能,它也只是 HTTP 层面的基础访问控制。对于真正敏感的内容,你应当考虑更严格的保护措施,例如将整个站点部署在 Cloudflare Access 之后,或者根本不要将其发布到公网。

3. 从零开始的完整实操指南

3.1 环境准备与依赖安装

在运行技能之前,你需要一个可用的基础环境。以下步骤假设你使用的是 macOS 或 Linux 系统(Windows 用户建议使用 WSL2)。

1. 安装 Node.js 和 npmQuartz 4 需要 Node.js 环境。建议使用 nvm 来管理 Node 版本,避免权限问题。

# 安装 nvm (Node Version Manager) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash # 重新打开终端或运行 source ~/.bashrc (或 ~/.zshrc) # 安装最新的 LTS 版本 Node.js nvm install --lts nvm use --lts # 验证安装 node --version npm --version

2. 安装 rsyncrsync是文件同步的核心工具,在 macOS 上通常已预装,Linux 可通过包管理器安装。

# Ubuntu/Debian sudo apt-get install rsync # CentOS/RHEL/Fedora sudo yum install rsync # 或 sudo dnf install rsync

3. 安装 Wrangler CLIWrangler 是 Cloudflare 的官方命令行工具,用于管理 Workers 和 Pages 项目。

npm install -g wrangler # 验证安装 wrangler --version

4. 登录 Cloudflare 并获取凭证这是连接 Cloudflare 账户的关键步骤。

# 通过命令行登录,会打开浏览器进行授权 wrangler login

登录成功后,你需要获取两个关键信息:

  • Account ID:在 Cloudflare 仪表板右下角,点击你的账户名称,进入“概述”页面,在右侧“API”区域即可找到“账户 ID”。
  • API Token:你需要创建一个具备 Pages 编辑权限的 Token。
    1. 进入 Cloudflare 仪表板,右上角头像 -> “我的个人资料”。
    2. 选择 “API 令牌” 标签页。
    3. 点击 “创建令牌”。
    4. 使用 “编辑 Cloudflare Pages” 模板。
    5. 在“账户资源”中,选择包含你 Pages 项目的账户。
    6. 继续并创建令牌。务必立即复制并妥善保存这个 Token,它只会显示一次。

3.2 技能初始化与配置向导

假设你已经通过 OpenClaw 的机制安装或克隆了obsidian-cloudflare-pages-skill到你的技能目录。

1. 进入 OpenClaw 工作区

cd ~/.openclaw/workspace

2. 初始化配置文件首次运行时,需要从模板创建配置文件。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js init

这个命令会在skills/obsidian-cloudflare-pages/config/目录下生成一个config.json文件,其内容拷贝自config.example.json

3. 运行交互式配置向导这是最推荐的方式,向导会一步步引导你完成所有必要设置。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js wizard

向导通常会询问以下信息,请提前准备好:

  • Obsidian Vault 路径:你的笔记库在本地的绝对路径(如/Users/yourname/Documents/ObsidianVault)。
  • 要发布的文件夹:Vault 中哪些文件夹的内容需要被发布(例如Clippings,Public)。
  • 要排除的文件夹:哪些文件夹应被忽略(例如Private,.obsidian,Templates)。
  • Cloudflare 项目名:在 Cloudflare Pages 上创建或使用的项目名称。
  • 生产环境域名:你计划绑定的自定义域名(如notes.yourdomain.com)。
  • 是否启用 Basic Auth:如果启用,需要设置用户名和密码。

4. 配置环境变量(存储敏感信息)永远不要将 API Token 等秘密写入config.json。使用.env文件。

cd skills/obsidian-cloudflare-pages cp .env.example .env # 使用你喜欢的文本编辑器编辑 .env 文件,例如 nano 或 vim nano .env

.env文件中填入你的真实信息:

# Cloudflare 凭证 CLOUDFLARE_API_TOKEN=你的_API_Token_粘贴在这里 CLOUDFLARE_ACCOUNT_ID=你的_Account_ID_粘贴在这里 # 可选:如果向导中配置了 Basic Auth 并选择使用环境变量,在这里设置 BASIC_AUTH_USERNAME=你的用户名 BASIC_AUTH_PASSWORD=你的强密码

3.3 首次发布全流程解析

配置完成后,你可以执行一次完整的发布流程来验证一切是否正常。

1. 运行健康检查在正式发布前,先检查环境和配置是否有问题。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js doctor

这个命令会检查 Node 版本、rsyncwrangler是否存在,以及关键的路径和配置项是否有效。根据输出修复任何错误。

2. 初始化 Quartz 工作区技能需要一个 Quartz 项目目录来构建网站。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js setup-project

这个命令会检查publish.workspaceDir指定的目录是否存在。如果不存在,它会尝试初始化一个新的 Quartz 项目。如果目录已存在但可能包含其他内容,为了安全,它默认不会执行可能覆盖文件的操作。如果你确认该目录可以初始化,需要显式设置环境变量:

ALLOW_DESTRUCTIVE=1 node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js setup-project

3. 同步笔记内容将 Obsidian Vault 中指定文件夹的内容,同步到 Quartz 项目的content目录下。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js sync

这是内容流转的关键一步。根据你的publish.syncMode配置(mirrorappend),技能会使用rsync进行文件复制。建议首次运行时,在config.json中明确设置"syncMode": "append"以避免误删。

4. 构建静态网站在 Quartz 工作区中执行构建命令,将 Markdown 转换为 HTML、CSS、JS 等静态资源。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js build

此步骤内部会运行npx quartz build。构建完成后,静态文件会输出到 Quartz 工作区的public文件夹中。同时,技能会执行一些后处理定制,如替换网站标题、注入“复制链接”按钮等。

5. 部署到 Cloudflare Pages将构建好的public目录部署到云端。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js deploy

此步骤调用wrangler pages deploy命令,并使用你在.env中配置的凭证进行身份验证。部署成功后,Wrangler 会给你一个*.pages.dev的临时预览域名。

6. 一键执行完整流程当然,最方便的是使用run命令,它按顺序执行上述setup-project->doctor->sync->build->deploy所有步骤。

node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js run

3.4 绑定自定义域名

使用*.pages.dev域名只是开始,绑定自己的域名才是最终目标。

  1. 在 Cloudflare 仪表板中,进入Workers & Pages
  2. 找到你的 Pages 项目(项目名由cloudflare.projectName配置)并点击进入。
  3. 在项目详情页,切换到自定义域标签页。
  4. 点击添加自定义域,输入你的完整域名(如notes.yourdomain.com)。
  5. Cloudflare 会自动尝试配置 DNS 记录。你需要确保该域名的 DNS 是在 Cloudflare 管理的,这样它才能自动添加CNAME记录指向你的 Pages 项目。如果域名不在 Cloudflare,你需要手动在你域名的 DNS 提供商处添加一条CNAME记录,指向你的*.pages.dev域名。
  6. 等待 DNS 传播(通常几分钟到几十分钟),然后就可以通过你的自定义域名访问网站了。

4. 配置详解与高级定制

4.1 配置文件深度解析

config.json是这个技能的大脑。理解每个字段,能让你灵活地控制发布行为。以下是一个带详细注释的配置示例:

{ "source": { // 【必填】你的 Obsidian 仓库的绝对路径 "vaultPath": "/Users/david/Documents/MyObsidianVault", // 【必填】需要发布的文件夹列表。只会同步这些文件夹下的内容。 "includeFolders": ["Clippings", "PublicBlog"], // 【可选】需要排除的文件夹列表。即使在 includeFolders 里,也会被忽略。 // 强烈建议排除 `.obsidian`(配置文件夹)和私人笔记文件夹。 "excludeFolders": [".obsidian", "Private", "Journal", "Templates"], // 【可选】是否要求笔记必须包含特定的 Frontmatter 才发布? // 例如,设置为 true 并配合 Quartz 插件,可只发布有 `publish: true` 标签的笔记。 "requireFrontmatterPublish": false }, "publish": { // 【必填】Quartz 项目的工作目录。构建和部署都在这里进行。 "workspaceDir": "/Users/david/projects/my-quartz-site", // 【可选】Quartz 项目内用于存放同步内容的目录,默认为 "content" "contentDir": "content", // 【重要】同步模式。"mirror" 会删除目标目录中源目录没有的文件。 // "append" 只增不减,更安全。首次使用建议 "append"。 "syncMode": "append" }, "site": { // 静态网站生成器,目前固定为 "quartz" "generator": "quartz", // 网站标题,会显示在浏览器标签页和页面头部 "title": "David's Digital Garden", // 【重要】网站的最终访问地址,必须与 Cloudflare 中配置的自定义域名一致 "baseUrl": "https://notes.yourdomain.com", // Quartz 主题,可选 "default", "dark" 等,取决于你的 Quartz 配置 "theme": "default", // 是否在页面底部显示“反向链接”板块 "showBacklinks": true }, "cloudflare": { // 【必填】Cloudflare Pages 上的项目名称 "projectName": "my-obsidian-pages", // 【必填】部署到的分支,通常为 "main" 或 "production" "branch": "main", // 【必填】生产环境域名,与 site.baseUrl 对应 "productionDomain": "notes.yourdomain.com", // 【重要】指向 .env 文件中存储 API Token 的变量名 "apiTokenEnv": "CLOUDFLARE_API_TOKEN", // 【重要】指向 .env 文件中存储 Account ID 的变量名 "accountIdEnv": "CLOUDFLARE_ACCOUNT_ID", "basicAuth": { // 是否对整个网站启用 HTTP Basic 认证 "enabled": false, // 如果启用,用户名。建议从环境变量读取:`process.env.BASIC_AUTH_USERNAME` "username": "", // 如果启用,密码。建议从环境变量读取:`process.env.BASIC_AUTH_PASSWORD` "password": "" } } }

4.2 自定义 Quartz 配置与主题

技能初始化的工作区是一个标准的 Quartz 项目。这意味着你可以完全控制 Quartz 的配置和外观。

1. 修改 Quartz 配置进入publish.workspaceDir指定的目录,你会看到quartz.config.tsquartz.config.js等文件。你可以在这里:

  • 调整解析器、插件和过滤器,以改变内容处理逻辑。
  • 修改导航栏、页脚等布局组件。
  • 例如,你可以安装quartz-plugin-tag-pages来生成标签云页面。

2. 自定义样式主题Quartz 使用typography.css等文件定义样式。你可以直接修改这些 CSS 文件,或者更优雅地,通过覆盖 CSS 变量来定制主题。查看 Quartz 文档了解如何创建自定义主题。

3. 技能后处理的影响需要注意的是,本技能在构建后会对生成的 HTML 进行一些后处理(如替换标题、添加复制按钮)。这些修改是直接作用于输出文件的。如果你发现自己的主题修改被覆盖了,可能需要检查技能的后处理脚本(通常在skills/obsidian-cloudflare-pages/lib/post-build.js或类似位置),并调整其逻辑或顺序。

4.3 实现增量发布与自动化

手动运行run命令固然可以,但结合 Git 和 CI/CD 可以实现真正的自动化。

1. 将 Quartz 工作区纳入 Git 管理

cd /path/to/your/workspaceDir git init git add . git commit -m "Initial quartz project"

将代码仓库(例如 GitHub)设置为远程仓库。

2. 创建自动化脚本你可以创建一个简单的 Shell 脚本,例如deploy.sh

#!/bin/bash cd ~/.openclaw/workspace # 安全起见,先同步和构建,但不部署 node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js sync node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js build # 检查是否有内容变更 cd /path/to/your/workspaceDir if git diff --quiet --exit-code public/; then echo "No changes to deploy." else echo "Changes detected, deploying..." # 提交变更 git add public/ git commit -m "Auto-update site content" git push origin main # 执行部署 cd ~/.openclaw/workspace node skills/obsidian-cloudflare-pages/bin/publishmd-cf.js deploy fi

然后通过系统的定时任务(如cron)来定期执行这个脚本,实现定时发布。

3. 使用 GitHub Actions 实现 Git 触发更现代的做法是,当你向 Obsidian Vault 的特定文件夹(如Clippings)推送更改时,触发一个 GitHub Action。这个 Action 可以在云端执行技能的run命令。这需要将你的技能配置、环境变量(作为 GitHub Secrets)和 Obsidian Vault(或至少发布文件夹)都放在 Git 仓库中。设置相对复杂,但实现了完全无缝的“写笔记即发布”。

5. 故障排查与经验心得

5.1 常见问题与解决方案

在实际使用中,你可能会遇到以下问题。这里记录了我的排查思路和解决方法。

问题现象可能原因排查步骤与解决方案
运行doctor或任何命令时报错Command failed1. 依赖未安装 (Node, rsync, wrangler)。
2. 路径配置错误。
3. 权限不足。
1. 根据错误信息,确认node,npm,rsync,wrangler是否在系统 PATH 中且版本兼容。
2. 检查config.json中的source.vaultPathpublish.workspaceDir是否为绝对路径且存在。
3. 确保对相关目录有读写权限。
sync命令成功但content目录为空1.includeFolders配置的文件夹在 Vault 中不存在或为空。
2.excludeFolders意外排除了目标文件夹。
3.rsync命令参数或路径有误。
1. 仔细核对includeFolders的名称,确保大小写一致。
2. 临时将excludeFolders设为空数组[]测试。
3. 使用--dry-run参数运行sync命令,查看rsync实际会执行的操作:node .../publishmd-cf.js sync --dry-run
build命令失败,Quartz 报错1. Quartz 项目未正确初始化或损坏。
2. 同步过来的 Markdown 文件语法有误(如 Frontmatter 格式错误)。
3. Node 版本不兼容。
1. 尝试删除workspaceDir目录,然后重新运行ALLOW_DESTRUCTIVE=1 node .../publishmd-cf.js setup-project
2. 查看 Quartz 构建的错误日志,定位到具体文件。常见问题是笔记中有不合规的 YAML Frontmatter。
3. 确保使用 Quartz 4 推荐的 Node.js 版本(如 LTS 版本)。
deploy失败,提示认证错误1..env文件未创建或路径不对。
2..env文件中的CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID无效或过期。
3. Token 权限不足。
1. 确认.env文件位于skills/obsidian-cloudflare-pages/目录下,且内容格式正确(无多余空格,每行KEY=VALUE)。
2. 在 Cloudflare 面板重新生成 API Token 并更新.env文件。确保 Account ID 正确。
3. 确认 Token 模板包含“编辑 Cloudflare Pages”权限。
网站能访问,但样式丢失或页面错乱1.site.baseUrl配置错误。
2. Cloudflare Pages 项目构建输出目录设置错误。
3. 自定义域名 DNS 未正确解析或 HTTPS 证书未就绪。
1. 检查config.json中的site.baseUrl是否与 Cloudflare 中配置的生产域名完全一致(包括https://)。
2. 在 Cloudflare Pages 项目设置中,确认“构建输出目录”是否为public
3. 访问*.pages.dev临时域名看是否正常。如果正常,问题在域名解析,等待 DNS 生效或检查 CNAME 记录。
Basic Auth 不生效1.cloudflare.basicAuth.enabledfalse
2. 用户名密码错误。
3. Cloudflare Pages 的 Functions 功能未启用或中间件生成失败。
1. 确认配置已启用,且用户名密码已正确设置(或在.env中配置)。
2. 部署后,检查项目functions目录下是否生成了_middleware.js文件。
3. 在 Cloudflare Pages 控制台查看部署日志,确认 Functions 已成功部署。

5.2 实操中的经验与避坑指南

1. 关于syncMode: mirror的谨慎使用mirror模式非常高效,能确保 Quartz 的content目录是你 Vault 指定文件夹的精确副本。但这把“双刃剑”意味着,如果你在content目录里手动添加或修改了文件(而非通过 Obsidian),下次同步时这些文件会被无情删除。我的建议是:除非你完全理解并需要这种严格同步,否则始终使用append模式。或者,在运行sync前,先使用--dry-run参数预览将要删除的文件列表。

2. 处理 Obsidian 特有的语法Obsidian 允许一些非标准的 Markdown 语法,如![[内部嵌入]]^^高亮^^等。Quartz 可能无法直接解析它们。你需要:

  • 要么在 Obsidian 中写作时,尽量使用标准 CommonMark 或 GitHub Flavored Markdown 语法。
  • 要么探索 Quartz 社区插件,或者自己编写转换器,在sync之后、build之前,将 Obsidian 语法转换为 Quartz 能理解的格式。这可以作为技能的一个扩展点。

3. 管理大量笔记时的构建性能如果你的 Vault 里有成千上万篇笔记,即使只发布其中一部分,Quartz 的构建时间也可能变长。可以考虑:

  • 增量构建:Quartz 本身支持基于 Git 的增量构建。你可以将 Quartz 工作区初始化为 Git 仓库,并确保sync过程能生成有意义的 Git 提交,这样 Quartz 在构建时可能只处理更改的文件。但这需要更精细的流程控制。
  • 拆分发布:不要试图一次性发布整个知识库。用includeFolders将内容分门别类,建立多个不同的发布项目(如“技术笔记站”、“读书摘录站”),每个站点只包含相关文件夹。

4. 备份你的配置和.env文件config.json.env是你整个发布流程的命脉。务必将其备份到安全的地方(如使用密码管理器保存.env内容,将config.json存入私有 Git 仓库)。一旦丢失,重新配置会非常麻烦。

5. 善用SAFE_MODE--dry-run这是本技能设计中最值得称道的安全特性。在尝试任何新操作、修改关键配置后,或者只是定期执行脚本前,先加上SAFE_MODE=1--dry-run跑一遍。它能让你清晰地看到工具将要做什么,而不会产生任何实际影响。养成这个习惯,能避免绝大多数灾难性误操作。

这个obsidian-cloudflare-pages-skill将 Obsidian 的内容价值从本地释放到了网络,其设计在自动化与安全性之间取得了很好的平衡。从我自己的使用体验来看,最大的收获不是技术本身,而是它促成了一种“发布即整理”的笔记习惯——知道笔记可能会被公开,反而促使我写得更清晰、结构更完整。如果你也受困于笔记的“沉睡”状态,不妨用这个工具,迈出构建个人数字花园的第一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 17:01:33

AI编程会话回放工具replay.md:从日志到可读叙事的全栈实现

1. 项目概述:从AI对话日志到可读性叙事 如果你和我一样,日常重度依赖像Claude Code、Cursor这类AI编程助手,那你一定遇到过这个痛点:和AI来回讨论了十几轮,最终产出了一个不错的解决方案,但几天后想回顾当…

作者头像 李华
网站建设 2026/5/7 16:57:35

基于EXIF与地理编码的旅行足迹地图构建实战

1. 项目概述:一个旅行足迹的智能地图管家最近在折腾一个挺有意思的小项目,叫rmartinshort/travel_mapper。简单来说,它就是一个帮你把旅行足迹,从一堆零散的照片、GPS轨迹或者手动记录的地点,自动整理并可视化到一张精…

作者头像 李华
网站建设 2026/5/7 16:51:47

taotoken 的审计日志功能如何满足企业级安全与合规需求

taotoken 的审计日志功能如何满足企业级安全与合规需求 对于依赖大模型 API 进行开发与运营的团队而言,清晰、可追溯的访问记录不仅是内部资源管理的基石,也是应对潜在安全审计与合规要求的关键。taotoken 平台提供的审计日志功能,正是围绕这…

作者头像 李华