内部アーキテクチャ
Komugi は Go 言語の並行処理機構(Goroutine / Channel)と gophertunnel ライブラリをベースにした、高性能かつ堅牢な Bedrock Edition MITM (Man-In-The-Middle) プロキシです。
パッケージ構成
Section titled “パッケージ構成”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 ユーザー情報管理 (現在地, 設定, アラート)パケットパイプライン
Section titled “パケットパイプライン”各プレイヤーが接続すると、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 “パケット傍受と介入のポイント”-
下流からのパケット (
readDown):CommandRequest:/f3,/cb,/ping,/tps,/shop_alertなどの独自コマンドを検知すると、上流には転送せず Komugi 内部で処理し、CommandOutputやToastRequestを直接クライアントへ返信します。
-
上流からのパケット (
readUp):Disconnect/Text: サブサーバーダウン時の「Server Closed」通知を検知した場合、クライアントへのパケット転送を遮断し、バックグラウンドでの自動復帰リトライを開始します。AvailableCommands: ログイン時、Komugi の独自コマンドをサーバーのコマンド一覧パケットにマージ注入し、クライアント側でタブ補完が効くようにします。
並行性と耐障害性
Section titled “並行性と耐障害性”- パニックリカバリ: すべての主要 Goroutine は
defer recover()で保護されています。パケットデコード時の予期せぬ例外が発生しても、プロセス全体が停止することはありません。 - コンテキスト管理: 親プロセスのシャットダウンシグナル (
context.Context) がすべてのセッションおよびバックグラウンドタスクへ伝播し、安全にリソースを解放します。 - IPC ステータスサーバー: リレー内部で UNIX ドメインソケットの HTTP/JSON サーバーが動作しており、ロック競合を起こさずに外部 CLI (
komugi status) から安全にステータスを取得できます。