2025/05/23 01:17 Building Twice: A clone of Once by 37signals

やあ、ロボ子!今日はOnceとTwiceについて話すのじゃ。

博士、こんにちは。OnceとTwice、興味深いテーマですね。よろしくお願いします。

まずはOnceじゃ。Ruby Zagrebの人たちがCampfireを買って、37signalsのRailsアプリの作り方を調べたそうじゃ。

購入メールのシェルコマンドを実行して、Dockerコンテナ上でCampfireを起動したんですね。

そうじゃ。シェルスクリプトを解析して、バイナリをリバースエンジニアリングしたら、Go言語で書かれたCLIツールだとわかったらしいぞ。

stringsコマンドを使ったんですね。Goのメタデータからアプリの構造やメソッドシグネチャを特定したと。

さすがロボ子、飲み込みが早い!重要なURLも3つ見つけたみたいじゃ。 `https://auth.once.com/install/`、`https://auth.once.com/verify/%d`、`registry.once.com`じゃ。

ライセンスキーがDockerレジストリの認証トークンとして使われていると推測して、`docker login`で検証したんですね。

その通り!Onceの構成要素は、認証サーバー、プライベートDockerレジストリ、CLIアプリの3つじゃ。

認証サーバーはトークン検証やCLIバイナリの配布、ライセンスキーの検査を行うんですね。DockerレジストリはDockerイメージの保存と配布を担当し、CLIアプリはDockerのインストールからコンテナ管理まで行うと。

ふむ。そして、ここからが面白いところじゃ。Onceのクローンプロジェクトとして、Twiceが開発されたのじゃ!

Twiceですか。Onceのセットアップ方法を学び、アプリの配布システムを構築することが目的だそうですね。

そうじゃ。CLIアプリを中心に開発して、Go言語とcobraライブラリを使ったらしいぞ。最初はTUIを実装したけど、開発速度を優先してputsベースのCLIに変更したみたいじゃな。

Dockerがインストールされているかの確認や、APIクライアントの作成、Dockerとの連携などを実装したんですね。

認証アプリとDockerレジストリも構築して、DockerレジストリにはCNCF Registryを使ったそうじゃ。認証サーバーはHTTP Basic認証でユーザーのメールとトークンを受け取り、JWTを返す。

JWTには、ユーザーが実行できるアクションを定義するアクセスのリストが含まれているんですね。開発者がイメージをプッシュできるように、ユーザータイプを追加したと。

Rails 8の認証ジェネレーターを使って、顧客、開発者、製品、ライセンスを管理するUIを追加したのもポイントじゃな。

Twiceの設計上の決定として、ドメイン名トラッキングは不要と判断して実装せず、バックアップと管理コマンドは将来的に実装する可能性があるものの、アプリの配布には不要なため省略したんですね。

Kamalのようなプロキシを使って、複数のアプリを同じサーバー上で実行できるようにすることも検討しているみたいじゃ。

複数のアプリをサポートするために、CLIは設定ファイルを保持しないようにしたんですね。

Go言語での開発を楽しんだみたいじゃぞ。37signalsのアプリ配布システムは非常に洗練されているとも言っておる。

OnceとTwice、とても勉強になりました。博士、ありがとうございました。

どういたしまして。最後に一つ、ロボ子。Twiceを作るなら、Three timesの方がもっと面白いと思わないか?

博士、それはただの語呂合わせですね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。