📖CouchDBとObsidian Self-hosted Live Syncを使ってみる
CouchDBとObsidian Self-hosted Live Syncを使ってみます。
# やる
# 参加する側

URIもらってぺたぺたするだけだった。
# 自分のやつ
やります。
無料の Google Cloud 機能とトライアル特典 | Google Cloud Free Program | Google Cloud Documentation
CouchDBはMVCCの文脈で贅沢なDBだが、Google Cloud Compute Engineが無料で30GB使えるのに対し、Obsidianはそこそこ小さいので、採用しても大丈夫そう。特に、大部分が画像ファイルとかだけど、更新されることはないから、MVCCに関与しない。
# CouchDBの準備
Google Cloud Compute EngineとTailscaleを使う。
VMインスタンスを作る。
無料にするために、
- リージョンを
us-west1 (オレゴン)にする - マシン構成を
E2/e2-microにする - ブートディスクをこうする
- x86_64にする

ネットワーキングの設定

ネットワークサービスティア を「スタンダード」にする。

これでいいらしい。

Tailscaleを使う前提ならこの2つのチェックは外した状態でよいかも。これは私のミス。
次、1GBだと足りないので、SSHで繋いで (サイトにある SSH ボタン) SWAP領域の設定をする。
sudo apt update && sudo apt upgrade -y
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
確認。
nzyc0216@obsidian:~$ free -h
total used free shared buff/cache available
Mem: 955Mi 415Mi 142Mi 1.0Mi 567Mi 540Mi
Swap: 2.0Gi 0B 2.0Gi
次、Dockerを入れる。
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker # サーバ起動時にDockerを起動する設定
最後、CouchDBの設定と起動。
mkdir -p ~/obsidian-sync && cd ~/obsidian-sync
sudo apt install -y vim # vimがなかったので入れる
vi compose.yml
services:
couchdb:
image: couchdb:3.3.3
container_name: couchdb-sync
restart: always
logging:
driver: "json-file"
options:
max-size: "10m" # ログ1ファイルあたり10MBまで
max-file: "3" # 過去3ファイルまで残す(最大30MBに制限)
environment:
- COUCHDB_USER=nola
- COUCHDB_PASSWORD=your_secure_password # ← 実際の強力なパスワードに!
volumes:
- ./data:/opt/couchdb/data
- ./local.ini:/opt/couchdb/etc/local.ini
ports:
- "127.0.0.1:5984:5984" # 外部に直接公開せず、安全のためにローカルのみで受け付けます
vi local.ini
[couchdb]
single_node=true
max_document_size = 50000000
[chttpd]
require_valid_user = true
max_http_request_size = 4294967296
[chttpd_auth]
require_valid_user = true
authentication_redirect = /_utils/session.html
[httpd]
WWW-Authenticate = Basic realm="couchdb"
enable_cors = true
[cors]
origins = app://obsidian.md,capacitor://localhost,http://localhost
credentials = true
headers = accept, authorization, content-type, origin, referer
methods = GET, PUT, POST, HEAD, DELETE
max_age = 3600
起動。
sudo docker compose up -d
確認。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39904c9b3485 couchdb:3.3.3 "tini -- /docker-ent…" 25 seconds ago Up 25 seconds 4369/tcp, 9100/tcp, 127.0.0.1:5984->5984/tcp couchdb-sync
初期設定。
$ curl -X POST http://nola:your_secure_password@127.0.0.1:5984/_cluster_setup \
-H "Content-Type: application/json" \
-d '{"action": "finish_cluster"}'
$ curl -X PUT http://nola:【★パスワード】@127.0.0.1:5984/obsidian-vault
Tailscaleを入れる。
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
確認。
tailscale ip -4
HTTPSを有効にする。
$ sudo tailscale serve --bg --https=443 http://127.0.0.1:5984
$ tailscale serve status
https://obsidian.tailc73153.ts.net (tailnet only)
|-- / proxy http://127.0.0.1:5984
Tailscale Funnelはオフにする。(この画像はしてないけど)

一緒にこれも外しておく。(Google Cloud Compute Engine側の設定)

自分のPCからSSHできるようにしておく。
手元のPCで、
pbcopy < ~/.ssh/id_ed25519.pub
として、Google Cloud Compute Engineで立てたVMに登録しておく。
ここの 編集 から、SSH認証鍵欄に追加する。

ただし、公開鍵の末尾はSSHでログインしたいユーザ名にしておく。(ここでは、すでに nzyc0216 として作業を進めていたため、それに揃えた)
ssh nzyc0216@obsidian.tailc73153.ts.net
ドメインは tailscale serve status で出てくるやつ。
最後、Obsidian Self-hosted Live Syncの設定。

CouchDBのダッシュボード。
- https://obsidian.tailc73153.ts.net/_utils/
iPhone側の設定をして終了しましょう。
Tailscaleはもう繋いであるので、Obsidian Self-hosted Live Syncの機能でQRコードを作り、iPhoneで新しく作ったVaultで読み込めば...?
できた!!!!
# 理解
flowchart TD
通信のフロー
User -->|① ノートを編集| App
App ==>|② HTTPS 暗号化通信<br>Tailscale VPN 経由| TS
TS -->|③ 内部リバースプロキシ| CouchDB
CouchDB ==>|④ データの永続化| Disk
%% 管理用ルート
User -.->|Tailscale 経由で安全にログイン| VM
style VM color:#000
style GCP color:#000
style ObsidianSync color:#000
# 没になったひとたち
CouchDB と Obsidian Live Sync で複数デバイス間の同期を実現する
Obsidian Live Sync プラグインと CouchDB を使用して、複数デバイス間でノートを同期する方法を解説します
Obsidian Self-hosted LiveSync
GitHub - vrtmrz/obsidian-livesync
Contribute to vrtmrz/obsidian-livesync development by creating an account on GitHub.
SSL証明書が必要っぽかったり、自宅サーバに触れることになったり、結構面白そうですよ。