Obsidian Self-hosted LiveSync を Google Compute Engine で構築する

今回は Obsidian の Self-hosted LiveSync を Google Cloud の Compute Engine 上に構築してみたのでやり方を紹介します。 公式では Fly.io を利用する方法がおすすめされており、そちらの方が的簡単に構築できると思います。

が、今回は Google Cloud の勉強も兼ねているので、あえて Compute Engine を使ってみました。

なぜ Self-hosted LiveSync を使うのか

もともとは GitHub で同期をしていましたのですが、
スマホから使うときに不安定なことがあったり、PCから使う場合でも Sync のタイミングで入力がおかしくなったりしていました。

全体的にはそこまで困ってなかったのですが、LiveSync の存在を知って試してみたくなり、今回試してみることにしました。

Self-hosted LiveSync についての概要

GitHub - vrtmrz/obsidian-livesync

Contribute to vrtmrz/obsidian-livesync development by creating an account on GitHub.

github.com

Obsidian Self-hosted LiveSync は、Obsidian のノートを複数のデバイス間で同期するためのプラグインです。 公式の Obsidian Sync の代替として、自分自身のサーバー上にデータを保存することができます。

Google Cloud Compute Engine での構築手順

WARNING

注意 Claude (AI) に教えてもらいながらやってみたので、もし真似する場合は自己責任でお願いします。

0. 前提

  • Google Cloud のアカウントを作成しておく
  • Google Cloud CLI をインストールしておく
  • Google Cloud のプロジェクトを作成しておく

1. Compute Engineインスタンスの作成

無料枠に収まるように、最小限のインスタンスを作成します。 (多分収まってるはずですが、まだ未確認)

無料枠については以下の公式ドキュメントを参照してください。 データ転送に関しては、無料枠の対象外なので注意が必要です。

Free Google Cloud features and trial offer  |  Google Cloud Free Program  |  Google Cloud Documentation

Learn about Google Cloud's free offerings and free trials, plus how to upgrade your account.

cloud.google.com
Terminal window
# e2-microインスタンスの作成(無料枠対象)
gcloud compute instances create couchdb-server \
--machine-type=e2-micro \
--zone=us-central1-a \
--image-family=debian-12 \
--image-project=debian-cloud \
--boot-disk-size=30GB \
--boot-disk-type=pd-standard \
--tags=http-server,https-server

起動しっぱなしの運用を想定しているので、静的IP アドレスの取得は不要です。

2. ファイアウォールルールの設定

Terminal window
# HTTP(80)とHTTPS(443)ポートを開放
gcloud compute firewall-rules create allow-http \
--allow=tcp:80 \
--target-tags=http-server \
--description="Allow HTTP traffic"
gcloud compute firewall-rules create allow-https \
--allow=tcp:443 \
--target-tags=https-server \
--description="Allow HTTPS traffic"
# CouchDB用のポート(5984)を開放
gcloud compute firewall-rules create allow-couchdb \
--allow=tcp:5984 \
--target-tags=http-server \
--description="Allow CouchDB traffic"

3. CouchDBのインストールと設定(Dockerを使用)

SSH でインスタンスに接続して、CouchDB をインストールします。

Terminal window
# SSHでインスタンスに接続
gcloud compute ssh couchdb-server --zone=us-central1-a
# システムの更新 (upgrade はかなり時間がかかる)
sudo apt-get update
sudo apt-get upgrade -y
# Dockerのインストールに必要なパッケージをインストール
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
# Dockerの公式GPGキーを追加
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Dockerのリポジトリを追加
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# リポジトリを更新してDockerをインストール
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# Dockerサービスを開始し、自動起動を有効化
sudo systemctl start docker
sudo systemctl enable docker
# 現在のユーザーをdockerグループに追加(再ログインが必要)
sudo usermod -aG docker $USER
# CouchDBのデータ保存用ディレクトリを作成
sudo mkdir -p /opt/couchdb/data
sudo mkdir -p /opt/couchdb/etc
# CouchDBの設定ファイルを作成
cat << 'EOF' | sudo tee /opt/couchdb/etc/local.ini
[couchdb]
single_node=true
[chttpd]
port = 5984
bind_address = 0.0.0.0
[couch_httpd_auth]
require_valid_user = false
[httpd]
enable_cors = true
[cors]
origins = *
credentials = true
methods = GET, PUT, POST, HEAD, DELETE
headers = accept, authorization, content-type, origin, referer, x-csrf-token
EOF
# ディレクトリの権限を設定
sudo chown -R 5984:5984 /opt/couchdb
# CouchDBのDockerコンテナを実行
# パスワードを環境変数として設定
COUCHDB_PASSWORD="your_strong_password_here"
sudo docker run -d \
--name couchdb \
-p 5984:5984 \
-v /opt/couchdb/data:/opt/couchdb/data \
-v /opt/couchdb/etc/local.ini:/opt/couchdb/etc/local.ini \
-e COUCHDB_USER=admin \
-e COUCHDB_PASSWORD=${COUCHDB_PASSWORD} \
--restart always \
couchdb:latest
# コンテナのステータスを確認
sudo docker ps

4. CouchDBの動作確認

Terminal window
# CouchDBが正常に動作しているか確認
curl http://localhost:5984
# 以下のような応答があれば成功
# {"couchdb":"Welcome","version":"3.x.x","git_sha":"xxxxxxx","uuid":"xxxxx","features":[],"vendor":{"name":"The Apache Software Foundation"}}
# Dockerログの確認(問題がある場合)
sudo docker logs couchdb

5. システムデータベースとObsidianデータベースの作成

Terminal window
# システムデータベースを作成
curl -X PUT http://admin:${COUCHDB_PASSWORD}@127.0.0.1:5984/_users
curl -X PUT http://admin:${COUCHDB_PASSWORD}@127.0.0.1:5984/_replicator
curl -X PUT http://admin:${COUCHDB_PASSWORD}@127.0.0.1:5984/_global_changes
# Obsidian用のデータベースを作成
curl -X PUT http://admin:${COUCHDB_PASSWORD}@127.0.0.1:5984/obsidian
# データベース一覧を確認
curl -X GET http://admin:${COUCHDB_PASSWORD}@127.0.0.1:5984/_all_dbs
# ["_global_changes","_replicator","_users","obsidian"]

6. HTTPSの設定(Let’s Encrypt使用)

スマホからも使えるように、HTTPSで接続できるようにします。 PC オンリーの場合は、直接 IP アドレスでアクセスしても良いと思います。

このタイミングで、DNS を設定しておくと良いです。 私は、Cloudflare を使っているので、Cloudflare の DNS 設定をしておきました。

Terminal window
# IP アドレスを確認
gcloud compute instances describe couchdb-server --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
TypeNameIP AddressTTLProxy status
Ayour-domain.com{IP アドレス}AutoDNS only

後ほど、画像を GCS に保存してみたりしたいなと考えているので、ここでは https://your-domain.com/couchdb/ でアクセスできるように設定します。 GCS には https://your-domain.com/assets/ とかでアクセスできるようにしたいなと考えています。

Terminal window
# Certbotのインストール
sudo apt-get install -y certbot python3-certbot-nginx
# Nginxのインストール(リバースプロキシとして使用)
sudo apt-get install -y nginx
# Nginx設定
sudo vi /etc/nginx/sites-available/couchdb
# 以下の内容を追加
# server {
# listen 80;
# server_name your-domain.com; # ドメインを設定
#
# client_max_body_size 100M; # 動画データなどに対応するため
#
# location /couchdb/ {
# rewrite ^/couchdb/(.*) /$1 break;
# proxy_pass http://localhost:5984;
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# }
# }
# シンボリックリンクの作成
sudo ln -s /etc/nginx/sites-available/couchdb /etc/nginx/sites-enabled/
# Nginx設定のテスト
sudo nginx -t
# Nginxの再起動
sudo systemctl restart nginx
# CertbotでSSL証明書を取得
sudo certbot --nginx -d your-domain.com

ここまでで、Google Cloud 上に CouchDB をインストールし、HTTPS でアクセスできるように設定しました。

次は、Obsidian の設定を行います。

Obsidian の設定

1. Obsidian LiveSync プラグインのインストール

Obsidian の設定画面から、Community plugins を開き、LiveSync プラグインをインストールします。

2. LiveSync の設定

基本的には Quick Setup の手順に従って設定を行います。

obsidian-livesync/docs/quick_setup_ja.md at main · vrtmrz/obsidian-livesync

Contribute to vrtmrz/obsidian-livesync development by creating an account on GitHub.

github.com

Remote Database connection の部分で、以下のように設定します。

項目
Server URIhttps://your-domain.com/couchdb/
Usernameadmin
Password{CouchDB のパスワード}
Database Nameobsidian

手順書に従いそのまま2台目以降もセットアップします。

完成

このように、同期されます。

おわりに

今日やったばかりで、そもそも無料枠に収まっているのかすら不安です。 データ転送も大した金額にならないと踏んでいるのです、実際どの程度になるのかはあまり考えてません。 そのあたりと使用感を含めて、1ヶ月後くらいに追記しようと思います。

GCS に画像アップロードするのも近々やろうと思います。 アップロード自体は簡単なんですが、普通にやると誰でも閲覧可能な状態になってしまうので、 そのあたりの設定をどうするか考え中です。