localhost-run について
localhost.run を使い、ローカルアプリをインターネットから利用可能にするための開発者向けスキルです。SSH による HTTP、HTTPS、TLS トンネル、自社ドメインの設定、接続トラブルの診断を扱います。
主な機能
- 01SSH 経由のローカルサービス転送
- 02HTTP トンネルの HTTPS 自動提供
- 03非 HTTP プロトコル向け TLS パススルー
- 04カスタムドメインと安定したサブドメイン
- 05トンネルのトラブルシューティング
活用シーン
- 01ローカルアプリのプレビューを同僚と共有
- 02Webhook リクエストをローカル開発サーバーに転送
- 03別のネットワークや端末からローカルアプリをテスト
- 04カスタムドメイントンネル経由でデータベースに接続
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ilteoood/ harness --skill localhost-runインストール後、Claude Code で/localhost-runを入力して読み込まれたか確認します。
詳細
localhost.run
localhost.run は、ローカルで実行中の HTTP、HTTPS、または TLS アプリケーションをパブリックインターネットからアクセス可能にする、クライアント不要のトンネリングサービスです。無料プランではクライアントのインストールもアカウントの作成も必要ありません。ほとんどのオペレーティングシステムで利用できる標準の SSH で動作します。
このスキルを使う場面
ユーザーが次のことを希望している場合に、このスキルを使います。
- ローカルで実行中のアプリを誰かと共有する(プレビューリンク、デモ、QA)
localhostの開発サーバーで Webhook(Stripe、GitHub、Twilio など)を受信する- 別のネットワーク上にあるスマートフォンや他のデバイスからアプリをテストする
- カスタムドメインを通じてデータベースやその他の非 HTTP プロトコルをトンネリングする
- localhost.run でカスタムドメインを設定する
- 動作しない、遅い、または不安定な既存の localhost.run トンネルを診断する
- ngrok、Cloudflare Tunnel、localtunnel などのツールを置き換える
クイックスタート
ポート 8080 でローカルアプリを公開します。
ssh -R 80:localhost:8080 localhost.run
コマンドを実行すると、HTTP および HTTPS のトラフィックを localhost:8080 に転送するパブリック URL(https://<random>.lhr.life のような形式)が表示されます。SSH セッションは開いたままにしてください。閉じるとトンネルが切断されます。
その他のよく使われるポート:
ssh -R 80:localhost:3000 localhost.run # Node / React dev server
ssh -R 80:localhost:5000 localhost.run # Flask / general
ssh -R 80:localhost:8000 localhost.run # Django / general
コマンドの構成
ssh -R [customdomain:]bindport:host:hostport localhost.run
| フィールド | 説明 |
|---|---|
customdomain | オプションです。カスタムドメインユーザー向けです。ここに完全なドメインを指定します。 |
bindport | HTTP の場合は 80(HTTPS は自動で提供)、TLS パススルーの場合は 443 です。 |
host | ローカルのホスト名です。通常は localhost です。IPv6 の動作に問題がある場合は 127.0.0.1 を使います。 |
hostport | アプリがリッスンするローカルポートです。 |
localhost:8080 に接続できない場合は、127.0.0.1:8080 を試してください。一部の OS では、localhost がデフォルトで IPv6 の [::1] に解決される一方、フレームワークは IPv4 のみにバインドすることがあります。
SSH オプション
転送された ssh -o フラグは通常どおり機能します。便利なものは次のとおりです。
# Keep the tunnel alive across NAT/router timeouts
ssh -o ServerAliveInterval=60 -R 80:localhost:8080 localhost.run
# Background it with autossh for auto-reconnect
autossh -M 0 -R 80:localhost:8080 localhost.run
出力形式
サーバーは 1 つ以上の URL を出力します。解析する場合は、機械可読形式を選んでください。
# Human-readable (default)
ssh -R 80:localhost:8080 localhost.run -- --output text
# JSON
ssh -R 80:localhost:8080 localhost.run -- --output json
-- の後に指定した内容はすべて、ssh ではなく localhost.run に渡すフラグとして転送されます。
HTTP トンネル
bindport 80 がデフォルトのモードです。localhost.run は次の処理を行います。
- HTTP トラフィックをアプリに転送します
- 管理された証明書を使って
https://エンドポイントを自動で生成します - フレームワークが元のスキーム、ホスト、IP を検出できるよう、プロキシヘッダーを挿入します:
X-Forwarded-ForX-Forwarded-HostX-Forwarded-ProtoForwarded(RFC 7239)
下流のプロキシがすでにこれらのヘッダーを設定している場合は、ヘッダーの挿入を無効にします。
ssh -R 80:localhost:8080 localhost.run -- --no-inject-http-proxy-headers
ベストプラクティス:ローカルアプリが HTTPS を必須にする よう設定してください。挿入されたヘッダーを通じて正しいスキームが渡されるため、信頼されたクライアントには適切な URL とアセットが表示されます。
プロキシプロトコル
X-Forwarded-* ではなく HAProxy プロキシプロトコルを使用するアプリの場合は、ワイヤーバージョンを選択します。
ssh -R 80:localhost:8080 localhost.run -- --proxy-protocol-header-version v2
# v1 is the default; v2 is binary and slightly faster
TLS パススルー
アプリケーションが生の TLS バイト列を受け取り、自身で証明書を検証する必要がある非 HTTP プロトコル(PostgreSQL、SSH-over-TLS、カスタム TCP)の場合:
ssh -R 443:localhost:8443 localhost.run
- アプリが独自の TLS 証明書を提供し、検証する必要があります
- 現在は カスタムドメインが必要です(無料の
lhr.lifeドメインではパススルーエンドポイントを公開できません)
証明書を管理したくない場合は、代わりに HTTP トンネルを使ってください。localhost.run が TLS を終端します。
カスタムドメイン
無料プランでは、ドメイン名が定期的に変更されます。安定した URL を利用するには、https://admin.localhost.run から、年払いで月額 9 ドルのカスタムドメインプランに登録してください。選択肢は 2 つあります。
- 独自のドメインを使う — DNS を用意して、安定した URL を取得します
lhr.rocksサブドメインを使う — 設定する DNS は不要です。先着順です
カスタムドメインで接続する
ssh -R yourdomain.com:80:localhost:8080 [email protected]
plan@ SSH ユーザーに注意してください。デフォルトのユーザーでは接続が拒否されます。
DNS の設定
- 所有権を証明する TXT レコードを
_lhr.yourdomain.comに追加します - 次のいずれかを設定します:
- アペックスドメイン(
example.com):A レコードを 3 つ54.161.197.24754.82.85.24935.171.254.69
- サブドメイン(
app.example.com):cd.localhost.runを指す CNAME を 1 つ
- アペックスドメイン(
- ワイルドカード CNAME
*.yourdomain.com → cd.localhost.runを追加すると、 無制限のサブドメイン(api.yourdomain.com、web.yourdomain.com、…)を利用できます
制限:プランごとに同時に使用できるトンネルは最大 5 つです。サブドメイン数は Let's Encrypt の証明書発行レート制限によって制限されます。
https://admin.localhost.run で請求の管理、SSH キーの追加、ドメインの変更やキャンセルができます。
永久無料プラン
短期間のトンネルならクライアントもサインアップも必要ありません。フィッシング対策として、 意図的に次の 2 つの制限を設けています:
- ドメイン名は定期的に変わります(接続時に表示される URL は固定されません)
- 速度制限があります
より長期間使える無料ドメインを利用するには、admin.localhost.run でサインアップし、 SSH 公開鍵をアップロードしてください。この鍵によって、固定のサブドメインが お使いのマシンに紐付けられます。
鍵をお持ちでない場合は、次のコマンドで生成してください:
ssh-keygen -t ed25519
# Upload ~/.ssh/id_ed25519.pub to https://admin.localhost.run
カスタムドメインプランには、いずれの制限も適用されません。
をトンネリングする
よく使われるパターンをサイトで紹介しています:
WordPress
WordPress はデータベースにサイト URL を保存するため、無料ドメインが変更されると 動作しなくなります。次のいずれかを選択してください:
- カスタムドメインを使用する(WordPress サイトには推奨)
- または無料ドメインの場合は、
relative-urlをインストールし、WP_HOMEとWP_SITEURLの両方を'https://' . $_SERVER['HTTP_HOST']に設定します
Web フレームワーク
ブラウザーの開発者ツールで、リクエストが引き続き localhost:PORT に送信されている場合、
フレームワークがリクエストから絶対 URL を生成し、プロキシヘッダーを無視しています。
フレームワークの「信頼できるプロキシ」/「リバースプロキシ」モードを設定して、
X-Forwarded-Proto と X-Forwarded-Host を尊重するようにしてください。多くのフレームワーク
(Fastify、Express、Next.js、Rails、Django、Flask)では、設定またはミドルウェアで対応できます。
SSH サーバー(カスタムドメインのみ)
SSH をトンネリングするには、カスタムドメインに加えて、クライアント側で TCP を TLS で ラップするための stunnel が必要です:
- SSH サーバーから localhost.run のトンネルを開きます
- クライアントマシンに stunnel をインストールします
- ローカル接続を受け付け、TLS 経由でカスタムドメインに転送するよう stunnel を設定します
- ローカルの stunnel エンドポイントを指定して SSH クライアントを実行します
セキュリティ
- SSH トランスポート:HTTP/TLS の設定にかかわらず、localhost.run とお使いの ローカルアプリの間はエンドツーエンドで暗号化されます
- HTTP トンネル:HTTPS エンドポイントは自動的に発行され、localhost.run が
証明書を管理します。注入された
X-Forwarded-Protoヘッダーを使用して、 ローカルアプリが HTTPS を必須とするよう設定してください - TLS パススルー:localhost.run はトラフィックを復号しません。アプリが 証明書を直接検証します
トラブルシューティング
| 症状 | 対処 |
|---|---|
無料プランで Permission denied (publickey) が発生する | nokey ユーザーを使用します:ssh -R 80:localhost:8080 [email protected] |
| カスタムドメインへの接続が拒否される | plan ユーザーを使用します:ssh -R yourdomain.com:80:localhost:8080 [email protected] |
| 無料トンネルの URL が頻繁に変わる | admin.localhost.run で SSH キーを追加し、nokey ユーザーを使用しないようにします |
connect_to localhost port 8080: failed | ローカルアプリがそのポートで接続できません。同じマシンから curl http://localhost:8080 を実行して確認してください |
| 数分後にトンネルが切断される | ssh -o ServerAliveInterval=60 を追加するか、自動再接続のために autossh -M 0 -R 80:localhost:8080 localhost.run でラップします |
| IPv4 / IPv6 の不一致 | localhost の代わりに 127.0.0.1 を試します(またはその逆)。 |
アプリが https:// ではなく http:// を認識する | プロキシヘッダーが無効になっています。注入を再度有効にするか、上流プロキシで X-Forwarded-Proto: https を設定します。フレームワークの「trust proxy」モードを設定してください。 |
ブラウザーが引き続き localhost:PORT にアクセスする | フレームワークが絶対 URL を生成しています。X-Forwarded-Host を信頼するように、リバースプロキシ/信頼済みプロキシの設定を行ってください |
| ドメインを新しいアカウントに移行したい | 古いサブスクリプションを解約し、新しいアカウントでドメインを設定して、TXT レコードで確認してから支払いを行い、残りのクレジットを移行するために [email protected] にメールで連絡します |
参照
- メインドキュメント:https://localhost.run/docs/
- CLI:https://localhost.run/docs/cli/
- HTTP トンネル:https://localhost.run/docs/http-tunnels/
- TLS パススルー:https://localhost.run/docs/tls-passthru-tunnels/
- カスタムドメイン:https://localhost.run/docs/custom-domains/
- 永久無料プラン:https://localhost.run/docs/forever-free/
- セキュリティ:https://localhost.run/docs/security/
- FAQ:https://localhost.run/docs/faq/
- 管理/登録:https://admin.localhost.run
- ソース:github.com/localhost-run/site