部署与更新:同步链路与自动化
前置阅读: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_PAT | Cloudflare Pages 环境变量(Encrypt) | 拉笔记的钥匙:让 Cloudflare 读你的私有笔记 | Build command 第 2 步 git clone |
CF_DEPLOY_HOOK | GitHub 仓库 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 拆成三步理解:
rm -rf content—— 清空上次的笔记(防止旧内容残留)。git clone --depth 1 https://x-access-token:${GH_PAT}@github.com/CIJUNBUGUILU/Obisidian-Note.git content—— 用GH_PAT把私有笔记仓库拉到content/;${GH_PAT}是占位符,运行时由 Cloudflare 环境变量替换,本地不用写真 token。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 项目里配成环境变量:
- 生成一个 GitHub token(Settings → Developer settings → Personal access tokens):
- classic token 勾
repo;或 fine-grained token,仅授权Obisidian-Note仓库的 Contents: Read-only。
- classic token 勾
- 到 Cloudflare Pages 项目 → Settings → Environment variables:
- 变量名
GH_PAT,值贴 token - 勾选 Encrypt
- 作用域选 Production 和 Preview
- 变量名
- 保存后重试一次部署(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-Note 的 main push,这条 Action 就 curl 一下 Deploy Hook,Cloudflare 随即重新构建并拉取最新笔记。
4) Obsidian Git 插件(负责「自动 push E: 笔记」)
- Obsidian → 设置 → 社区插件 → 浏览 → 搜 Obsidian Git → 安装并启用
- 设置 → Obsidian Git:
- 开启 Automatically push
- Auto push interval 设
10(分钟) - 可选开启 Automatically pull(多设备防冲突)
- 首次若 E: 库没设 git 身份,在 E: 目录跑一次:
git config user.name "你的名字" git config user.email "you@example.com"
四、配置好之后的日常
- 你:在 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」开关),设为「所有流量 + 只允许你的邮箱登录」,别人就看不到内容了。