
2026/01/20 1:10
**Show HN:** *Pipenet ― Localtunnel のモダンな代替*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善された概要
Pipenetは、クライアントとサーバーの両方のコンポーネントを統合したオープンソースでセルフホスト型のトンネル解決策です。
npm install pipenet でインストールするか、直接 npx を使用して実行できます。
-
クライアント利用例
npx pipenet client --port <port> [--subdomain <name>] [--host <hostname>]クライアントは
API を公開し、pipenet({ port: 3000 })
、request
、error
イベントを発火させ、トンネル URL(例:close
)を提供します。https://abc123.pipenet.dev -
サーバー利用例
npx pipenet server --port <port> [--domain <name>] [--tunnel-port <port>]サーバー API (
) はcreateServer({ domains, secure, tunnelPort })
、onTunnelCreated
、onTunnelClosed
といったライフサイクルフックをサポートします。また、onRequest
(デフォルト10)やmaxTcpSockets
を使ったランディングページリダイレクトなどの設定オプションも提供します。landing -
機能とプロトコル
Pipenet は HTTP/HTTPS、WebSocket(フルデュプレックス)、Server‑Sent Events (SSE)、およびチャンク転送エンコーディングを使用した HTTP ストリーミングをサポートします。単一ポートでのクラウドデプロイが可能で、複数ドメインに対応しつつ、TypeScript と ES Modules で積極的に保守されています。 -
管理用 API エンドポイント
– 全体ステータスGET /api/statusServer
– 特定トンネルのステータスGET /api/tunnels/:id/status
– 個別トンネルの管理GET /:id
-
SDK 統合例
SDK は Pipenet を利用してローカル MCP サーバーとリモート AI クライアントを接続し、Pipenet が大規模な開発ワークフローに組み込めることを示しています。mcp-proxy
Pipenet により、サードパーティサービスに依存せずに安全でマルチプロトコルのトンネルを制御でき、費用削減と Web、WebSocket、SSE、およびストリーミングアプリケーションへのトラフィックルーティングが向上します。
本文
pipenet – localtunnel のモダンなオープンソース代替
クライアントとサーバーを同梱し、自分でトンネルインフラをホストできるようにします。
速やかな始め方
npm install pipenet
ローカル開発
ローカルサーバーを共有したり、Webhook をテストしたり、デプロイせずにデモを行うことができます。
SDK 統合
ツール内で pipenet を埋め込みます。例えば
mcp-proxy は、ローカル MCP サーバーとリモート AI クライアントを接続するために利用しています。
自前ホスティングインフラ
トンネルサーバーを自分で運用し、セキュリティ・ドメイン・可用性を完全に制御できます。
クライアントの使い方
# ローカルポート 3000 を公開 npx pipenet client --port 3000 # カスタムサブドメイン npx pipenet client --port 3000 --subdomain myapp # 自分のサーバーを利用 npx pipenet client --port 3000 --host https://tunnel.example.com
クライアントオプション
| オプション | 型 | 説明 |
|---|---|---|
| number | 公開するローカルポート |
| string | トンネルサーバーの URL |
| string | 指定したサブドメインを要求 |
| string | localhost の代わりに使用するホスト名 |
| boolean | ローカル HTTPS サーバーへトンネル |
| boolean | 証明書検証をスキップ |
イベント
| イベント | 説明 |
|---|---|
| 各プロキシリクエスト時に発火(メソッドとパス) |
| エラーが発生した際に発火 |
| トンネルが閉じた際に発火 |
サーバーの使い方
# サーバー起動 npx pipenet server --port 3000 # カスタムドメイン npx pipenet server --port 3000 --domain tunnel.example.com # クラウド対応 npx pipenet server --port 3000 --tunnel-port 3001
サーバーオプション
| オプション | 型 | 説明 |
|---|---|---|
| string[] | トンネルサーバーのカスタムドメイン |
| boolean | HTTPS を必須にする |
| string | ルートリクエスト時のリダイレクト URL |
| number | クライアントあたりの最大ソケット数(デフォルト10) |
| number | クラウド展開用に共有するポート |
ライフサイクルフック
| フック | 説明 |
|---|---|
| 新しいトンネルが作成されたときに呼ばれる |
| トンネルが閉じられたときに呼ばれる |
| 各プロキシリクエスト時に呼ばれる |
エンドポイント
| メソッド & パス | 説明 |
|---|---|
| サーバー状態とトンネル数を返す |
| 指定トンネルの状態を返す |
| ID で新しいトンネルをリクエスト |
サンプルコード
クライアント (Node)
import { pipenet } from 'pipenet'; const tunnel = await pipenet({ port: 3000 }); console.log(tunnel.url); // https://abc123.pipenet.dev tunnel.on('request', (info) => console.log(info.method, info.path)); tunnel.on('close', () => console.log('closed'));
サーバー (Node)
import { createServer } from 'pipenet/server'; const server = createServer({ domains: ['tunnel.example.com'], secure: true, tunnelPort: 3001, // ライフサイクルフック onTunnelCreated: (tunnel) => { console.log(`トンネル作成: ${tunnel.id} at ${tunnel.url}`); }, onTunnelClosed: (tunnel) => { console.log(`トンネル閉鎖: ${tunnel.id}`); }, onRequest: (req) => { console.log(`${req.method} ${req.path} via ${req.tunnelId}`); }, }); await server.tunnelServer.listen(3001); server.listen(3000);
機能比較
| 機能 | pipenet | localtunnel |
|---|---|---|
| クラウドデプロイ | シングルポート | ランダムポート |
| 複数ドメイン | ✓ | — |
| TypeScript サポート | ✓ | — |
| ES Modules | ✓ | — |
| メンテナンス状況 | アクティブ | 制限あり |
| WebSocket | ✓ | ✓ |
対応プロトコル
| プロトコル | 備考 |
|---|---|
| HTTP / HTTPS | 標準リクエスト/レスポンス |
| WebSocket | HTTP アップグレードでフルデュプレックス |
| SSE | 長時間保持される HTTP 接続 |
| HTTP Streaming | チャンク転送エンコーディング |