📖

Obsidian Self-hosted LiveSync

に公開

Evernoteの値上げや仕様変更に耐えられなくなってやめてから、めっきりノートを取る頻度が下がってしまった。
一応 obsidian をインストールしてmacとiPhoneの間をiCloudで同期していたのだが、どうも使い勝手が悪くて離れていた。
家族との共有には dropbox paper を使っていたが、これも iPhone 版のクライアントのできがいまいちだし、web版は画面が狭くて使いにくい部分がある。

最近の状況はどうなっているのかと思って調べてみたら、obsidian に livesync と言うプラグインがあって、結構使っている人がいるらしい。

参考

公式サイト

中身を見て見ると、CouchDB のサーバーを立てて、obsidianのプラグインから CouchDB を読み書きするようになっているらしい。
検索でひっかかる人はだいたい公式手順に従って fly.io で CouchDB を動かしているようだが、TipにFly.io is no longer free. とか書いてある。また、CouchDB以外にも S3 とか p2p とかも使えるようだ。
が、とりあえず自前で CouchDB を立ち上げてみることにする。
2025年6月24日現在、公式の手順を見て見ると英語のページと日本語のページで結構記述内容に違いがある。

やっていることはほぼ同じだが、英語版は couchdbのデータが Dockerのホストに置かれるのにたいして、日本語版はコンテナ内に置かれるので、コンテナが消えるとデータも消えてしまうように見える。
また、日本語版は外から local.ini を与えるのに対して、英語版は起動後にAPIでデータベースを初期化する。

CouchDB の構築 (Docker)

英語版をベースに以下のように構築することにした。

docker-compose.yml

services:
  couchdb:
    image: couchdb:latest
    container_name: couchdb-for-ols
    environment:
      - COUCHDB_USER=${username}
      - COUCHDB_PASSWORD=${password}
    volumes:
      - couchdb:/opt/couchdb
    ports:
      - ${hostname}:5984
    restart: always

volumes:
  couchdb:

公式ドキュメントとの違いを列挙すると以下のようになる。

  • volumesでマウントするのを、ホストのディレクトリではなく docker volumesにする
    • こうすると、コンテナで動くプロセスの uid が 5984 であることを気にせずにデータを永続化できる
    • データを消したい場合は docker volume rm obsidian-livesync_couchdb する
  • portsを 5984:5984 から ${hostname}:5984 にする
    • 元々の設定だと、ホストの 0.0.0.0:5984 で LISTEN してしまう。直接外部に公開したいのでなければ、127.0.0.1:5984 とかで LISTEN するべき
  • restart を always にする
    • これは状況によるかも

以下のようなシェルスクリプトで起動/初期化を行う

  • hostname には、LISTENしたいIPアドレス、ポート番号を指定する(localhostとか名前は書けない)
  • username には CouchDB の管理者ユーザ名を指定する
  • password には CouchDB の管理者パスワードを指定する
export hostname=127.0.0.1:5984
export username=goojdasjdas     #Please change as you like.
export password=kpkdasdosakpdsa #Please change as you like

docker compose up -d
curl -s https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/couchdb/couchdb-init.sh | bash

私の場合、docker は家庭内の raspberry pi で動いていて、後述する web server はさくらのVPSの FreeBSD で動いているので、hostnameのIPアドレスには raspberry pi の tailscale の IPを指定した。

CouchDBの構築 (FreeBSD)

docker で CouchDB が起動したところで、iPhoneからアクセスするためには証明書つきの https でアクセスする必要があることに気づく。
今のところ、Let's Encrypt の証明書がある独自ドメインの web server は FreeBSD で動いているので、FreeBSD で CouchDB も動かすことにする。
この場合、docker は使えないのでFreeBSD版の CouchDB をインストールしてセットアップする。

  • CouchDB のインストール
    • sudo pkg instal couchdb3
  • CouchDB の設定
    • /usr/local/etc/couchdb3/local.ini を修正する
    • docker版と違い、FreeBSD版は設定なしでは起動しないので、日本語版のドキュメントを参考に適当に手を入れる
    • 以下の差分だとちょっと足りないので、適宜追加を
    • 公式の日本語版の local.iniで気になった部分を書いておく
      • require_valid_user = true: chttpdセクションとchttpd_authセクションにあるが、default.iniだとchttpd_authにはない
      • enable_cors = true: httpdセクションにあるが、CouchDB 3.2 から chttpd セクションに移動したとある
*** local.ini.sample	2025-04-13 00:20:21.000000000 +0900
--- local.ini	2025-06-23 13:04:47.795466000 +0900
***************
*** 32,37 ****
--- 33,41 ----
  
  ; For more socket options, consult Erlang's module 'inet' man page.
  ;socket_options = [{sndbuf, 262144}, {nodelay, true}]
+ bind_address = 127.0.0.1
+ port = 5984
+ enable_cors = true
  
  [httpd]
  ; NOTE that this only configures the "backend" node-local port, not the
***************
*** 97,100 ****
  ; 'username = password' lines. Don't forget to restart CouchDB after
  ; changing this.
  [admins]
! ;admin = mysecretpassword
--- 101,117 ----
  ; 'username = password' lines. Don't forget to restart CouchDB after
  ; changing this.
  [admins]
! admin = <あなたが決めたパスワード>
! 
! [cluster]
! n = 1
! 
! [cors]
! origins = app://obsidian.md,capacitor://localhost,http://localhost
! headers = accept, authorization, content-type, origin, referer
! credentials = true
! methods = GET, PUT, POST, HEAD, DELETE
! max_age = 3600
  • CouchDBの有効化
    • /etc/rc.conf に couchdb3_enable="YES" の行を追加する
  • CouchDBの起動
    • sudo service couchdb3 start

リバースプロキシの設定

外向きに https でサービスしている web server から、CouchDB にリバースプロキシしてあげる必要がある。
apache2 が動いているので、httpd.conf に以下の設定を追加する。

  • 最初、mod_proxyだけLoadModuleしてmod_proxy_httpをLoadしなかったら AH01144: No protocol handler was valid for the URL /ols (scheme 'http'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule. みたいなエラーが出て悩んだ
  • 以下の設定では /ols と言うURLにしているが、もっとわかりにくい名前でも良いかもしれない
  • 同じホストではなく別のホストで CouchDB が動いている場合は、http://100.123.456.789:5984/ のように指定する(tailscaleの例のつもりだけど、456.789とかに突っ込まなくていいからね)
LoadModule proxy_module libexec/apache24/mod_proxy.so
LoadModule proxy_http_module libexec/apache24/mod_proxy_http.so

    <VirtualHost *:443>
        # ここに元々の設定群

        ProxyRequests Off
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyPass /ols http://127.0.0.1:5984/
        ProxyPassReverse /ols http://127.0.0.1:5984/
    </VirtualHost>

うまく行っていれば、 https://<webserver>/ols/_utils/ にアクセスすると CouchDB の管理画面が表示される。

クライアントのセットアップ

obsidian のクライアントで新しい Vault を作り、コミュニティプラグインから Self-hosted LiveSync をインストールして設定する。
この設定も決してわかりやすいとは言えないが、なんどか試行錯誤すればなんとかなるだろう。
Synchronization Method を LiveSync にすると本当にリアルタイムに同期してくれる。
初回のセットアップが終わると、extra features を有効にするか?と聞かれるが、始めてならば No をオススメ、とか出てくるのでとりあえず No にしておいた。
今後、余裕ができたら細かい設定を眺めてみたい。

Discussion