コンテンツにスキップ

内部アーキテクチャ

Komugi は Go 言語の並行処理機構(Goroutine / Channel)と gophertunnel ライブラリをベースにした、高性能かつ堅牢な Bedrock Edition MITM (Man-In-The-Middle) プロキシです。

komugi/
├── cmd/
│ └── komugi/ # メインエントリポイント & CLI サブコマンド
│ ├── main.go # プロセス起動、シグナル制御、ディスパッチ
│ ├── logs.go # komugi logs CLI 実装
│ └── status.go # komugi status CLI 実装 (IPC クライアント)
│
└── internal/
├── config/ # 設定読み込み (.env パース, 型検証)
├── log/ # ロギング機構 (stdout, 日別ローテート file, SQLite WAL)
├── monitor/ # バックエンド死活監視 (RakNet ping ポーリング)
├── relay/ # リレーサーバー本体 & セッション制御
│ ├── relay.go # リスナー待受、セッション一覧管理、IPC ソケット提供
│ ├── session.go # クライアント・サーバー間の双方向パケットループ
│ ├── commands.go # ゲーム内カスタムコマンド注入とハンドラ
│ ├── f3.go # F3 デバッグ画面オーバーレイ管理
│ ├── chunkborder.go # チャンク境界線パーティクル生成
│ ├── shopalert.go # ショップ取引パケット監視
│ ├── resourcepacks.go # リソースパックのキャッシュ・提供
│ ├── proxyproto.go # PROXY Protocol v2 ヘッダー生成
│ └── builtin_limbo.go # 待機用 Limbo ワールド生成
├── upstream/ # 上流 (バックエンド) への接続ダイヤラー
└── userdb/ # SQLite ユーザー情報管理 (現在地, 設定, アラート)

各プレイヤーが接続すると、1 つの session オブジェクトが生成され、クライアント側 (Downstream) とバックエンド側 (Upstream) を繋ぐ 2 本の独立したパケット転送ループ(Goroutine)が起動します。

[ Minecraft Client ]
▲
│ Bedrock UDP (下流)
▼
[ session.readDown() ] ───(コマンド判定・傍受)───► [ internal/relay/commands ]
│ (通常パケット)
▼
[ session.writeUp() ]
▲
│ Bedrock UDP (上流)
▼
[ Upstream Server ]
│
▼
[ session.readUp() ] ───(切断検知・ショップ判定)─► [ 自動復帰・ShopAlert ]
│ (通常パケット)
▼
[ session.writeDown() ]
│
▼
[ Minecraft Client ]

パケット傍受と介入のポイント

Section titled “パケット傍受と介入のポイント”
  1. 下流からのパケット (readDown):

    • CommandRequest: /f3, /cb, /ping, /tps, /shop_alert などの独自コマンドを検知すると、上流には転送せず Komugi 内部で処理し、CommandOutput や ToastRequest を直接クライアントへ返信します。
  2. 上流からのパケット (readUp):

    • Disconnect / Text: サブサーバーダウン時の「Server Closed」通知を検知した場合、クライアントへのパケット転送を遮断し、バックグラウンドでの自動復帰リトライを開始します。
    • AvailableCommands: ログイン時、Komugi の独自コマンドをサーバーのコマンド一覧パケットにマージ注入し、クライアント側でタブ補完が効くようにします。
  • パニックリカバリ: すべての主要 Goroutine は defer recover() で保護されています。パケットデコード時の予期せぬ例外が発生しても、プロセス全体が停止することはありません。
  • コンテキスト管理: 親プロセスのシャットダウンシグナル (context.Context) がすべてのセッションおよびバックグラウンドタスクへ伝播し、安全にリソースを解放します。
  • IPC ステータスサーバー: リレー内部で UNIX ドメインソケットの HTTP/JSON サーバーが動作しており、ロック競合を起こさずに外部 CLI (komugi status) から安全にステータスを取得できます。