Quartzで保管庫の一部を公開しているが、その保管庫をObsidian Syncから取り出すことができるようになった。 GitHub - atty303/obsidian-quartz: Publish my Obsidian vault using Quartz · GitHub

Obsidian Headlessのインストール

miseでインストールできる。

[tools]
"npm:obsidian-headless" = "latest"

ログインの自動化

ObsidianアカウントにMFAを設定しているとob loginでもMFAが要求されるので、単純にGitHub ActionsのSecretsに認証情報を設定できない。僕はプライマリのパスワードマネージャに1Passwordを利用しているので、Obsidian項目だけ読み取り可能なサービスアカウントを作り、サービスアカウントの認証トークンをSecretsにOP_SERVICE_ACCONUT_TOKENとして設定することにした。

[tools]
1password-cli = "latest"
 
[tasks."ob:login"]  
run = "op run -- sh -c 'ob login --email $OBSIDIAN_SYNC_EMAIL --password $OBSIDIAN_SYNC_PASSWORD --mfa $OBSIDIAN_SYNC_MFA'"
env.OBSIDIAN_SYNC_EMAIL = "op://Service/Obsidian/username"  
env.OBSIDIAN_SYNC_PASSWORD = "op://Service/Obsidian/password"  
env.OBSIDIAN_SYNC_MFA = "op://Service/Obsidian/TOTP?attribute=otp"

なお、~/.config/obsidian-headless/auth_tokenにログインで発行されたトークンが保存されれているが、これをActionsに持っていっても認証済みにならなかった。トークンの要求元の検証が入っているのかもしれないし、システムKeyringに追加の秘密情報が保存されているのかもしれない。

同期する保管庫の設定

[tasks."ob:sync-setup"]
dir = "content"
run = [
    "ob sync-setup --vault <UUID> --device-name obsidian-quartz",
    "ob sync-config --mode mirror-remote",
    "ob sync-config",
]

sync-setupで同期の初期設定を行う。カレントディレクトリが保管庫の保持ディレクトリになるので、quartzのコンテンツディレクトリにしている。保管庫は名前でも指定できるがob sync-list-remoteで確認できるUUIDを設定したほうが良いだろう。今回は読み取りだけに限定したいのでsync-config --mode mirror-remoteでローカルの変更は捨てて常にリモートを反映するようにする。

同期する

[tasks."ob:sync"]
dir = "content"
run = """
until ob sync ; do
   sleep 1
done
"""

ob syncで同期ができる。結構な頻度でAnother sync instance is already running for this vault.とエラーが出るので、成功するまでリトライするようにしている。