Ubuntu Weekly Recipe

第537回Standard Notesでメモを取る

今回はEnd-to-Endの暗号化に対応し、拡張機能も備えたFLOSSなメモサービスであるStandard Notesを紹介します。

シンプルなWebベースのメモサービス「Standard Notes」

Ubuntuにおけるメモツールとしては直近だと第530回でQOwnNotesが、第536回でJoplinが紹介されていました。これらはいずれも実際にメモを保存する場所としてNextcloudなどの外部サービスやローカルストレージを利用し、そのデスクトップクライアントとして動作するタイプのアプリケーションです。よって利用するためにはクライアントをインストールする必要があります。

たとえば保存先がNextcloudの場合、NextcloudそのものにWeb UIがあるためWebブラウザーがあればメモを編集することも可能です。ただし元々はファイル共有のためのサービスであるため、単純なメモサービスとして使うには不向きなUIとなっています。

Evernote程は求めないもののもう少しシンプルなWebベースのメモサービスがほしい場合もあることでしょう。今回紹介するStandard Notesは、まさしくそのような用途向けのサービスです。

  • End-to-Endの暗号化に対応しているため、経路はもちろんサーバー側に保存しているデータも暗号化され、利用者しか復号できません。

  • Webブラウザーはもちろんモバイルも含むマルチプラットフォームなクライアントが用意されています。デバイス間の同期やデバイス数に制限はありません。オフラインでも利用可能です。

  • サーバーもクライアントもソースコードもFLOSSなライセンス(GPLv3やAGPLv3など)であるため、オンプレミスでの運用も可能です。

ちなみに暗号化の鍵はパスワードからPBKDF2/AES-256で生成された鍵を用います。パスワードは利用者の頭の中やパスワードマネージャーにしか保存されていないため、パスワードを忘れるとサーバー側では復旧できません。パスワードの変更にもひと手間必要になります。

Standard Notesでは有償のExtendedサービスに登録することで、拡張機能が有効化され、さらに多くの機能を利用できます。

  • プレビュー付きのMarkdownエディターやVimキーバインディングなど、UIをカスタマイズできます。
  • 2要素認証を使えるようになります。
  • DropboxやGoogle Drive、OneDriveへのバックアップ、メールによるデイリーバックアップなどを有効化できます。
  • Listedを利用したノートの共有やブログの作成ができます。
  • 拡張機能を自作できます

なお、現在のStandard Notesはシンプルなテキスト以外のアップロードには対応していません。もちろん画像もアップロードできません。拡張機能とMarkdownを利用すれば、リッチテキストライクに編集することは可能ではあるものの、画像は別の場所にアップロードしておく必要があります。このためEvernoteの完全な代替とはなりえません

Standard Notesはソフトウェアの持続性も謳っています。さまざまなサービスやデータフォーマットが生まれては消えるこの時代に、100年使えるメモサービスを目指しているのです。このため機能は最低限にとどめ、シンプルなメモサービスであることを心がけています。

また、WebサービスとしてのStandard Notesがいつ消滅しても大丈夫なようにGitHub上でのソースコードの公開はもちろんのこと、ユーザーが暗号化されたバックアップデータからパスワードを使って復元する仕組みも用意しています。

とりあえず使ってみる

Standard NotesはWebブラウザーさえあれば公式サイトによるWeb版をすぐに使い始められます。初回アクセス時はアカウントの登録画面が表示されるものの、データをサーバーに保存せず試してみるだけならアカウントの登録は不要です。

図1 とりあえず使ってみるだけならアカウントは不要
画像

縦3分割のUIで、左からタグリスト、メモリスト、メモ本文となっています。画面上の太字の部分(OptionsやEditorなど)をクリックすることで、メモの状態や表示を変更できます。シンプルなUIなので、迷うことはないでしょう。

左下の「Account」をクリックすることでアカウントの登録画面が表示されます。登録に必要なのはメールアドレスとそれなりに頑強なパスワードです。メモデータはパスワードからPBKDF2/AES-256を用いた生成された鍵によって暗号化されます。

Standard Notesには各種OS向けのネイティブクライアントも提供されています。たとえばLinux向けのクライアント第536回で紹介されているJoplinと同じAppImage形式のパッケージです。このためUbuntuデスクトップ側は特に何かをインストールする必要はありません。ダウンロードしたイメージの使い方もJoplinと同じで、実行権限を付けて実行するだけです。

AppImageはFUSEでマウント可能なディスクイメージと、そのイメージをマウントするためのELFバイナリをひとつにまとめたフォーマットです。実行すると/tmp/.mount_FOO以下にイメージをマウントして、そのディレクトリにあるAppRunを実行します。

図2 メインのUIはWeb版とまったく同じ
画像

ネィティブクライアントの特徴のひとつがローカルへの自動バックアップ機能です。初期状態だと~/Standard Notes Backups/に暗号化済みデータをJSON形式で保存します。これは画面左下の「Account」から「Data Backups」を選んだときに保存される暗号化されたバックアップデータと同じです。つまりこのファイルとパスワードさえあれば、別のアカウントにメモの内容をインポートすることも可能になっています。

拡張機能を有効化するためには、サイトにおいてExtendedユーザーとして登録する必要があります。プランは年34.99ドル、5年99ドル、月7.99ドルの3種類です。クレジットカードやPayPalを利用できます。支払い時に登録したメールアドレス宛にアクティベーションコードが届きますので、画面の左下にある「Extensions」からコードを入力しましょう。これで拡張機能をインストールできます。

図3 拡張機能の登録画面
画像

もし事前に拡張機能をいくつか試してみたかったら、拡張機能サイトにある個々の機能のデモページにアクセスすると良いでしょう。

図4 Advanced Markdown Editorの例
画像

Ubuntuサーバー上にデプロイしてみる

Standard Notesはサーバー側とWeb版・モバイル版のクライアントも含めてすべてGitHubでソースコードが公開されています。ソースコードが公開されているということは、つまりうまくやれば自分でサービスをデプロイできる可能性がゼロではないと言えなくもないのです。幸い、Standard Notesの場合はここまで持って回った言い回しをしなくても、素直に動いてくれます。

Web版のStandard Notesはふたつのコンポーネントから構成されています。

  • クライアント側(standardnotes/web)

    • Web UIを提供するサービス
    • Ruby・Node.jsとそのパッケージ管理ツールを使う
  • サーバー側(standardfile/ruby-server)

    • クライアントとデータのやりとりを行うサービス
    • Ruby・Node.jsとそのパッケージ管理ツールを使う
    • データベースとしてMySQLを使用する

サーバー側はEnd-to-Endの暗号化を実現するStandard Fileプロトコルの参照実装という扱いです。

クライアント側では任意のStandard Fileサーバーを選択できます。このため次のような組み合わせが可能です。

  1. クライアント側・サーバー側ともに公式サービスを使う(上記で説明した方法)
  2. クライアント側のみ自前のマシンを使い、サーバー側は公式サービスを使う
  3. クライアント側は公式サービスを使い、サーバー側は自前のマシンを使う
  4. クライアント側・サーバー側ともに自前のマシンを使う

今回は両方共自前のマシンにインストールしてみましょう。ちなみに、どちらのリポジトリにもDockerファイルならびにDocker Composeのファイルが用意されているので、実はデプロイするだけならあまり考えることはありません。ここはひとつ、Dockerを使わずに手作業でインストールしてみます。

サーバー側のインストール

まずはStandard Fileサーバーを用意します。必要なパッケージはRuby関連とNode.js関連、それにMySQL関連です。Standard Fileの場合、Rubyそのものはパッケージでもかまわないのですが、Ruby関連のパッケージはBundlerを使ってソフトウェアに合わせてインストールしたほうが楽でしょう。なおBundlerそのものもBundlerで最新版をインストールしておきます。

$ sudo apt install ruby-dev ruby-bundler libxml2-dev \
    libmysqlclient-dev mysql-server
$ sudo gem install bundler
$ bundle --version
Bundler version 1.16.4

Node.js関連はリポジトリからnodejsパッケージをインストールする方法もありますが、実は最近だとNode Sourceが作成しているsnapパッケージを使ったほうがかんたんです。サポートしているバージョンをそれぞれchannelとして提供しているので、必要に応じて切り替えるといいでしょう。npmコマンドもセットで付いてきますので、npmコマンドを使ってbowerもインストールしておきます。

$ sudo snap install --channel=10/stable --classic node
$ node --version
v10.10.0
$ npm --version
6.4.1
$ sudo npm install bower -g

あとはソースコードをダウンロードして必要なRuby/Node.jsパッケージをインストールします。

$ git clone https://github.com/standardfile/ruby-server.git
$ cd ruby-server/
$ bundle install
$ bower install

次に基本設定を.envファイルに記述します。

RAILS_ENV=production
SECRET_KEY_BASE=(bundle exec rake secretの結果を貼り付け)
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=standard_file
DB_USERNAME=root
DB_PASSWORD=

あとはデータベースを作成・マイグレートしてサービスを立ち上げます。MySQLサーバーにrootでアクセスするためにsudoを付けていますが、このあたりは環境に合わせて変更してください。

$ sudo rails db:create db:migrate
$ sudo rails s

ここまでで「http://localhost:3000」からStandard Fileにアクセスできます。

クライアント側のインストール

クライアント側も、インストールするパッケージはMySQLが不要なことを除いてサーバー側と同じです。

$ sudo apt install ruby-dev ruby-bundler libxml2-dev
$ sudo gem install bundler
$ bundle --version
Bundler version 1.16.4
$ sudo snap install --channel=10/stable --classic node
$ node --version
v10.10.0
$ npm --version
6.4.1
$ sudo npm install bower -g

こちらもソースコードを取得して、必要な依存パッケージ群をインストールしてしまいましょう。

$ git clone https://github.com/standardnotes/web.git
$ cd web/
$ bundle install
$ npm install
$ bundle exec rake bower:install
$ git submodule update --init --force --remote

最後のコマンドでは拡張機能関係をインストールしています。これがないとUIに「Extensions」が表示されず、拡張機能を有効化できません。

次に基本設定を.envファイルに記述します。

PORT=3030
EXTENSIONS_MANAGER_LOCATION=extensions/extensions-manager/dist/index.html
BATCH_MANAGER_LOCATION=extensions/batch-manager/dist/index.min.html
ADVANCED_MARKDOWN_EDITOR_LOCATION=extensions/advanced-markdown-editor/index.html
SF_DEFAULT_SERVER=http://192.168.0.58:3000

SF_DEFAULT_SERVERにサーバー側のURLを指定します。このURLはWeb UIを表示するマシンから到達可能なURLでないといけません。またサーバー側・クライアント側ともに何も設定しないと3000番ポートを使おうとします。同じマシンでクライアントとサーバーを動かしたい場合は、どちらかに環境変数PORTから、異なるポート番号を指定しましょう。

最後にnpmのプロダクションビルドを行い、Railsサーバーを立ち上げます。

$ npm run build
$ rails s

ここまでで「http://localhost:3030」からStandard Notesにアクセスできるようになりました。実際にアクセスしてみましょう。

図5 自サーバーでのStandard Notes
画像

アカウント作成時・ログイン時の「Advanced Optsions」をクリックして表示される「Sync Server Domain」が先ほど構築したStandard FileサーバーのURLになっていることを確認しておきましょう。SF_DEFAULT_SERVERの値がここに表示されます。また、URLを「https://sync.standardnotes.org」に変更すれば、公式のStandard Fileサーバーを使います。

他の部分の使い方は、当然のことながら公式のそれと同じです。ちなみに拡張機能を使うためには、有償のExtendedユーザーにならなければいけない点も一緒です。もちろんExtendedユーザーとして取得したアクティベーションコードは、自前でインストールしたシステムでも有効です。

おすすめ記事

記事・ニュース一覧