Vercelがついにポート番号を廃止(Portlessの衝撃)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00これはPortless。Agent Browser、JSON Render、Skillsを
00:00:05世に送り出したVersil Labsによる、localhostのポート番号を
00:00:10固定の名前付きホストに置き換えるCLIツールです。人間やAIエージェントが
00:00:15常に正しい場所にアクセスでき、競合を防ぎます。仕組みはどうなっているのか、
00:00:20システムに影響はないのか? 登録ボタンを押して、詳しく見ていきましょう。
00:00:21簡単な例を使って、Portlessの使い方を説明します。
00:00:26今、ポート3001番でプロジェクトが動いています。
00:00:30もしこれをバックグラウンドで動かしていることを完全に忘れて、
00:00:33似たようなポートを使う別のプロジェクトを動かそうとすると、
00:00:37「address is already in use(アドレスは既に使用中です)」というエラーが出ます。
00:00:40Portlessはこの問題を解決するために設計されました。
00:00:44別々のタブで、プロジェクトごとに異なるエージェントを動かしていて、
00:00:48この問題にぶつかったと想像してみてください。
00:00:50エージェントが修正することも可能ですが、最初からポートが常に
00:00:55空いている状態にして、こうした事態を防ぐのが理想的です。
00:00:58Portlessをインストールして、Portlessプロキシを起動した状態で、
00:01:01「portless」に続けて、任意のホスト名(ここではxdlapi)を入力します。
00:01:06ホスト名は何でも構いません。
00:01:08次に実行したいコマンド(例:bun run devapi)を入力します。
00:01:12Enterを押すと、4000番台からランダムに空きポートを探し出します。
00:01:16この範囲なら、他のプログラムと競合する可能性が低いからです。
00:01:20そして、設定したホスト名の「.localhost:1355」でアプリを公開します。
00:01:25デフォルトの1355は、Portlessの「less」にちなんでいます。お分かりですね?
00:01:30ここをクリックすると、アプリが正常に動作しているのが分かります。
00:01:34別のアプリでも全く同じことをしてみると、
00:01:37今度は別の空きポートが見つかり、指定したホスト名が使われます。
00:01:40ですが、末尾の番号は常に同じままです。
00:01:42実は、必要であればこの番号を変えることもできます。
00:01:44ポート80に変更すれば、コロンと番号を完全に省略できます。
00:01:49sudoを使いポート80でPortlessプロキシを起動し、
00:01:53同様にsudoでPortlessプロセスを開始すれば、
00:01:55「サブドメイン.localhost」だけでアクセス可能になります。
00:01:59さらに、ポート80の使用に加えて、HTTPSフラグを使えば
00:02:03HTTPSサポートも受けることができます。
00:02:08ただしViteを使っている場合は、portキーにポート変数を設定し、
00:02:13hostsもこの値に設定する必要があります。
00:02:15その理由は、動画の後半で説明します。
00:02:17Portlessには他にも多くのオプションがあります。
00:02:21デバッグ用にプロキシをフォアグラウンドで実行したり、
00:02:25デバッグや緊急回避策として、プロキシなしでコマンドを実行したりできます。
00:02:30でも、なぜ毎回ランダムなポート番号を使うのでしょうか?
00:02:33そして、なぜプロキシが必要なのでしょうか?
00:02:35その仕組みを掘り下げていきましょう。
00:02:362つのプロセスについて説明します。
00:02:39ターミナルでメインのPortlessコマンドを実行した時の動きと、
00:02:42ブラウザでPortlessのURLを開いた時の動きです。
00:02:46まず、Portlessコマンドを実行した時(ここでは
00:02:49myappというホスト名で bun start を実行する場合)ですが、
00:02:52最初にホスト名とコマンドが抽出されます。
00:02:56次にプロキシが動いているかを確認し、
00:02:59動いていなければ起動します。
00:03:01ただし注意点があります。プロキシのポートは自由に変えられますが、
00:03:06デフォルトは1355です。
00:03:08もし1024より小さい値を設定した場合、
00:03:12実行前に確認を求められます。
00:03:15それ以上の番号であれば、自動的に実行されます。
00:03:19次に、4000から4999の間で空きポートを見つけます。
00:03:25検索を速めるために、ポートはランダムに選ばれます。
00:03:29連番だと、多くのプロセスが動いている場合に1つずつ
00:03:33チェックする必要があり、時間がかかる可能性があるからです。
00:03:35ポートが見つかると、その詳細がroot storeのJSONファイルに記録されます。
00:03:40そして、そのポートでコマンドを実行し、ポート番号を環境変数に追加します。
00:03:47これはほとんどのJavaScriptアプリケーションからアクセス可能です。
00:03:50さて、こちらの部分に注目してください。
00:03:52ブラウザでPortlessのURL(ここではmyapp)にアクセスすると、
00:03:56デフォルトポートの場合は1355番になります。
00:04:00DNS解決が行われ、プロキシへのTCP接続が作成されます。
00:04:06プロキシはホスト名(myapp)を抽出し、
00:04:09root JSONファイルを参照してアプリのポートを特定します。
00:04:15正しいポート番号が分かると、リクエストを実際のアプリに転送します。
00:04:21アプリからのレスポンスはプロキシを経由してブラウザに戻ります。
00:04:26ブラウザは1355番からのレスポンスを待っており、
00:04:30プロキシがランダムに割り当てた番号からの直接の返答は想定していないからです。
00:04:35これはWebSocketでも魔法のように機能します。
00:04:38週末のプロジェクトにしては、非常に素晴らしい出来栄えです。
00:04:40ただし、ViteのようなNext.js以外のプロジェクトで使うと問題が起きるかもしれません。
00:04:47まず、固定ではなくポート変数に割り当てられたランダムな番号を使うため、
00:04:52アプリがそのポートで動作することを確認する必要があります。
00:04:56そうでないとプロキシがどこへ転送すべきか分かりません。
00:05:00また、Viteなどのバンドラーでは、hostキーを追加してこの値を設定する必要があります。
00:05:06認識されないオリジンからのリクエストを拒否する設定を無効にするためです。
00:05:10allowed hostキーを色々試してみましたが、うまくいきませんでした。
00:05:16この方法は少し強引に見えるかもしれませんが、
00:05:19ローカルで実行している分には、何も心配することはありません。
00:05:22Vercel Labsの他のプロジェクトと同様、Portlessも更新され続けるので、
00:05:26こうした点は将来的に改善されていくでしょう。
00:05:30Windowsのサポートなども同様です。
00:05:32Vercel Labsといえば、Agent Browserをまだ試していないなら、
00:05:36エージェントがブラウザとやり取りする最高の方法です。
00:05:39次の動画で詳しく紹介しています。

Key Takeaway

Portlessは、開発者がlocalhostの煩雑なポート管理から解放され、AIエージェントや人間が常に固定のホスト名でローカル環境にアクセスできるようにする革新的なプロキシツールです。

Highlights

Vercel Labsが開発したPortlessは、localhostのポート番号を名前付きホストに置き換える画期的なCLIツールです。

ランダムな空きポート(4000-4999番台)を自動割り当てすることで、開発時のポート競合エラーを根本から防ぎます。

プロキシ経由でリクエストを転送する仕組みにより、ブラウザからは常に一貫したURLで各プロジェクトにアクセス可能です。

sudo権限を利用してポート80を使用すれば、コロン抜きの「サブドメイン.localhost」という形式で接続できます。

HTTPSフラグによるセキュアな通信のサポートや、WebSocketへの対応も標準で備わっています。

ViteなどのNext.js以外のプロジェクトでも、環境変数やホスト設定を調整することで柔軟に利用可能です。

Timeline

Portlessの概要と解決する課題

PortlessはVercel Labsによって開発された、localhostのポート番号を固定の名前付きホストに変換するCLIツールです。開発現場で頻発する「address is already in use」というポート競合エラーを解消するために設計されました。特に複数のAIエージェントを別々のプロジェクトで稼働させている場合、ポート番号の衝突は作業の中断を招く大きなストレスとなります。このツールを導入することで、人間もエージェントも常に正しい場所にアクセスできる環境が整います。初期設定のデモンストレーションを通じて、いかに簡単に導入できるかが強調されています。

基本的な使い方とポート割り当ての仕組み

Portlessの起動は非常にシンプルで、プロキシを立ち上げた後に「portless [ホスト名] [実行コマンド]」を入力するだけです。実行すると、システムは4000番台からランダムな空きポートを自動的に探し出し、競合のリスクを最小限に抑えます。公開されるURLはデフォルトで「ホスト名.localhost:1355」となり、末尾の1355はツールの名称である「less」に由来しています。別のアプリを起動した際も、内部ポートは変わりますがブラウザからアクセスするポート番号は常に一定に保たれます。これにより、ブックマークやエージェントの設定を書き換える手間がなくなります。

詳細な設定とHTTPSサポート

さらに高度な利用方法として、ポート番号を完全に省略してアクセスする設定も紹介されています。sudo権限を用いてプロキシをポート80で起動すれば、「myapp.localhost」のようなスッキリとしたURLでの開発が可能になります。また、HTTPSフラグを使用することで、ローカル環境でありながらセキュアな通信をエミュレートすることもできます。デバッグ用のオプションも充実しており、プロキシをフォアグラウンドで実行してログを確認したり、緊急時にプロキシを介さず直接実行したりすることも可能です。ユーザーのニーズに合わせて、柔軟な開発環境を構築できる点が大きな魅力です。

プロキシの内部動作と通信のフロー

Portlessの内部では、メインのCLIコマンドとバックグラウンドプロキシの2つのプロセスが連携して動作しています。コマンド実行時にホスト名とポートの関係がroot storeのJSONファイルに記録され、環境変数としてアプリに渡されます。ブラウザからリクエストが来ると、プロキシがこのJSONファイルを参照して適切な内部ポートへトラフィックを転送する仕組みです。このリバースプロキシ方式により、ブラウザは常に1355番(または設定したポート)からの応答を受け取ることが保証されます。WebSocket通信においてもこの魔法のような転送処理は有効であり、リアルタイム性が求められるアプリでも問題なく動作します。

Viteでの注意点と将来の展望

Next.js以外のフレームワーク、特にViteを使用する場合にはいくつか注意すべき設定ポイントがあります。Viteはセキュリティ上の理由で認識されないオリジンからのリクエストを拒否するため、hostキーを適切に設定してこの制限を回避する必要があります。具体的にはポート変数を動的に受け取り、それをViteの設定に反映させる「少し強引な」手法が紹介されていますが、ローカル開発においては安全であると説明されています。Vercel Labsは今後もこのプロジェクトを更新し続け、Windows対応の改善なども進めていく予定です。最後に、同チームが開発したAgent Browserなど、他のAI関連ツールについても言及し動画を締めくくっています。

Community Posts

View all posts