Remotely save × github × Quartz によるクラウド同期で快適&無料なObsidianホスティング
Obsidian といえば、公式のクラウド同期サービスとして Obsidian Sync
、
ホスティングはObsidian Publish
が有名ですが、どちらも月額で料金がかかります。
円安のご時世で毎月ドルで課金というのも中々ハードル高いですね。
そこで、無料で使えるコミュニティプラグイン、クラウド同期サービスとして Remotely save
、
ホスティングはQuartz
を使って代替しようと考えました。
※Remotely save
に関しては、当然ですが利用しているクラウド、保存容量によって料金がかかります。
前提
以下の2つができることが条件になります。
- Quartz でデプロイができる
- RemotelySave で同期ができる
上記2つの設定方法はは公式ページや別の利用者の方の説明記事があるので、当記事では説明しません。
github actions
の設定方法が記事のメインの内容となります。
流れ
- ローカルで編集
- AWS S3 にデータをバックアップ
- 毎日定時に github actions で S3 と同期して自動でコミット
-
Quartz
でホスティングしているサイトに更新がかかる
2までの流れは通常のRemotely Save
と同じで、そこからgithub actions
でQuartz
のデプロイ設定を行っているリポジトリにS3のデータを同期して自動でコミットするイメージです。
※筆者の場合はVercelでデプロイしていますが、Quartzが対応しているサイトであればどれでも可です。
方法
-
Quartz でホスティングを行う
下記の公式サイトを参考にホスティングを行います。
https://quartz.jzhao.xyz/
content
ディレクトリはまだ空のままにしておきます。 -
Remotely save でクラウド同期を行う
下記の公式リポジトリを参考に同期の設定を行います。
https://github.com/remotely-save/remotely-save
当記事ではAWS S3を使って解説します。
(後述するaws s3 sync
のようにクラウドからローカルにファイルをダウンロードして同期できるようなコマンドが存在していれば、Dropbox等でも利用可能です。) -
github actions の設定
1.でホスティングした際のgithubリポジトリに、環境変数AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
をセットします。
settings/Secrets and variables/Actions
から設定可能です。
また、settings/Actions/General
のWorkflow permissions
がRead and write permissions
になっていることを確認してください。(github actionがリポジトリのcommit&pushを行うのに必要です)
.github/workflows/sync_s3.yaml
ファイルを新たに作成し、以下のyamlを記載します。
name: Sync and Commit S3 Data
on:
# github actionsをトリガーするスケジュール。 ... (1)
schedule:
- cron: '0 0 * * *'
workflow_dispatch: # 手動トリガー
jobs:
fetch_and_commit:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
# AWS S3 との同期 ... (2)
- name: Fetch data from S3
run: aws s3 sync s3://xxx-your-own-s3-bucket-name-xxx ./content --delete
# gitの差分がないときにコミットしないようにチェック ... (3)
- name: check for changes
run: |
git add -A
git diff --staged --quiet || echo "git_changed=true" >> $GITHUB_ENV
- name: Commit changes
if: env.git_changed == 'true'
run: |
git config --global user.name 'github-actions'
git config --global user.email 'github-actions@github.com'
git add -A
git commit -m 'Sync data with S3'
git push origin v4
(1)cronはUTCで設定されているので、同期したいお好みの時刻を個人で適宜設定するようにしてください。
(2)上記に run: aws s3 sync s3://xxx-your-own-s3-bucket-name-xxx ./content --delete
というコマンドがあると思いますが、ここには自分で設定したs3バケットの名前を入れるようにしてください。
※Dropbox 等で同期を行っている方は、適宜 aws cliのコマンドを書き換えて実行してください。
(3) git diff --staged --quiet
というのは、ステージしたファイルに関して差分があるかどうかをチェックし、差分がある場合は--quiet
オプションによって終了ステータスが1になるため、後続のコマンドによってgithubの環境変数が設定されるようになっています。
この方法のメリット
-
Remotely saveのバックアップができる
Remotely saveでクラウド同期ができますが誤って沢山のファイルを削除して同期した場合、復元が難しいです。githubでスナップショットをとっていれば、少なくとも1日前の状態に復元が可能です。 -
余計にgitのコミット履歴が残らなくて済む
クラウド同期するだけならobsidian-gitを使えば良いのですが、例えば5分ごとに同期するような設定だと余計なコミット履歴が残ってしまいます。また、pushの回数が多ければそれだけCIが頻繁に動いてしまうという問題もあります。今回の方法ではコミット、pushする回数は一日一回で且つgithub actions botによるコミットなので、リポジトリと自分のコミット履歴を汚さずに済みます。 -
1日ごとの作業量が差分で見える
もちろんgitの検索コマンドを使えば一日ごとの作業量は可視化できますが、1コミットが1日の作業量に対応するので差分の確認は楽です。(尤も、差分の確認は自己満足程度の意味合いしかありませんが...) -
同期するタイミングで自分のPCが起動していなくて済む
githubにpushするのを1日一回にするというだけであれば、自分のpcにcronを設定すれば良いですが、その時間に自分のpcが動いているとは限りません。S3から同期する場合はその問題を気にする必要はありません。
Discussion