一、写作的痛点:写得很爽,发得很烦
作为一个重度 Obsidian 用户,我几乎所有的思考和写作都在这个本地知识库里完成。Obsidian 的双向链接、图谱视图、丰富的插件生态,让写作体验非常流畅。
但问题来了:写好的内容怎么发布出去?
常见的做法有这些:
| 方式 | 优点 | 缺点 | |------|------|------| | 手动复制 | 简单直接 | 每次都要改格式、传图片,太麻烦 | | Obsidian Publish | 原生支持 | 付费($8/月),自定义域名另收费 | | 第三方同步工具 | 一键同步 | 需要学习成本,格式兼容性不一定好 | | 自己搭建 | 完全可控 | 技术门槛高,维护成本大 |
我希望的方案是:在 Obsidian 里写,自动同步到线上,最好还不要钱。
二、我的方案选择:Notion 作为中转站
核心思路
既然 Obsidian 是纯本地的,那需要找一个”云端桥梁”来连接本地和线上。我的选择是:Notion 数据库作为内容中转站。
为什么选 Notion?
- 免费且稳定:个人免费版完全够用
- API 友好:有完善的 REST API,可以自动化操作
- 表格化管理:数据库视图方便管理文章状态
- 生态成熟:很多工具都能从 Notion 读取数据
整体架构
Obsidian(本地写作)
↓
Node.js 脚本(发布到 Notion)
↓
Notion 数据库(内容管理)
↓
GitHub Action(定时同步)
↓
Astro 静态博客 + GitHub Pages(线上展示)
工作流:
- 在 Obsidian 写完文章,运行发布脚本
- 文章进入 Notion 数据库,可以管理状态(草稿/已发布)
- GitHub Action 每 6 小时自动拉取 Notion 内容到博客仓库
- 有新内容时自动部署到 GitHub Pages
三、技术栈选型详解
3.1 静态博客:Astro
市面上静态博客生成器很多,为什么我选 Astro?
| 框架 | 特点 | 适合场景 | |------|------|----------| | Hexo | 中文社区活跃,主题多 | 中文博客首选 | | Hugo | 编译速度极快 | 内容量大的站点 | | Next.js | React 生态,动态能力强 | 需要交互的博客 | | Astro | 零 JS 默认,性能优秀 | 内容为主的博客 |
我选 Astro 是因为:
- 零 JavaScript 默认:纯内容页面不加载 JS,速度极快
- Content Collections:原生的内容管理方案,支持 Markdown/MDX
- Island Architecture:需要交互的地方可以用 React/Vue 组件
- 对 Markdown 友好:Frontmatter、代码块、图片等支持很好
我用的是 AstroPaper 主题,轻量且美观。
3.2 部署平台:GitHub Pages
- 完全免费:配合 GitHub 仓库使用
- 自动部署:推送代码自动更新
- CDN 加速:GitHub 全球 CDN
- 自定义域名:支持绑定自己的域名
虽然 Vercel/Netlify 也很好用,但 GitHub Pages 更简单直接,且完全满足个人博客需求。
3.3 同步机制:GitHub Action
GitHub 原生的 CI/CD 工具,可以:
- 定时触发(比如每 6 小时)
- 监听代码推送自动执行
- 访问 Secrets 存储敏感信息(Notion Token)
- 自动提交代码变更
四、核心实现步骤
4.1 Notion 数据库设计
数据库字段如下:
| 字段名 | 类型 | 说明 | | ----------- | ------------ | ----------------- | | Title | Title | 文章标题 | | Description | Rich Text | 文章描述/摘要 | | Author | Rich Text | 作者 | | PublishDate | Date | 发布日期 | | Tags | Multi-select | 文章标签 | | Status | Select | Draft / Published | | Slug | Rich Text | URL 自定义部分 |
关键点:
- Status 字段控制文章是否显示(Draft 的文章不会同步到博客)
- 标签使用 Multi-select,方便筛选和分类
4.2 GitHub Action 同步脚本
定时同步的配置文件 .github/workflows/sync-content.yml:
name: Sync Content from Notion
on:
schedule:
- cron: "0 */6 * * *" # 每6小时运行一次
workflow_dispatch: # 支持手动触发
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout 代码
uses: actions/checkout@v4
- name: 安装 Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
- name: 安装依赖
run: npm ci
- name: 从 Notion 同步内容
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}
run: node scripts/sync-from-notion.js
- name: 提交变更
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add src/content/blog/
git diff --quiet && git diff --staged --quiet || git commit -m "同步 Notion 内容"
git push
核心逻辑:
- 定时拉取 Notion 数据库中的所有文章
- 将每篇文章转换为 Markdown 文件
- 下载文章中的图片到本地
- 提交到仓库的
src/content/blog/目录
4.3 Obsidian 发布脚本
我写了一个 Node.js 脚本,一键将 Obsidian 文章发布到 Notion:
主要功能:
- 读取 Markdown 文件的 frontmatter(标题、日期、标签、描述)
- 自动提取首段内容作为描述(如果没写)
- 将 Markdown 转换为 Notion blocks(支持标题、代码块、列表等)
- 调用 Notion API 创建数据库条目
使用方法:
# 发布文章
node publish.js "8-创作/文章/我的文章.md"
# 作为草稿发布
node publish.js "8-创作/文章/我的文章.md" --draft
Frontmatter 示例:
---
title: 我的文章标题
date: 2026-04-18
tags:
- 标签1
- 标签2
description: 文章描述(可选,会自动提取)
---
脚本会自动填充作者字段(统一为”桃翁”),不需要手动写。
五、实际使用体验
日常写作流程
-
在 Obsidian 写作
- 新建文件,填写 frontmatter - 用 Markdown 写作,插入图片 - 完成初稿
-
发布到 Notion
bash node publish.js "8-创作/文章/刚写完的文章.md"- 文章进入 Notion 数据库 - 可以在 Notion 里调整状态(Draft → Published) -
等待自动同步
- GitHub Action 每 6 小时检查一次 - 或者手动触发同步
-
上线
- 同步完成后自动部署到 GitHub Pages - 文章可以在博客上看到
效果展示
从写完到上线的完整路径:
Obsidian → 运行脚本 → Notion(状态 Published)→ GitHub Action → 博客上线
整个过程:1 分钟写脚本发布 + 最多 6 小时等待同步
如果不介意手动触发 GitHub Action,可以立即同步。
六、总结与扩展
这套方案的优势
- 写作体验好:Obsidian 的本地写作体验无可挑剔
- 管理方便:Notion 作为 CMS,可以随时调整文章状态
- 完全免费:Notion 免费版 + GitHub Pages = 零成本
- 自动化:发布一次,自动同步上线
- 版本控制:所有内容在 Git 仓库有备份
可以改进的地方
- 实时同步:目前是定时拉取,可以改为 Webhook 触发
- 图片优化:可以自动压缩图片、生成 WebP 格式
- 草稿预览:Draft 状态的文章可以生成预览链接
- 双向同步:Notion 修改后同步回 Obsidian(目前只支持单向)
适合哪些人使用
- 用 Obsidian 写作的内容创作者
- 想要低成本搭建个人博客的开发者