Obsidian 发布博客的 N+1 种方法

之前看到有为文章讨论 Obsidian 管理博文。想想方法还挺多的,写下备忘。

我是用的是静态博客生成器 Hugo ,文章实际上就是 markdown 文件。其他 CMS 之类的,大概写一些代码也能使用。

博客 markdown 在 Obsidian 的前提下,Obsidian 管理博文需求,需要解决的问题就是把 markdown 文件交给构建程序,构建之后发布。方法其实挺多的,不过方法也是大同小异。

我在 Obsidian 使用过 Remotely Save 和 RunJS 插件。

  • Remotely Save 能将 markdown 文件同步到 S3 对象存储,WebDAV。
  • RunJS 运行 JS ,能使用 Obsidian 提供的 API,读写文件,发送 HTTP 请求等等。

下面介绍几个思路和方法。

使用 Obsidian Git 插件同步到 Github ,然后触发 Github Action 构建。

使用 Obsidian Remotely Save 插件同步到私有对象存储,Github Action 运行 Rclone 之类的工具下载,然后部署。

或者同步到对象存储,然后对象存储开启静态网站功能,也就是所有文件可以被公开访问了,Github Action wget 一下所有 markdown 文件就行了。Obsidian markdown 图片链接处理一下,换成 Obsidian 公开库的图片链接就行了。

轻量处理脚本个人使用的是 Lua,比 Bash + jq 使用起来顺手。

这个活 Nushell 看起来也能胜任。 https://www.nushell.sh/zh-CN/

文章太多的话,RunJS 生成个文档列表,只下载最近的文件就行了。

这里 OSS 和 FC 都是阿里的,阿里云函数计算可以挂载自己家的对象存储 OSS 为硬盘。所以可以这么操作:

  1. 函数计算挂载 Obsidian 用的对象存储桶。
  2. 把其余需要的打包,也就是 Hugo + Hugo 博客文件 + Hugo 博客主题之类的。
  3. 写一个云函数,处理带验证身份的 HTTP 请求。通过后,复制挂载的 OSS 中的,Obsidian 上传的 markdown 文件。
  4. Hugo 构建网站
  5. 生成的静态网站上传到另一个开启静态网站功能的存储桶

触发方法,写个 RunJS 脚本 GET 云函数,触发一下就行了。

云函数 + OSS IO 实际上是有一点点慢的,性能够不够用需要测试,整个流程能不能在 HTTP 超时之前完成也需要测试。

原理很简单,Obsidian Remotely Save 插件同步到自己的 WebDAV 服务。写个 Bash 脚本监测文件变化,有变化就触发构建。

构建完成后,如果有公网 IP ,直接用 Nginx 部署静态网站了。没有公网 IP ,用命令行,比如 OSSutil 上传到对象存储就行了。

写 JS ,把最近修改的 markdown 文件都写进一个 JSON 里,然后 POST 到云函数或者自己部署的程序。服务器取出 markdown 文本,把所有发送过的文章去重,然后给构建系统使用,构建完上传部署。

顺带这是试过的 RunJS 代码

文档 https://docs.obsidian.md/Reference/TypeScript+API/request

js

// https://docs.obsidian.md/Reference/TypeScript+API/request

request({
    url: "http://localhost:8080/",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Authorization": "Bearer "
    },
    body: JSON.stringify([{
        "key": "some",
        "key": "some text"
    }])
}).then((res) => {
    new Notice(JSON.stringify(res));
}).catch((err) => {
    new Notice(JSON.stringify(err));
})

https://docs.obsidian.md/Reference/TypeScript+API/FileStats

js

let files = this.app.vault.getMarkdownFiles();
files.sort((a,b) => {
     //new Notice(a.stat.ctime - b.stat.ctime);
    return b.stat.mtime - a.stat.mtime;
});

js

const xxxx = this.app.vault.getAbstractFileByPath("xxxx.json");
this.app.vault.modify(xxxx, JSON.stringify(obj)).then(res => {
    new Notice("Finish!");
})

上面这些方法,也是实现了手机管理博客。这些方法在 Obsidian 移动端也都能做到,Remotely Save 和 RunJS 插件支持移动端。

Obsidian 比较自由,方法也多。发布为网站可谓各显神通,像是 Obsidian 搭建数字花园就有好几种方法。

暂时想到这五种方法,抛砖引玉,就这样。

Q.E.D.