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日現在、公式の手順を見て見ると英語のページと日本語のページで結構記述内容に違いがある。
- 英語版 https://github.com/vrtmrz/obsidian-livesync/blob/main/docs/setup_own_server.md
- 日本語版 https://github.com/vrtmrz/obsidian-livesync/blob/main/docs/setup_own_server_ja.md
やっていることはほぼ同じだが、英語版は 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"
の行を追加する
- /etc/rc.conf に
- 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