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で動いているのでマウントはどうなっているのでしょうか。