ONCE: Writebookのソースコードを調べた

once.com

Writebookについて

Writebookは、https://37signals.com/books のようなオンラインブックを構築できるツールです。

これは37signalsのONCEというモダンなパッケージインストール型ソフトウェアを再考したものの一部で、37signalsのポッドキャストでたびたびコンセプトが言及されています*1。ブログ世代としてはMovable Typeを彷彿させます。

Writebookを無料にしている理由は、これをゲートウェイとしてCampfireにも流れていくことを期待しているようです。

セットアップ

https://once.com/writebook にアクセスし、登録を行うと、ライセンスキーとインストールコマンドが書かれたメールが送られてきます。

セットアップは、手順に従ってダウンロードしたonceコマンドを使用して行います。このonceコマンドは、once.com からダウンロードできるバイナリで、Goで書かれています(nmコマンドでシンボルを確認)。

また、メール内にRailsアプリのソースコードがzipファイルのリンクとして含まれています。私のフォロワーたちは、単にソースコードを入手して「達人たちが書いたお手本コード」としてコードリーディングをしていました。

フロントエンド

Writebookのフロントエンドには、turboとstimulusが使用されており、実装はJavaScriptで行われています(TypeScriptではありません)。また、tailwind等は使用されていません。@rails/request.jsを使用して、AJAXリクエストでX-CSRF-Tokenなどの必要なヘッダーを送信する処理があります。

Markdownエディタ

WritebookのMarkdownエディタの詳細は、vendor/javascript/house.min.jsにあります。特にライブラリを使わずにCustom ElementsとVanillaJSで書かれています。中身を見るとbasecamp/trixと設計が同じなので、単にミニファイされているだけかもしれません。

データベースとジョブ

Writebookはシングルインスタンスでの動作が前提なので、データベースは本番環境でもSQLiteを使用しています。また、DBクライアントはdockerコンテナ内にapt-get installでredisと共にインストールされます。

ジョブの処理は、RedisとResque-poolを使用して行われます。SolidQueueではありませんでした。

自動アップデート

Writebookは、1日1回Onceのサーバーに問い合わせて、自動でダウンロードして更新する機能があります。停止したい場合は設定で停止できます。

アプリケーション実装

Writebookのアプリケーションでは、ActiveSupport::CurrentAttributesを使用して、リクエストごとにグローバルステートを管理しアクセスします(current.rb)。

また、アップロードした画像はActiveStorageでローカルディスクに保存されます。バックアップはonceコマンドで行われるようですが、Dockerで動いているのでマウントはどうなっているのでしょうか。