Obsidian+Webdavでストレージサービス非依存のノート環境を用意した話

 

はじめましての方ははじめまして。
EEIC Advent calendar の12日目の記事です。

qiita.com

大遅刻かまして本当にごめんなさい。

本当はマイコンの話を書こうと思ったのですが、今日に至るまで十分なネタがたまりませんでした。カレンダーに2枚目も出来たのでもし25日までに間に合えば公開しようと思います(BDMもあるのでESP32の紹介・導入+tipsを書きたかった)。

代わりに最近Obsidianを利用してローカル環境のみにデータを残しながら各デバイスでデータを連携させたノート環境を構築したので、そのモチベーション+環境構築について書こうと思います書きました。

ここからしばらくなぜそれを実現したかったか長く鬱陶しい前置きが続きますので、物好きな方以外は「実際の環境構築について」まで飛ばしていただけますと幸いです。

 

長くくどい前置き

さて、皆様は電子媒体でメモやノートを取るときどのようなサービスを利用していますか?

 

Notionのようなツールを活用する方もいれば、スマホのメモアプリを利用する方、あるいはDiscordに自分用のサーバを用意しそこに記入していく方もいらっしゃるかもしれません。

 

この内、ある一つのローカル環境のみでデータを扱う場合を考えると、そのデバイスを紛失・破損した場合今までの記録を失ってしまう事になります。これは紙媒体に物を書き溜めていく場合も同様のリスクがあると考えられます。ある日自分の書き溜めてきた全ての文書にアクセスできなくなるのは、直近のタスクに大きな支障をきたすだけではなく、かつて書き溜めたものから過去の自分の足跡を辿って自分自身の連続性を確かめるといった事も出来なくなり、中々辛いものがあります。

 

ではストレージサービスやクラウド上にデータをアップロードするようなサービスはこのような悩みから無縁かというと、そうではなく、むしろ状況は悪化すると考えられます。こう述べる理由は、これらのサービスを利用した際、データはあくまでも営利企業との契約において存在を保証されるものであり、それ自体が存在している訳では無いと考えるからです。

 

データはあくまでも企業上のサーバのストレージ上に存在し、ユーザは限られたインターフェースを経由してそれを扱う事となります。UXとストレージが統合されて提供されている場合は、そもそもユーザの眼前に存在するものは仮想の存在であり、データ自体をダウンロード出来たとしてもそれはサービス上で扱っていたそのもの足り得ない訳です。いわば、契約が正常状態で履行されている時に限りユーザの眼前に仮想的なデータが存在しているのです。特定サービスのみに依存してしまうという事は、自分の手元には実際のデータは一切なくなる事と同義と言えるでしょう。

 

企業が突然その機能を停止すればデータは仮想的にすら存在しなくなる訳ですし、またインターネット環境が失われた場合も同様です。さらに、こちらに落ち度が無いと考えられる場合ですら全て消えてしまうがあります。

 

例えば、Google Driveだと自分の子供の写真をアップロードしていた方や兵器の歴史の研究に用いていたデータを他の研究者と共有していた方がアカウントをロックされたという話が以前話題になっておりました。このような人間が判断した場合は誤っていると判断されうるようなアカウント凍結は、一つの企業が扱うデータ量が膨大で、かつ増え続ける以上は存在し続けるでしょう。人間の権能をプログラムが上回る事がない限りは、ユーザが納得出来る判断をプログラムによる自動的な処理では実現できないのだろうと思います。

 

このような状況から脱し、かつ利便性を維持する現実的な解決策としては、「定期的にローカル環境にデータ本体を取って置きながらサービスを利用する」 というところに落ち着くのでしょうが、正直面倒ですし、さっき申した通りバックアップしたデータと仮想的なデータとの間には差が生まれうる訳で、はてどうしたものかとここしばらく悩み続けていました。

 

そういう折に、Obsidianの有志が開発したプラグインを使えばメジャーなストレージサービスだけでなく、Webdavを通してローカル環境のストレージにほぼリアルタイムでデータを同期しておける事を知りました。Obsidian本体も使いやすいマークダウンエディタという印象で、私個人としてはグラフビューはそこまで活用しないだろうなと考えると仮想的なデータといざという時に残るデータとの乖離も小さいだろうと考えられ、スマホ・PCでシームレスに連携でき、かつデータの実体も常に手元にある状況を実現出来る訳でかなり理想的な環境に見えました。

 

幸い私は既に手元にWebdavでアクセス可能な環境があります。

 

EEICには試験や院試の過去問、五月祭の際に用いたデータの共有にpydioによるオンラインストレージを用意しているのですが、試験前などはアクセスが集中するのかかなり重たい印象を受けていました。

そこで自分自身で自宅に立てたサーバにWebdavアクセス可能な環境を構築し、試験的に学科民に提供していたのですが、ちょうど良いのでこれを流用する事にしました。

 

という訳で前置きがめちゃくちゃ長くなりましたが、ここから本題です。

実際の環境構築について

ここから、自分の構築した方法を紹介していきます。なお、webdav経由でアクセス可能なストレージの事をwebdavと略している場合があるのでご了承ください。

 

まず、サーバですが、私は既に立てていているものがあったので流用しました。OSは Ubuntu 22.04 です。もしまだ用意が無い場合、最近だと N100 のような十分なスペックのCPUを積んだミニPCが通販で比較的安価ですのでこれを利用するのが良いかもしれません。参考までに、私が利用しているサーバは、

・CPU:i5-4590

・メモリ:32GB

で、光の1ギガの回線を利用していますが、Webdav を利用する上ではストレスを感じた事は無いですね。メルカリや秋葉原のジャンクショップでパーツを集めて組んでます。

自宅サーバ、なお引っ越してさらに配線が汚くなった

常時稼働させる事にはなるので一応電源は新品を購入しています。もちろん予算が潤沢にある場合はPCを一つ買うなり新しく組むなりしてしまうのもアリでしょう。ネイティブのLinux環境があると割と便利だったりします。NASによってはそもそもWebdavによるアクセスが用意されているようなので、これを利用するのも手の一つでしょう。

 

ルータに関しては、恐らくWebdavを個人で利用するだけなら一般的なものでも問題なく機能すると思います。サーバとは有線で接続し、ローカルのIPアドレスを固定で割り振り、Webdav構築後ポートマッピング機能でLAN内のサーバとWANを繋げればそれで十分でしょう。私はヤフオクで入手したIX2215を利用しています。一応NECのIXシリーズやYamahaのRTXシリーズなどは業務用とされている中でもヤフオク等にて格安で入手しやすく、かつネット上の情報も多いので興味のある方は調べてみてください。

 

Webdavの実現については、Pydio Cells というものを利用する事にしました。選定理由は単にEEICのdavもそうだったというだけですので、割となんでも良いと思います。調べるとowncloudというものもあるようです。

pydio.com

環境構築を行う前に、自分でドメインを取得するか、DDNSサービスの登録をしておきましょう。宅外からアクセスする際に便利です。この辺りの手順に関しては、Webdavの構築方法で調べるよりも、マイクラVPNDDNSを使う方法を検索して、そこから流用してくるのが良さそうです。数の多さはwebでは正義らしいです。

 

Pydio Cellsの環境構築については、基本こちらの公式のドキュメントを参考にしました。

pydio.com

Let's encrypt の登録を前提にしているので、先に済ませるとスムーズです。この辺り構築にかなり苦労した記憶があるのですが、直ぐに思い出せないので思い出し次第追記しておきます。 (2023/12/14追記:確認すると上記の手順の中で自然にSSL化出来るようになっているようです(画像参照)。

ただ、確か最初の一回で何故か成功せず、試行錯誤しているうちにもう一度同じ手順を繰り返すと成功した事を覚えています。「Let's Encryptを前提」というよく分からない言葉は、この試行錯誤で「実はここではSSL化出来なくて、別途行う必要があるのでは?」という疑念が生じていたその記憶だけ残っていたのとサイトの誤読が原因だったようです。申し訳ございません。)

上のサイトの中のConfigurationについてはブラウザ上では行わない事をおすすめします。

 

ここまででWebdavを自宅外からも利用出来るようになったら、いよいよObsidian本体との連携です。基本的にPydio Cellsを前提にしているのでご了承ください。

まず、Obsidianの設定からCore Pluginに向かい、Bookmarksを無効化しておく事をおすすめします。この理由については後述します。

Obsidianのインストール後、Community Pluginに行き、これを有効化したあとRemotely Secure (何故かgithub 上では Remotely Sync をインストールし、有効化します。

設定画面に向かう前に、Pydio Cellsの管理者用コンソールで任意の名前のワークスペースを新規に設定しておきましょう。この理由は後ほど言及します。

Obsidianに戻った後、Remotely Syncの設定項目を入力していきます。


黒塗りの部分は上からhttps://<サーバアドレス>/dav, Pydio Cells のユーザ名とパスワードです。

ここで、Changes The Remote Base Directory について、先程設定したワークスペースの名前に変更します。confirmボタンを押すまで反映されないため注意しておきましょう。Remotely Syncはどうも<サーバアドレス>/davの時点で大元のディレクトリに アクセスされるような状況を想定しているようなのですが、Pydio Cells の場合/davの下にまずワークスペース名が来るので、この設定が必要です。なお、このためワークスペースの直下にそのままファイルが置かれるため、Pydio Cellsを普段使いされる場合はアカウントを分離しておきましょう。

同期のタイミングについては私は以下のように設定しています。

たまに同期に失敗する事があるので、Debugに関してはOnにしておく事をおすすめします。どのファイルで失敗しているのか分かるので対応が容易です。


基本的にはこれだけで同期出来るようになるのですが、一点注意が必要です。どうもRemotely Syncは隠しファイルを同期するかを設定で選べるはずなのですが、何故か.obsidianフォルダ内のbookmarkを管理しているjsonについて同期を試みようとしている形跡がありました。Pydio Cellsは隠しフォルダ/ディレクトリをサポートしていないので、このままだと同期に失敗します。私はBookmarkを無効にし、当該jsonファイルを削除する事で解決としました。

 

以上でローカル環境にデータを置きながらどのデバイスからもノートを編集出来る環境が構築出来ました!お疲れ様です。

この環境でサーバが動作を停止したとしても各ローカル環境のデータは残りますし、逆の復旧も容易です。後はぼちぼち他の媒体からここにデータを移していきましょうかね。

 

ほなまた。