Notionほど高機能はいらなかったのでJoplin をセルフホストで使うことにした

f:id:timtoronto634:20220316085201p:plain

サマリ

notionが自分の求める要件には合わなかったので、joplin というメモアプリと nextcloud を使って軽快にメモできる環境を作りました。 作り方は、基本的に公式ページに従いつつ、自宅LAN内で同期が可能なように調整。 要件ばっちり。動作は軽く、マルチデバイスで同期もできて最高!

Notion が合わなかった理由

最近はNotion が流行りで、私も少しの間使っていました。ただ、私個人はNotionがとても使いづらく感じてました

そもそもはEvernoteをつかってたのですが、2021末あたりで大規模な変更があったようで、動作が大変遅くなり、友人のおすすめもあり、乗り換え先としてNotionを選びました。1年くらい使って、私には使い続けられないと思い、乗り換えを決意しました。

私に合わなかった理由は以下になります

  1. アプリの動作が遅く、同期のタイミングによって編集履歴が消える
  2. web editorで編集中の文字に下線が出たり、ショートカットがかぶっているのか、意図しない挙動が複数ある。
  3. 表の全選択など、意図した挙動ができない
  4. 基本、単純なメモアプリがほしいだけであり、多機能である必要がなく、これらのデメリットを覆すほどのメリットがない。

メモアプリに求めるもの

メモアプリに私が求めるものは、

  1. マルチデバイスで同期できる
  2. 動作が軽い

がメインです。 敷いて言えば、

3.簡単な表など、単純なデータを保持できる

などもあれば嬉しいですが、データがでかい時はgoogle spreadsheet を使うので、必須ではないです。

1のマルチデバイスの同期はNotionでできてますが、2の動作の軽さもとても大事です。 全てのソフトウェアは動作が軽いに越したことは無いのですが、そうではなく。

特にメモアプリは、思いついたことをすぐに記録したい、思い出したいことをすぐに確認したい、という要求が強く、動作の軽さは他のアプリに比べて重要です。

また、マルチデバイスの同期は、大事だけれど、そんなに頻繁でなくていいです。 1日1,2 回 同期できればOK。複数の端末を何度も行き来することはそうないからです。なんなら手動同期だって構わない。

一言で言えば、同期可能なシンプルなメモアプリがあればいい、となります。

Notionは基本の動作が遅く感じられ、私は使わない機能がたくさんついてるので、合わないと感じて、別のアプリに乗り換えました。

なお、移行に際して、Notionで書いたメモがmarkdownでエクスポートできたのは非常に助かりました。(そもそもNotionを使い始める際に重視したポイントではあります)

Joplin + nextcloud でメモアプリ環境を構築

なに、それ?

代替としてみつけたのが、Joplinというメモアプリでした。

Joplin はOSSのソフトウェアで、すでにAndroid, Desktop など複数クライアントのエディタがあります。

ちなみにJoplinを運用する会社もあります。この会社のクラウドを使おうと思うとたしか月額500円くらいかかります。

もちろんOSSなので、ローカルにデータを保存して使用する文には無料です。

メモのページはmarkdown で書け、余計な拡張はありません。 試しに使ってみたら、サクサク動きました。

Androidアプリ版では、編集モードと閲覧モードが分かれており、編集モードでは単純にテキストを編集することしかできません。 編集が終わって閲覧モードに戻ると、初めてレンダリングされます。

編集中にmarkdownの記法が間違っていたりしても気づけないというのはたまにキズですが、markdown をリッチに活用してるわけではないので、そんなに間違えないです。

ちなみに、これはAndroidアプリ版だけの話で、Descktopアプリでは編集中にスタイルが適用されるので、快適に編集できます。

nextcloud

Joplinはクラウド同期もできる無料メモアプリですが、クラウド同期を利用する場合はクラウドサービス自体は無料ではありません。

そこで、OSSのファイルサーバーであるnextcloud を活用します。 Joplinは同期先を選ぶことができ、セルフホストしたサーバーがあれば、それを使って同期も可能です。

nextcloudでサーバーを自分で建てれば、Joplinを複数のデバイスに入れて、デバイス間でのデータの同期が可能です。

ちなみに、後で聞いた話ですが、nextcloud は大学院時代の同期も使ってるらしく、結構メジャーみたいですね

nextcloudを立てる

さて、実際に複数デバイスでデータを同期しながら使うメモアプリを用意する際、大変だったのはサーバーの設定の方でした

nextcloudは ローカル環境にdockerで立てることにしました。 (余談ですが、最初はEC2環境にapache等をインストールして試そうしたのですが、たくさん苦悩があり、挫折しました。)

nextcloudの公式イメージのサイトにdocker-composeで構成する場合の例があったので参考にします。 デフォルトタグのnextcloudイメージにはapacheが入っていて、サーバーとしてそのまま使えます。

docker-composeはDBにmariaDBを使う構成になっています。 そのまま docker-compose up するとエラーになったので、このブログの記事を参考に デバッグしつつ、最終的には以下の形になりました

version: '3'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    command:
      - "--transaction-isolation=READ-COMMITTED"
      - "--binlog-format=ROW"
      - "--innodb_read_only_compressed=OFF"
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=
      - MYSQL_USER=

  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=
      - MYSQL_USER=

これを docker-compose up で立ち上げると、 localhost:8080 でnextcloudのページが開きます。

最初はadminアカウントを作成するように誘導されると思います。 ログイン後、adminではない同期用の普通のユーザーをadmin画面から作成しておきます。

Joplinから接続する

まずは小さな一歩から。

nextcloudを立てたホストにJoplinをいれて、localhost経由で同期できるようにします。

アプリはインストールするだけで使えるので、ホストに応じたアプリケーションをインストールします。

Tools > Options > Synchronization から各種の設定を行えます。まずはアプリの同期先としてWebDAVを選択します。

webDAVとは、HTTP上でファイルのやりとりを可能にする、昔からある仕組みのようです。クラウドとの違いは説明できないので、別の機会にしっかり勉強したいです。

localhostに開いてあるnextcloudの画面から、webDAVのアドレスを生成します。私の画面だと左下のSettingsから開けました。

f:id:timtoronto634:20220316084652p:plain
画面左下のwebDAVを生成する画面

表示してあるWebDAVアドレスをJoplinの設定に打ちます。Joplin上でディレクトリを作成しているなら、アドレスの末尾にディレクトリの名前をいれるのを忘れずに(そのままファイルシステムのようになってます)

nextcloudの同期用に作ったユーザーのユーザー名、パスワードを入力します

疎通をチェックするボタンもあるので、確認できたら同期します

ちなみに、調べている時にみつけたブログにjoplinのプラグインをnextcloudに入れる手順がかいてあったのですが、このプラグインは現在メンテされておらず*1、nextcloudからも使えないようでした。使わなくても動いてるので、おそらく不要だったのだと思ってます。

別のデバイスから接続する

ここまでで、同じマシン内での同期を可能にしました。 次は自宅LAN内からの動機を可能にします。

nextcloudのイメージをupした時点でapcheが動いてるので、portは開いています。

外部からアクセスがあったりしないか不安だったのですが、apacheを立てるだけでは、外部ネットワークからアクセスできる状態にはならないですね。

仮に外部からアクセスが来ても、ルーターは次にどこにアクセスをつなげばいいのかわからないので、アクセスの来ようがないです。

ただし、ルーターの方でわざわざフォワーディング設定をしてる人などは注意です。

閑話休題。 nextcloudをたてたマシンのlocal ip (192.xxx.x.x)を確認しておきます。consoleで ip addr など叩くと見れます。

スマホの方を設定していきます。まずはともあれスマホにJoplinをインストールします

PCの時と同様に、Joplinの同期先の設定画面を開き、webDAVのURL欄で、localhostをマシンlocal ipに置き換えます。ユーザー名パスワードも入れます。

マシンに戻ります。nextcloudコンテナ内のconfig.php に書かれている trusted_domainsに、localhostではなくlocal ipを指定します。

  'trusted_domains' => 
  array (
    0 => '192.xxx.x.x:8080'
  ),

なお、マシンのJoplinの同期先はlocalhostと記載されているはずで、この設定を行うと動機ができなくなります。こちらもlocal ip アドレスに置き換えておきましょう。

ここで、trusted_domainsはリスト構造に見えるので、追加も試したのですが、私の環境ではどうもうまく動かなかったです。 phpapacheもわかってないので、これから理解していきたいです。

以上で、自宅LAN内でマルチデバイスの同期可能なメモアプリが使えるようになりました

感想

普段触らないapachemariaDBに触れたのが楽しかったです。

あと、WebDAVという初耳の技術を知りました。技術には歴史がありますが、WebDAVクラウドの歴史に関係あると思うので、クラウドについても知りたくなりました。

そして何より、サクサク軽快なメモアプリが使えるようになったので最高です!

宿題

いくつか手は加えましたが、大枠は公式サイトの通りに動かしただけなので、今後は以下の改善を入れていきたいです

  • DBの自動バックアップ
  • データの暗号化
  • local IP の固定 or フォワーディング
  • trusted_domains にlocalhostとlocal ipと、両方指定
  • VPNで外部からも同期できるようにする

おわりに

こんな技術あるよーとか、感想とか、コメントあると嬉しいですmm

*1:リンクをメモに残し忘れました。repositoryも1年前、issueにもメンテされてないよ、って記述があったと記憶してます