🤖

Remotely save × github × Quartz によるクラウド同期で快適&無料なObsidianホスティング

2024/08/01に公開

Obsidian といえば、公式のクラウド同期サービスとして Obsidian Sync
ホスティングはObsidian Publishが有名ですが、どちらも月額で料金がかかります。

円安のご時世で毎月ドルで課金というのも中々ハードル高いですね。

そこで、無料で使えるコミュニティプラグイン、クラウド同期サービスとして Remotely save
ホスティングはQuartzを使って代替しようと考えました。

Remotely saveに関しては、当然ですが利用しているクラウド、保存容量によって料金がかかります。

前提

以下の2つができることが条件になります。

上記2つの設定方法はは公式ページや別の利用者の方の説明記事があるので、当記事では説明しません。
github actionsの設定方法が記事のメインの内容となります。

流れ

  1. ローカルで編集
  2. AWS S3 にデータをバックアップ
  3. 毎日定時に github actions で S3 と同期して自動でコミット
  4. Quartzでホスティングしているサイトに更新がかかる

2までの流れは通常のRemotely Saveと同じで、そこからgithub actionsQuartzのデプロイ設定を行っているリポジトリにS3のデータを同期して自動でコミットするイメージです。
※筆者の場合はVercelでデプロイしていますが、Quartzが対応しているサイトであればどれでも可です。

方法

  1. Quartz でホスティングを行う
    下記の公式サイトを参考にホスティングを行います。
    https://quartz.jzhao.xyz/
    content ディレクトリはまだ空のままにしておきます。

  2. Remotely save でクラウド同期を行う
    下記の公式リポジトリを参考に同期の設定を行います。
    https://github.com/remotely-save/remotely-save
    当記事ではAWS S3を使って解説します。
    (後述するaws s3 syncのようにクラウドからローカルにファイルをダウンロードして同期できるようなコマンドが存在していれば、Dropbox等でも利用可能です。)

  3. github actions の設定
    1.でホスティングした際のgithubリポジトリに、環境変数AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYをセットします。
    settings/Secrets and variables/Actions から設定可能です。

    また、settings/Actions/GeneralWorkflow permissionsRead 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から同期する場合はその問題を気にする必要はありません。

GitHubで編集を提案

Discussion