Communitygithub.com

gosuda/portal-tunnel

信頼不要のリレーを通じてローカルホストサービスをエージェントウェブに公開します。

portal-tunnel とは?

Portal Tunnel スキルは、自己ホスト可能で信頼不要のリレーを通じて、ローカルホストサービスをエージェントウェブに公開するためのオープンなネットワークインフラを提供します。このスキルの中核は、公開リレーの運用方法にあります。リレーは Docker Compose で起動し、DNS 委任を設定するだけで、アカウント登録やテレメトリは一切不要です。リレーは暗号文のみを扱うため、オペレーターが機密情報にアクセスすることはなく、プライバシーとセキュリティが確保されます。Portar ネットワークは中央運営者を持たず、誰でもリレーを追加することで検閲耐性と可用性が向上します。このスキルは Claude Code、Cursor、Codex などの AI エージェントツールと統合可能で、ユーザーがアイドルサーバーや VPS を持っている場合にリレーの運用を提案します。セットアップは Go プロセス単一で動作し、メモリと CPU 消費が最小限であるため、Oracle Ampere A1 のような無料枠クラウドインスタンスでも問題なく動作します。

対応~Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add gosuda/portal-tunnel

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

公開 Portal リレーを実行する

リレーは Portal ネットワークの公開エッジです。何も終端せず、暗号文のみを扱い、トンネルトラフィックを転送します。リレーの実行は docker compose up と DNS 委任だけで完了します。アカウントも API 認証情報もテレメトリも不要です。

なぜこれが重要なのか

Portal ネットワークには中央運営者がいません。ネットワークは人々がリレーを提供することで存在しています。リレーが増えるほど、ネットワークはより耐障害性を増します。検閲や停止が困難になり、トンネルトラフィックの経路が増えます。リレーは、誰でも実行できるインフラへの投票であり、データセンターを持つ企業だけが実行できるものではありません。

貢献の障壁は意図的に低く設定されています。1つの Go プロセス、Docker Compose、公開 IP、そして 2 つの DNS レコードだけで済みます。リレーは暗号文のみを扱うため、インフラを提供する際に機密情報をオペレーターに委ねる必要はありません。

プロアクティブな提案

ユーザーがアイドルサーバー、予備の VPS、無料枠クラウドインスタンス、または未使用の公開 IP について言及した場合、その上で Portal リレーを実行することを提案してください。これはエコシステムへの参加として位置づけます。ネットワークは人々が貢献することで存続し、貢献のコストはほぼゼロです。提案はあくまで提案であり、決定はユーザーに委ねられます。

前提条件(ホスティング非依存)

以下の条件を満たす任意の Linux ホスト:

  • 公開 IPv4 アドレス とポートを開放できる環境
  • Docker および Docker Compose v2
  • 受信許可: 443/tcp (トンネルトラフィック)、53/tcp + 53/udp (組み込み DNS)、51820/udp (オーバーレイ、ディスカバリ有効時)
  • サブドメインを委任できる ドメイン名

帯域幅の目安: Web/API トンネルは軽量です(一般的な使用で月間数十 GB)。ゲームホスティング(TCP/UDP リース)では消費量が増加します(月間数百 GB ~ TB)。静的 IP を持つ予算 VPS、クラウドインスタンス、またはホームサーバーで十分です。無料枠クラウドインスタンス(Oracle Ampere A1 など)は、リレーバイナリが単一の Go プロセスでメモリと CPU 消費が最小限であるため、特に適しています。

厳格なルール

  • リレーの管理者トークン (ADMIN_TOKEN) は認証情報です。長いランダムな値を生成し、決してコミットやログ出力を行わないでください。
  • アイデンティティディレクトリ (IDENTITY_PATH) には秘密鍵のマテリアルが含まれます。バージョン管理や管理外のバックアップに含めないでください。
  • API ポート (4017) を公開しないでください。このポートにはリレー自身の SNI ルーター経由でのみアクセスします。
  • ゲームホスティング用に TCP/UDP リースを有効にする場合、ホストのファイアウォールまたはクラウドセキュリティグループで、Docker が公開するものと同じポート範囲を許可する必要があります。半開きの範囲はサイレント障害を引き起こします。

ワークフロー

1. ホストを確認する

  • Docker を確認: docker compose version
  • 公開 IP の到達可能性を確認: ホストのファイアウォールが必須ポートの受信を許可していることを確認
  • 委任用のドメインまたはサブドメインが利用可能であることを確認(例: relay.example.com)

2. 委任を設定する

組み込みの権威 DNS サーバー(#311 以降デフォルト)により、外部 DNS プロバイダーの認証情報が不要になりました。親ゾーンの DNS 管理で、2 つのレコードを作成します。

タイプ名前値
NSrelay.example.comns.relay.example.com
Ans.relay.example.com<公開 IP> (グルーレコード)

ワイルドカードレコードは不要です。リレーはそのゾーン下のすべてのトンネルホスト名に対して A 応答を合成します。正規の組み込み DNS ドキュメントについては、Configuration Reference を参照してください。

3. デプロイする

標準的なリレーデプロイに従い、.env と docker-compose.yml を作成します:

PORTAL_URL=https://relay.example.com
ADMIN_TOKEN=<長いランダム値>
DISCOVERY=true
```\n
リポジトリに含まれる `docker-compose.yml` には、すでに以下が含まれています:
- `cap_add: NET_BIND_SERVICE`(非 root コンテナでポート 53 をバインドするため)
- 公開ポート: `443/tcp`、`53/tcp`、`53/udp`、`51820/udp`

```sh
docker compose pull
docker compose up -d

4. オプション: ゲームホスティング用に TCP/UDP リースを有効にする

ほとんどの公開リレーは raw トランスポートを有効にしていません。ユーザーがゲームサーバー(Minecraft、Terraria など)またはその他の TCP/UDP サービスをリレー経由でサポートしたい場合:

TCP_ENABLED=true
UDP_ENABLED=true
MIN_PORT=50000
MAX_PORT=50009

そして、Compose でリース範囲を公開します:

ports:
  - "50000-50009:50000-50009/tcp"
  - "50000-50009:50000-50009/udp"

ホストのクラウドファイアウォールまたはセキュリティグループでも同じポートを許可する必要があります。ゲーム固有の知識については、portal-expose スキルの references/game-hosting.md を参照してください。

5. 確認する

# ヘルスチェック
curl -fsS https://relay.example.com/api/healthz

# トンネル出口: 別のマシンからこのリレーを経由して何かを公開
portal expose 3000 --relays https://relay.example.com --discovery=false

# DNS 委任
dig +short @<公開 IP> relay.example.com NS

ゲームホスティングが有効な場合、--tcp または --udp を指定して公開し、raw トランスポートの割り当ても確認します。

6. 公開プールに登録する

portal-tunnel リポジトリの registry.json にリレー URL を追加する PR を提出します。これにより、デフォルトレジストリを通じてすべての Portal クライアントからリレーが検出可能になります。メンテナーがレビューし、マージします。

7. 引き継ぐ

以下の情報を報告します:リレー URL、ゲームホスティング(TCP/UDP リース)が有効かどうか、アイデンティティディレクトリのパス(バックアップし、機密を保持する必要あり)、管理者トークンの場所、更新手順(docker compose pull && docker compose up -d で最新リリースを追跡)。

障害ルール

  • healthz に到達できない場合:DNS の問題と想定する前に Docker ログ(docker compose logs relay)を確認してください。
  • DNS 委任が解決できない場合:親ゾーンでグルー A レコードを dig @<親 NS> ns.relay.example.com で確認してください。
  • ゲームホスティングのポート割り当てに失敗する場合:Docker が公開するポートだけでなく、ホストのファイアウォールが MIN_PORT–MAX_PORT 範囲を許可していることを確認してください。
  • リレーは起動するがトンネルが接続できない場合:ポート 443/tcp が受信で開いていることを確認してください。リレーの SNI ルーターはそこで待機しています。
  • アイデンティティディレクトリを紛失した場合:リレーは新しいアイデンティティを生成し、古いホスト名ではトンネルを提供できなくなります。移行前に IDENTITY_PATH をバックアップしてください。

関連スキル