ローカルポートをシンプルにインターネットに公開する方法
よくある場面です。ローカルマシンでバックエンドを起動し、StripeやTelegramのような外部サービスとの統合を設定した後、webhookのテストが必要になることがあります。あなたのlocalhost:8000には外部からアクセスできず、静的IPの注文は大げさ過ぎ、デプロイ済みのステージング環境は数リクエストのためだけに準備するには時間がかかりすぎます。
通常、このような場面では自然と手がngrokや類似サービスに伸びるものです。しかし、商用替代品には常に面倒な制約が伴います:トラフィック制限、再起動ごとに変わるURL、基本機能にも有料サブスクリプションが必要です。そんな中、最近見つけたのがtunneltoです。余計な手間なしで、その名が示す通りのことをしてくれるオープンソースのRustユーティリティです。
このツールとは
tunneltoプロジェクトは、トンネルを介してローカルのWebサーバーをパブリックインターネットに公開できます。ターミナルで1つのコマンドを実行すると、有効なパブリックURLが発行され、外部サービスやクライアントにデモ用として渡せます。
主な特徴は、クライアントとサーバーの両方がasync tokioエンジンを使用してRustで書かれていることです。これにより、メモリ使用量は控えめで、着信接続の処理が高速です。重いランタイムやギガバイトのRAMを消費するバックグラウンドプロセスも不要です。
プロジェクトのリポジトリはhttps://github.com/tunneltodev/tunneltoで公開されています。
実際の使い方
インストールは数分で完了します。macOSの場合、Homebrew経由でインストールできます:
brew install agrinman/tap/tunnelto
Rustツールチェーンがすでにセットアップ済みの場合は、Cargoでビルドできます:
cargo install tunnelto
その他のシステムについては、著者がGitHubのReleasesセクションにコンパイル済みバイナリを用意しています。
クイックスタート
たとえば、ポート8000でローカルにWebアプリケーションが動作している場合、以下のコマンドで外部に公開できます:
tunnelto --port 8000
実行後、ユーティリティがトンネルを確立し、すぐに有効なアドレスを提供します。インターネットからそのアドレスへのリクエストはすべて、瞬時にローカルのポートに転送されます。
便利なパラメータ
日常的な作業では、追加設定が必要な場面がよくあります。時間を節約してくれるフラグは次のとおりです:
--subdomainは固定サブドメイン名を設定でき、再起動ごとにwebhook設定でURLを変更する必要がなくなります--schemeはローカルサービスがセキュア接続を必要とする場合、httpとhttpsのプロトコルを切り替えます--dashboard-addressは着信リクエストを検査・表示するためのローカルインターフェースを起動します--keyはトンネル認証用のAPIキーを受け入れます
サブドメインを明示的に指定したコマンド例:
tunnelto --port 3000 --subdomain my-test-app
何に使えるか
開発では、トンネリングが作業を大幅に節約してくれるシナリオがいくつかあります:
- ブレークポイントを使ってローカルデバッガで直接、決済システムやメッセージングアプリ、OAuthプロバイダーからの着信webhookをデバッグする。
- Wi-Fiルータを設定せずに、モバイルネットワークに接続された実際のスマートフォンでモバイルアプリケーションをテストする。
- コードがリポジトリにプッシュされていない、またはテストサーバーにデプロイされていない段階で、レイアウトやプロトタイプを同僚に素早く見せる。
- リリース前にHTTPS証明書とセキュリティヘッダーを検証する。
個人的な感想
READMEにはサーバーコンポーネントのセルフホスティングの機能が記載されていますが、詳細な手順がありません。トラフィックの完全なプライバシーが重要な場合は、コードベースを掘り下げて自有のVPSにリレーをデプロイする必要があります。
スター数は多くなく(約400個)、コミットも毎日行われるわけではありませんが、基本的なタスクに関してはユーティリティは確実に動作します。起動が速く、基本的なトンネリングにregistrationが不要で、明確に1つのことを正確に実行します。ngrokのシンプルなオープンソース代替を探しているなら、リポジトリをチェックして試してみる価値があります。
関連プロジェクト