Portalite: マルチリレーバインディングと標準 net.Listener ベースの軽量 Portal Go SDK

先ほど Portalを紹介する中で、私たちは現代のウェブが抱える問題について述べました。AIコーディングツールの登場によって誰もがウェブサイトを作れるようになりましたが、それを世に公開する作業は依然として巨大プラットフォームやクラウドの独占領域にとどまっています。Portalは、ウェブのホスティングとコンテンツ制作を分離し、個人のローカルサービスをエンドツーエンドで暗号化されたリレーを通じて世界中に接続することで、公開する権限を再び個人の手に取り戻すプロジェクトです。
Portaliteの発表
本日、私はPortaliteを発表します。Portaliteは、最小限の依存関係で構築された超軽量Portalクライアントであり、Go SDKでもあります。
Portalが「ウェブをどのように変えていくか」という理念であるなら、Portaliteはその理念を開発者のアプリケーションに取り付ける最も薄い接着剤です。開発者は複雑なクラウド設定やデプロイパイプラインを必要とせず、SDKをインポートして数行のコードを追加するだけで、自身のアプリにポータルのingressを組み込むことができます。アプリが実行された瞬間、ローカルにしか存在しなかったサーバーは、インターネットのどこからでもアクセス可能なパブリックサービスになります。
1. わずか2行のコードで完成するパブリックIngress
Portaliteは、Goの標準インターフェースであるnet.Listenerをサポートします。既存のWebフレームワークやサーバーコードのリスナーを置き換えるだけで、すぐに動作します。
1identity, err := portalite.GenerateIdentity("my-service")
2
3listener, err := portalite.Expose(ctx, portalite.ExposeConfig{
4 Relays: portalite.DefaultRelays(),
5 Identity: identity,
6})
7
8http.Serve(listener, handler)
- ゼロコンフィグ(Zero-config): ポートフォワーディング、固定IP、ファイアウォールのインバウンドルールの設定は一切不要です。
- 標準互換:
http.Server、grpc.Server、Gin、Echo、Chiなど、標準のnet.Listenerを使用するすべてのGoライブラリと100%互換です。
2. 核心:マルチリレー同時バインディング(Multi-Relay Binding)
多くのトンネリングツールは単一のエンドポイントに依存しているため、リレーサーバーが停止するとサービスも同時に切断されます。Portaliteは複数のリレーサーバーに同時に接続して動作します。
- 無停止の障害分離(Failover): 複数のリレーの一部がダウンしたり、ネットワーク遅延が発生したりしても、稼働中の残りのリレーが同一の仮想リスナーを通じてトラフィックを受け続けます。
- 単一障害点(SPOF)の排除: すべてのリレーセッションが同時に切断されない限り、アプリケーションの
Accept()ループは中断されません。 - エンドツーエンド暗号化(E2EE): トラフィックは暗号化された状態で中継されるため、リレーサーバーはデータを覗き見たり改ざんしたりすることができません。
- 自動再接続および自己修復(Self-Healing): 一時的なネットワーク切断やリレーの再起動が発生しても、バックグラウンドでセッションとトークンを自動的に再ネゴシエーションし、接続を回復します。
3. CLIコマンド一行で即座に利用
Goコードを書かない場合や迅速なテストが必要な場合は、CLIでポート番号を渡すだけで済みます。
1$ go install gosuda.org/portalite/cmd/portalite@latest && portalite expose --name "my-service" 3000
2URL https://my-service.rly.best
3URL https://my-service.s-h.day
4
コマンドを実行すると直ちに複数のリレーURLが発行され、すぐに外部からアクセス可能な状態になります。
4. 軽量でありながら強力な機能
- 最小限の依存関係: サードパーティ製の依存関係を削減したことで、バイナリは軽量になり、ビルドも高速です。
- TLS & UDPサポート: HTTP/gRPCのようなTLSトラフィックはもちろん、QUICデータグラムのバックホールを通じて、ゲームサーバーのようなUDPサービスも容易に公開できます。
はじめに
- GitHubリポジトリ: https://github.com/gosuda/portalite
- Goパッケージ:
go get gosuda.org/portalite