部署与更新:同步链路与自动化

前置阅读:Quartz/Quartz 使用教程 排错参考:Quartz/常见问题

本篇讲两件事:① 笔记是怎么从你电脑一路同步到线上的(链路);② 怎么让这个过程全自动(自动化)。

一、认清现实:你只在一个地方写笔记

本方案刻意做成单一真相源

位置角色
E:\文档\Obsidian Vault日常写笔记的唯一地方(= GitHub 的 Obisidian-Note,私有)
CIJUNBUGUILU/quartz (v5)Quartz 工程,不存笔记,只在你改主题/配置时用

永远只在 E: 写,GitHub 和 Cloudflare 负责把最新内容搬上线。quartz 仓库的 content/ 是空的,构建时现拉,所以你不必(也不能)手动把笔记塞进去。

二、同步链路总览

E: 写笔记
  → Obsidian Git 自动 push 到 Obisidian-Note (main)
    → GitHub Action 收到 push,curl 触发 Cloudflare Deploy Hook
      → Cloudflare 重新构建:Build command 用 GH_PAT 把 Obisidian-Note 最新内容克隆到 content/
        → npx quartz build 生成 public/
          → notes.cijun.win 更新

用图更直观(Mermaid,Obsidian 原生支持):

flowchart TD
    A[本地 E: 写笔记] --> B[Obsidian Git 自动 push<br/>→ Obisidian-Note main]
    B --> C[GitHub Action:<br/>notes-deploy.yml curl Hook]
    C --> D[Cloudflare Deploy Hook<br/>触发构建 v5]
    D --> E[Build command:<br/>用 GH_PAT 克隆笔记到 content/]
    E --> F[npx quartz build → public/]
    F --> G[notes.cijun.win 上线]

关键点:触发部署的是 Deploy Hook,不是「推送 quartz 仓库」。因为笔记根本不在 quartz 仓库里,推 quartz 仓库也没用。这就引出下面的自动化四块。

三、更新自动化的实现(重点)

目标:在 E: 写完笔记 → 什么都不用管 → 几分钟后 notes.cijun.win 自动更新。

0) 两个密钥先分清(最容易混)

链路里有两个加密凭据,名字都带 token / hook,但作用相反,务必分清:

凭据存在哪角色用在哪一步
GH_PATCloudflare Pages 环境变量(Encrypt)拉笔记的钥匙:让 Cloudflare 读你的私有笔记Build command 第 2 步 git clone
CF_DEPLOY_HOOKGitHub 仓库 Obisidian-Note 的 Actions secret(Encrypt)叫 Cloudflare 重建的扳机:一个 URL,被 curl 就触发部署GitHub Action 里 curl -X POST "${{ secrets.CF_DEPLOY_HOOK }}"

一句话记忆:GH_PAT 让 Cloudflare 进得来你的笔记;CF_DEPLOY_HOOK 让 GitHub 叫得动 Cloudflare。 两者都不能少,且放错地方(比如把 Hook 填进 Cloudflare、把 token 填进 GitHub secret)整条链路就断。

「谁扣扳机」:Deploy Hook 自己不会响,是 Obisidian-Note 仓库里的 notes-deploy.yml 在每次 push 后主动 curl 它。所以必须notes-deploy.yml 推到 GitHub,否则没人去扣扳机。

1) Cloudflare Pages 的 Build command(拉笔记的地方)

在 Cloudflare Pages 项目(quartz-459)的构建设置里,Build command 必须是:

rm -rf content && git clone --depth 1 https://x-access-token:${GH_PAT}@github.com/CIJUNBUGUILU/Obisidian-Note.git content && npx quartz build

Build command 拆成三步理解:

  1. rm -rf content —— 清空上次的笔记(防止旧内容残留)。
  2. git clone --depth 1 https://x-access-token:${GH_PAT}@github.com/CIJUNBUGUILU/Obisidian-Note.git content —— 用 GH_PAT私有笔记仓库拉到 content/${GH_PAT} 是占位符,运行时由 Cloudflare 环境变量替换,本地不用写真 token。
  3. npx quartz build —— 把 content/ 编译成静态站,输出到 public/

配套设置:输出目录public生产分支v5部署命令栏留空(别填 npx wrangler deploy)。

为什么用 token 克隆而不是子模块?因为 Cloudflare 在 Build command 之前会自动跑 git submodule update,而私有子模块那时还没有凭据,会直接构建失败。详见 Quartz/常见问题 > 私有仓库在 Cloudflare 上拉不下来

2) GH_PAT 环境变量(让 Cloudflare 能读私有笔记)

GH_PAT 必须在 Cloudflare Pages 项目里配成环境变量

  1. 生成一个 GitHub token(Settings → Developer settings → Personal access tokens):
    • classic token 勾 repo;或 fine-grained token,仅授权 Obisidian-Note 仓库的 Contents: Read-only
  2. 到 Cloudflare Pages 项目 → Settings → Environment variables
    • 变量名 GH_PAT,值贴 token
    • 勾选 Encrypt
    • 作用域选 ProductionPreview
  3. 保存后重试一次部署(Retry deployment),让新变量生效。

3) Deploy Hook + GitHub Action(触发重新构建)

笔记推到 Obisidian-Note 后,需要有人去「戳一下」Cloudflare 让它重新构建。我们用 Deploy Hook:

A. 在 Cloudflare 建 Deploy Hook

  • Pages 项目 → Settings → Deploy Hooks → Create Deploy Hook
  • 名称随意(如 on-notes-push),分支填 v5(quartz 工程的部署分支)
  • 保存后复制生成的 URL

B. 把 Hook URL 存进笔记仓库的密钥

  • 打开 https://github.com/CIJUNBUGUILU/Obisidian-Note/settings/secrets/actions
  • New repository secret:Name CF_DEPLOY_HOOK,Secret 贴刚才的 Hook URL

C. 工作流文件 Obisidian-Note/.github/workflows/notes-deploy.yml

name: sync-notes-to-quartz
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger Cloudflare Pages deploy
        run: curl -X POST "${{ secrets.CF_DEPLOY_HOOK }}"

每次往 Obisidian-Notemain push,这条 Action 就 curl 一下 Deploy Hook,Cloudflare 随即重新构建并拉取最新笔记。

4) Obsidian Git 插件(负责「自动 push E: 笔记」)

  1. Obsidian → 设置 → 社区插件 → 浏览 → 搜 Obsidian Git → 安装并启用
  2. 设置 → Obsidian Git:
    • 开启 Automatically push
    • Auto push interval10(分钟)
    • 可选开启 Automatically pull(多设备防冲突)
  3. 首次若 E: 库没设 git 身份,在 E: 目录跑一次:
    git config user.name "你的名字"
    git config user.email "[email protected]"

四、配置好之后的日常

  • 你:在 E: 写笔记,保存。
  • Obsidian Git:每 10 分钟自动 commit + push 到 Obisidian-Note。
  • GitHub Action:收到 push,curl Deploy Hook。
  • Cloudflare:重新构建,用 GH_PAT 拉最新笔记 → 部署。
  • 你:打开 notes.cijun.win 看最新版。

全程零命令行。

五、不想公开怎么办

笔记含敏感内容时,在 Pages 项目里开启 Cloudflare Access(「Protect with Cloudflare Access」开关),设为「所有流量 + 只允许你的邮箱登录」,别人就看不到内容了。