建站指南
我使用「Obsidian + Digital Garden + Github + Cloudflare」方案建设本站。
一、基础搭建
创建 Github 仓库和令牌
- 创建仓库:打开这个 仓库,点击
Use this template
,新建一个 Github 仓库 - 创建令牌:打开这个 页面,选择有效期和刚刚创建的仓库,权限列表中选择
Contents
和Pull requests
(注意保存令牌,只显示一次)
使用 Digital Garden 插件
- 安装插件:在 Obsidian 中安装 Digital Garden 插件并启用
- 配置插件:
- GitHub repo name:填入刚创建的 Github 仓库名称
- GitHub Username:填入你的 Github 用户名
- GitHub token:填入刚创建的 Github 令牌
- 等待出现“✅”标志
- 其余配置都是可选项,可后续参考 官方文档 配置
部署 Cloudflare Pages 站点
- 打开 Cloudflare,在“计算 → Workers 和 Pages → Pages”下,选择“导入现有 Git 存储库”
- 选择刚刚创建的 Github 仓库后开始配置:
- 构建命令:npm run build
- 构建输出目录:dist
- 其余未提到的默认即可
- 点击保存并部署,稍等一会,就可以在这个 Pages 项目下获取到链接并访问。
注意
Cloudflare 免费计划每月最多构建部署 500 次,而 Digital Garden 是利用的 Github API,所有文件修改都是一个个提交的,当你有几十篇笔记时,可能在调试阶段很快就会达到上限。此问题可通过定时构建部署解决,参见:配置 Cloudflare Works 定时器(可选)
配置 Cloudflare Works 定时器(可选)
-
取消自动部署:打开刚刚在 Cloudflare 中创建的 Pages 项目,在设置中找到“分支控制”:
- 取消“启用自动生产分支部署”勾选
- 预览分支选项改为“无”
- 保存提交
-
创建部署挂钩:同样在 Pages 项目的设置中找到“部署挂钩”,创建一个挂钩后,会获取到一个 Webhook
-
创建 Works 项目:打开 Cloudflare,在“计算 → Workers 和 Pages → Worker”下,选择“从 Hello World! 开始”,创建一个 Works 项目
-
完善 Works 项目:创建 Works 项目成功后,点击“编辑代码”,在打开的编辑器中粘贴以下代码(记得替换 KEY 和 Webhook):
/** * Cloudflare Worker:定时 + 手动双触发部署钩子 * 功能: * 1. 通过 Cron Trigger 定时调用 Cloudflare Pages 的 Deploy Hook * 2. 通过浏览器或 curl 手动触发(需携带密钥参数 ?key=xxx) */ // 1) 手动触发所需的密钥,自行更换成只有自己知道的字符串 const SECRET_KEY = "..."; // 2) 公共逻辑:真正去调用部署钩子 async function triggerDeploy() { // ⚠️ 注意:把下面 URL 换成你自己的 Webhook const url = "https://api.cloudflare.com/..."; try { const res = await fetch(url, { method: "POST" }); console.log("✅ Deploy Hook 已触发,状态码:", res.status); return res.status; } catch (err) { console.error("❌ Deploy Hook 触发失败:", err); throw err; } } export default { // ------------------------------------------------------------ // 定时触发:由 Cron Trigger 调用 // ------------------------------------------------------------ async scheduled(event, env, ctx) { // 让 Worker 在后台异步执行,防止超时 ctx.waitUntil(triggerDeploy()); }, // ------------------------------------------------------------ // 手动触发:通过 HTTP 访问 Worker 地址 // 例如:GET https://<worker-domain>/?key=SECRET_KEY // ------------------------------------------------------------ async fetch(request, env, ctx) { const { searchParams } = new URL(request.url); // 1. 校验密钥 if (searchParams.get("key") !== SECRET_KEY) { return new Response("❌ 未授权:密钥不正确或缺失\n", { status: 403 }); } // 2. 触发部署钩子 try { const status = await triggerDeploy(); return new Response( `🚀 手动触发成功!Deploy Hook 返回状态:${status}\n`, { status: 200 } ); } catch (err) { return new Response( `⚠️ 手动触发失败:${err.message || err}\n`, { status: 500 } ); } }, };
-
部署上述代码后,在 Works 项目的设置页面找到“触发事件”,添加一个“Cron 触发器”
-
添加一个 Cron 表达式:
0 22 * * *
,即为北京时间每天早上 6 点自动部署 -
Cron 表达式规则参见 Cloudflare 文档,注意 UTC 时间和北京时间的转换
-
你也可以通过 Works 项目的链接 + 自定义的 KEY 来实现手动触发(一般调试的时候用的上)
在 Obsidian 中发布和更新内容
- 在想要发布的笔记 YAML 区域中添加
dg-publish: true
- 在想要作为首页的笔记 YAML 区域中添加
dg-home: true
(只能有一篇) - 打开 Digital Garden 插件的发布中心:使用
Ctrl+P
打开Digital Garden:Open Publication Center
,勾选笔记并发布 - 等待 Github 和 Cloudflare 完成自动部署(根据笔记数量而定,一般 1~2 分钟内)
- 即可在刚获取链接地址访问到最新的内容
参考文档
二、高级进阶
绑定域名方法
- 打开 Cloudflare,在前面创建的 Pages 项目里找到“自定义域”,输入域名后按照流程指引操作即可
- 打开自己域名解析商网站(我使用 腾讯云):
- 若前面设置的是顶级域名,需要迁移 DNS 到 Cloudflare
- 若前面设置的是二级域名,只需要设置 CNAME 即可
自定义组件方法
- 仅简要描述,具体请查阅 官方文档 对此的说明
- 可在自己创建的 Github 项目仓库中,在
src/site/_includes/components/
路径下创建user
目录,使用user/<命名空间>/<插槽>/<代码文件>.njk
添加njk
格式的文件 - 其中
<命名空间>
和<插槽>
的格式如下- 页面
- 命名空间
common
同时添加到首页和笔记页面上index
仅添加到首页上notes
仅添加到笔记页上
- 插槽
head
添加到 HTML 的<head>
标签内header
添加到 HTML 的<heeader>
标签内,如果启用了tags
和inline title
那么在他们之后beforeContent
添加页面内容之前afterContent
添加到页面内容之后footer
添加到页面页脚之中
- 命名空间
- 文件树
- 命名空间
filetree
- 插槽
beforeTitle
标题之前afterTitle
标题之后
- 命名空间
- 侧边栏
- 命名空间
Sidebar
- 插槽
top
顶部bottom
底部
- 命名空间
- 页面
- 示例:一个
<组件名称>.njk
组件的完整地址为(假设放在全部页面的页面页脚之中):src/site/_includes/components/user/common/footer/<组件名称>.njk
自定义样式方法
- 仅简要描述,具体请查阅 官方文档 对此的说明
- 可在自己创建的 Github 项目仓库中,在
src/site/style/
路径下创建user
目录,使用user/<代码文件>.css/scss
添加css/scss
格式的文件 - 示例:一个
<样式名称>.css
样式的完整地址为:src/site/style/user/<样式名称>.css
添加统计代码
TODO
添加评论代码
TODO
三、自定义代码
TODO