Title here
Summary here
rojiはホストマシン上で動作する単一のGoバイナリで、Dockerイベントを監視し、HTTP/HTTPSリクエストをコンテナにプロキシします。
┌─────────────────────────────────────────────────────────────┐
│ roji │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Docker │ │ Route │ │ HTTP/HTTPS │ │
│ │ Watcher │→ │ Manager │→ │ Reverse Proxy │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
│ ↓ ↓ ↑ │
│ Docker Socket SSE Broadcast :80 / :443 │
└─────────────────────────────────────────────────────────────┘Dockerソケットに接続し、コンテナイベント(start, stop, die)を監視します。監視対象ネットワーク上のコンテナが起動すると、以下を抽出します:
roji.*)ルーティングテーブルを管理し、変更をブロードキャストします:
Goの net/http/httputil.ReverseProxy をベースに構築:
Upgrade: websocket ヘッダーで検出、双方向プロキシContent-Type: application/grpc で検出、HTTP/2でプロキシGoの標準ライブラリ crypto/x509 と crypto/tls を使用してTLS証明書を管理:
*.{domain} のワイルドカード証明書、期限切れ時に再生成Petite Vue(約6KB、ビルド不要)で構築されたシングルページアプリケーション:
embed.FS でGoバイナリに埋め込みhttps://myapp.dev.localhost にHTTPSリクエストを送信myapp.dev.localhost を検索httputil.ReverseProxy がコンテナの内部IPとポートにリクエストを転送roji CA(自己署名)
└── *.dev.localhost(サーバー証明書)
└── すべての *.dev.localhost リクエストにHTTPSサーバーが使用CAは一度生成され、再起動後も永続化されます。サーバー証明書は設定済みドメインの全サブドメインをカバーするワイルドカードです。
| コンポーネント | 技術 | 理由 |
|---|---|---|
| 言語 | Go | 単一バイナリ、高速起動、優れた標準ライブラリ |
| リバースプロキシ | net/http/httputil | 標準ライブラリ、実績あり |
| TLS | crypto/x509, crypto/tls | 外部依存なし |
| フロントエンド | Petite Vue | 約6KB、ビルド不要、リアクティブ |
| リアルタイム | Server-Sent Events | 一方向更新にはWebSocketよりシンプル |
| Docker | Docker Engine API | 直接API アクセス、コア機能にCLI依存なし |