这篇文章记录 InkPage 的完整发布流程——它本身也是用这套流程发布的。
整条链路
Obsidian(在 01_草稿/ 里写作)
↓ 定稿后拖进
03_已发布/
↓ 双击「一键发布.bat」
同步 → 本地构建验证 → Git 提交推送 → 服务器更新
↓
网站上线,文章地址 /articles/<网址>/
全程不需要登录任何后台,不打开任何在线编辑器。写作的地方就是发布的地方。
目录即状态
发布 Vault 里用目录表达文章的状态:
01_草稿/:写作中的文章,永远不会进入网站;02_待发布/:检查完毕、等待发布的过渡区,同样不进入网站;03_已发布/:唯一会被发布的目录。文件拖进来,就代表「允许公开」。
想修改已上线的文章,在 Vault 里改完再发布一次;想下线,把文件从 03_已发布/ 拖走再发布一次。Git 记录每一次变化,随时可以回滚。
用中文填写 Frontmatter
每篇文章开头是一段中文元数据:
标题: "文章的标题"
网址: "article-slug"
摘要: "一句话简介,显示在列表、搜索结果和 RSS 里"
发布日期: 2026-08-28
分类: "独立开发"
标签:
- 工作流
精选: false
必填的是标题、网址、摘要、发布日期、分类。网址 只用小写字母、数字和连字符,它决定文章的访问地址;精选: true 会把文章放到首页精选位;草稿: true 则临时隐藏一篇已提交的文章。
一个有意思的细节:同步时脚本会把中文字段自动翻译成 title、slug、description 这些标准英文键名再写入仓库。所以在 Obsidian 里看到的是中文,Git 仓库里保存的仍然是任何静态站工具都认识的标准 Markdown——将来即使不用 InkPage,这些文章也能直接迁去 Hugo、Quartz 或 Ghost。
一键发布按钮做了什么
双击网站仓库里的 一键发布.bat,背后依次执行六步:
- 同步:把
03_已发布/镜像同步到网站的文章目录; - 检查变更:没有变化就直接退出,不做无意义的提交;
- 本地构建验证:Frontmatter 缺字段、格式错误,在这里被拦截——坏数据永远不会被推送上线;
- 提交推送:自动生成提交信息(如
post: 文章标题)并推送到 GitHub; - 服务器更新:服务器拉取最新代码并重新构建静态页面;
- 线上验证:访问首页和新文章地址,确认真实可访问,最后打印出文章链接。
整个过程大约半分钟。
图片怎么办
图片是唯一需要手动处理的环节:把用到的图片复制到网站仓库的 public/images/ 目录,正文里用标准写法引用:

自动同步图片、转换 Obsidian 双链,是第二阶段才做的事。
为什么做成这样
这套流程背后只有几条原则:Markdown 是核心资产,网站只是展示层;内容在本地写、在 Git 里存版本;服务器只做静态文件分发,没有数据库、没有登录、页面里几乎没有 JavaScript。
写作的归 Obsidian,内容的归 Markdown,版本的归 Git,展示的归 InkPage。每一步都可以被替换,但文章本身永远属于自己。