Obsidian の同期を解消する & Cloudflare 配下でホストする

Summary

Obsidian 使ってますか?
最近では話題になることや、 VSCode のようにメモツールとして使う需要が増えているのを観測していて、自分は2年ぐらい前には一度試していますが、社内で使うには商用ライセンスを購入する必要があり(Obsidian 側の言い分では会社が払おうが個人で払ってくれてもよい)断念していました。

Obsidian が 2025/02 に商用利用でもライセンスの購入が不要になりました。そのためこのアナウンスを見て再度導入を検討してみることにしました。とりあえず自身の使いやすいメモ帳兼スクラップブックにするのが当面の目標です。

目的

PC, Mobile, または双方の同期の仕組みは公式の方法以外でもいくつかありますが、筆者の環境ではとりあえず当面の目標として一言で言うならば「情報はすべて一箇所に、そう Obsidian ならね」を実現したい。
これは、現代社会では多いと思いますがどこかで見た資料や仕様書、説明書、郵便で届いたレーターなどデジタルで様々な形式で保存していると思う。これを後から「あーどこかで見たなどれだっけ?」や「なんかアレ買った気がするんだけどいつ買ったけ?」などが発生し携帯でメールや注文履歴、そこからメーカーページを確認するなど時間を浪費していることも多いかと思う。

これが、中々な回数発生しており解消したい。
また、今は Read it later ツールとして Readwise を利用しているが関連の知的生産系ツールと連携が一番すぐれているので使い始めたが、 Obsidian のプラグインの出来がまだイマイチでありフィードバックを送りまくったが修正されるのにしばらくかかるだろう。。これを使っても根本として Web 上の記事が消失した場合閲覧することができなくなるため対策としてすべてローカルに保存しておきたい。そこで Static HTML や PDF として保存し AI などで要約検索できるようにしたいと思っている。

最終的には、 Obsidian を開いて AI Chat に質問すれば自分が収集した情報を見つけてアクセスできる状況を作成したい。

同期の方法

  • Git を使う方法は安定した試しがなく、下記の懸念もあります

    • GitHub だと最大ファイルサイズが 100MB、レポジトリサイズが2GB
    • SSH 認証は厳しく、 Token 認証は過剰権限な気がしてる
    • iOS などで Working Copy & iOS Shortcuts 黒魔術に疲れた
    • Remotely Save は有料化が見えている
  • Obsidian Sync

    • 単純に高い、 $4/月 プランでは最大ファイルサイズが 4MB で仕様書などを入れると同期出来ない
    • $8/月の方は単価が高く、 IFTTT などでデータを投げ込めない
    • Self-hosted できる我が家なのに、ホスティングに頼るのは負けた気がする
  • Self-hosted LiveSync

    • 自宅のリソースを活かせる、セルフホスト
    • ライブに同期される
    • CouchDB の API でデータを投げ込めば外部から追加できる
    • それなりに使われているし、作者が必要にかられて制作しているのでメンテナンスされている

ということで、 Self-hosted LiveSync を使うことにした。

セットアップ

基本は、マニュアルに通りにセットアップしますが、

最終的には Cloudflare Tunnel を返して Cloudflare Access で保護された接続にするため docker-compose でまとめました

展開用のディレクトリ等を作成します

1
mkdir -p couchdb/config

.env に認証情報を保存しておく

.env
1
2
3
COUCHDB_PASSWORD=<★CouchDB PASSOWRD★>
COUCHDB_USER=<★CouchDB USER★>
TUNNEL_TOKEN=<★Cloudflare Tunnel Token★>
  • cors/headers: Cloudflare の Service Token で利用する HTTP Header を追加しています
  • cors/methods: CORS 通信をさせるために OPTIONS を許可する
couchdb/config/default.ini
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[chttpd]
bind_address = 0.0.0.0
port = 5984
require_valid_user = true
enable_cors = true
max_http_request_size = 4294967296 # 4096MB

[chttpd_auth]
require_valid_user = true

[httpd]
WWW-Authenticate = Basic realm="couchdb"
enable_cors = true

[couchdb]
single_node=true
max_document_size = 50000000 # 47.68MB

[cors]
credentials = true
headers = accept,authorization,content-type,origin,referer,cf-access-client-id,cf-access-client-secret
max_age = 3600
methods = GET,PUT,POST,HEAD,DELETE,OPTIONS
origins = app://obsidian.md,capacitor://localhost,http://localhost
docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
---
name: ob-self
services:
  livesync:
    image: couchdb:3
    container_name: obsidian-livesync
    environment:
      COUCHDB_USER: "${COUCHDB_USER}"
      COUCHDB_PASSWORD: "${COUCHDB_PASSWORD}"
    depends_on:
      tunnel:
        condition: service_healthy
    volumes:
      - ./couchdb/data:/opt/couchdb/data
      - ./couchdb/config:/opt/couchdb/etc/local.d
    # Ports not needed when already passed to Proxy
    ports:
      - 5984:5984
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-file: '1'
        max-size: 10m
    healthcheck:
      test:
        - "CMD-SHELL"
        - "curl -sfSL http://localhost:5984/_up || exit 1"
      start_period: '30s'
      retries: 3
      timeout: '5s'
      interval: '60s'

  tunnel:
    image: cloudflare/cloudflared
    command: tunnel run
    environment:
      TUNNEL_TOKEN: "${TUNNEL_TOKEN}"
      TUNNEL_METRICS: "0.0.0.0:60123"
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-file: '1'
        max-size: 10m
    healthcheck:
      test: ["CMD", "cloudflared", "tunnel", "--metrics", "localhost:60123", "ready"]
      start_period: '10s'
      retries: 3
      timeout: '5s'
      interval: '60s'

Cloudflare 側

  • Cloudflare では Tunnel 設定で Public Hostname を設定
    • img
  • Service Token を発行
    • img
  • Policies を作成し Service Token で認証するように設定
    • img
  • Access で Self-hosted を設定
    • Policies を追加
    • CORS をバイパスする設定を入れておきます
      • img

Obsidian の設定

プラグインをインストールし Remote Server セクションで CouchDB の情報を入力します。
追加で Service Token を Custom Headers に下記の形式で設定し Test ボタンを押すことで接続テストができ、 Check で DB の設定確認、その後問題なければ Apply を押すことで設定が完了します。
あとは、 Sync Settings で Presets livesync を選択することで自動で同期が始まるはずです。

もう一点、 Cloudflare Tunnel を利用した接続の場合 100秒以上の接続が出来ないため CouchDB の更新取得用 API がタイムアウトし 右上にエラーになったことが報告されるケースがあります。

これは、下記の手順で Use timeouts instead of heartbeats をオンにすると 60秒毎に接続し直すので解消する

  • Setup Tab
    • Enable extra and advanced features
      • Enable poweruser features: ✅️

Image

  • Power users
    • CouchDB Connection Tweak
      • Use timeouts instead of heartbeats: ✅️

Image

設定出来たら念の為再起動して、あげれば解消するはず

最終更新 2025-05-11 00:10 +0900
Hugo で構築されています。
テーマ StackJimmy によって設計されています。