
シンプルなノードとグラフ
インフラを可視化。設定不要。
graph-go をスタックに向けるだけで、すべてのデータベース、テーブル、サービス、ストレージバケットのライブでインタラクティブなマップを取得できます。リアルタイムのヘルスモニタリング付き。
graph-go は CLI ファーストのインフラマッパーです。Docker デーモンに接続し、実行中のコンテナを検査し、データベースやストレージサービスをプローブすることで、インフラを自動検出します。UI はバックエンドによって提供され、バックエンドの状態をリアルタイムに反映します。手動のインベントリは不要です。
| 機能 | 詳細 |
|---|---|
| 自動検出 | Docker コンテナと Kubernetes クラスターからインフラを検出します。手動のインベントリは不要です。 |
| Kubernetes | Namespace、Deployment、StatefulSet、DaemonSet、Pod、Service — インフォーマーベースのリアルタイム監視に対応 |
| Docker | 実行中のコンテナを分類、認証情報を抽出、Docker イベントを監視、graphgo.* ラベルを尊重してタイプ/DSN/ノードタイプ/名前の上書きやコンテナの無視を可能に |
| PostgreSQL | テーブル、外部キーリレーション、スキーマトポロジ |
| MongoDB | データベースとコレクション |
| MySQL | テーブル、外部キーリレーション |
| Redis | キースペースとキーの分布 |
| Elasticsearch | インデックス、クラスターヘルス、シャードステータス |
| S3 / MinIO | バケットとトップレベルのプレフィックス |
| HTTP サービス | ヘルスエンドポイント、サービス間の依存関係マッピング |
| リアルタイムヘルス | WebSocket による5秒ごとのライブステータス更新 |
| インタラクティブグラフ | スイムレーンレイアウト、名前空間グループコンテナ、パン/ズーム、タイプ/ヘルスによるフィルター、ノード検索 |
graph-go は限られた graphgo.* コンテナラベルのセットを尊重します(制御したい任意のコンテナに設定できます)。
これらを使用して、誤分類されたコンテナを救出したり、カスタムDSNを指定したり、コンテナを削除せずにグラフから非表示にしたりできます。
CLI でシード済みデモスタックを起動します。これは graph-go を現実的な環境で最も早く体験でき、初めてのユーザーに推奨されるオンボーディングパスです。
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
http://localhost:8080 を開きます。このコマンドは Docker Compose 経由でフォアグラウンドで実行されます。Ctrl+C でセッションを停止します。
初回実行時は、コールドマシンでは Docker がベースイメージをプルし、ローカルのデモイメージをビルドする必要があるため、数分かかることがあります。2回目以降ははるかに高速です。
デモスタックは、ホストの以下のポートが空いていることを前提としています: 8080、5432、27017、9000、9001。
明示的に後片付けが必要な場合:
docker compose -f docker-compose.demo.yml down
1つのコンテナ、1つのポート。Docker ソケットを読み取り専用でマウントするだけで、graph-go がホスト上で実行中のすべてを自動検出します。
docker run -d -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
ghcr.io/guilherme-grimm/graph-go:latest
graph-go は Docker ソケットからの読み取りのみを行います。
:roフラグでこれを強制しています。必ず指定してください。
http://localhost:8080 を開きます。自動検出は、設定ファイルなしで Docker コンテナと(kubeconfig またはクラスター内サービスアカウントが存在する場合)Kubernetes リソースを処理します。
Docker/Kubernetes の外部にあるサービス(リモートデータベース、マネージドクラウドサービス)については、設定ファイルをマウントしてください — 設定 を参照。
単一の自己完結型バイナリ。UI は埋め込まれていますが、エントリポイントは依然として CLI です。
# Linux amd64 (GitHub CLI が必要。他のプラットフォームは Releases を参照)
gh release download --repo guilherme-grimm/graph-go --pattern 'graph-go_*_linux_amd64.tar.gz' --clobber
tar xzf graph-go_*_linux_amd64.tar.gz
./graph-go serve # または単に `./graph-go` — 同じ動作
http://localhost:8080 を開きます。他のプラットフォームは Releases ページ を参照してください。
グローバルフラグ(すべてのサブコマンドに適用): --config、--log-level、--log-format。各コマンドの全オプションは graph-go <command> --help で確認できます。
典型的な流れ:
graph-go demo で現実的なローカルウォークスルーを体験。graph-go serve で自身のインフラに対して実行。graph-go scan で一度きりの自動化、エクスポート、CI チェック。| ポート | 用途 |
|---|---|
8080 | graph-go(UI + API + WebSocket — 本番用) |
5173 | Vite 開発サーバー(開発時のみ — CONTRIBUTING.md を参照) |
9001 | MinIO コンソール(デモスタックのみ) |
自動検出が基本パスです。Docker ソケットをマウントするか、Kubernetes クラスター内で実行するだけで、graph-go は 設定ファイル不要 でインフラを検出します。
YAML 設定(conf/config.yaml)は、検出経由で到達できないサービス(リモートデータベース、マネージドクラウドサービス、外部エンドポイント)のための避難ハッチとしてのみ使用してください。完全なスキーマは conf/config.sample.yaml を参照してください。すべてのアダプターと設定ブロック(server、docker、kubernetes、connections)の例があります。
上記の Docker 実行で設定ファイルを使用する場合:
docker run -d -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v $(pwd)/conf/config.yaml:/app/conf/config.yaml:ro \
ghcr.io/guilherme-grimm/graph-go:latest
許可された使用のみ: graph-go は、自分が所有しているか、アクセス許可があるインフラを可視化するためのものです。許可なくシステムに向けてはいけません。
┌─────────────────────────────────────┐
│ Discoverer Interface │
│ Discover() · Watch() · Close() │
└──────────┬──────────┬───────────────┘
│ │
┌──────────▼──┐ ┌────▼──────────────┐
│ Docker │ │ Kubernetes │
│ Discoverer │ │ Discoverer │
│ (containers,│ │ (informers, pods, │
│ classify, │ │ deployments, │
│ events) │ │ services, health) │
└──────┬──────┘ └────┬──────────────┘
│ │
┌──────▼───────────────▼──────┐
│ Parallel Discovery + Merge │
│ (concatenate ServiceInfo) │
└──────────────┬──────────────┘
│
Config (YAML) ──→ YAML Merge ───────────▶│
▼
┌─────────────────────────────┐
│ Adapter Registry │
│ ├─ PostgreSQL → Tables + FK│
│ ├─ MongoDB → Collections │
│ ├─ MySQL → Tables + FK │
│ ├─ Redis → Keyspaces │
│ ├─ Elasticsearch → Indices │
│ ├─ S3 → Buckets │
│ └─ HTTP → Health + deps│
│ │
│ + Topology (K8s nodes/edges) │
└──────────────┬───────────────┘
▼
Graph Model (Nodes + Edges)
▼
REST API + WebSocket (Real-time)
主要コンポーネント:
Adapter インターフェースを実装してデータベースやストレージサービスをプローブします。アダプター検出:
サービスノード (postgres/mongodb/s3)
└─ データベース/バケットノード
└─ テーブル/コレクション/プレフィックスノード
Kubernetes 検出:
名前空間 (グループコンテナ)
└─ Deployment / StatefulSet / DaemonSet
└─ Pod
└─ K8sService ──routes_to──→ Pod
エッジは関係(contains、foreign_key、routes_to など)を表します。
バックエンド:
フロントエンド:
インフラストラクチャ:
go test ./...
Docker 不要で実行できます。純粋関数のテストと HTTP ハンドラのテストを含みます。
go test -tags=integration -v -timeout=5m ./internal/adapters/...
Docker が必要です。testcontainers-go を使用して実際のデータベースインスタンス(PostgreSQL、MongoDB、MySQL、Redis、Elasticsearch、MinIO)を起動します。モックは使いません。
すべてのアダプターは契約テストスイート(adaptertest.RunContractTests)を実行します。これにより以下が検証されます:
単一のアダプターのテストを実行する場合:
go test -tags=integration -v ./internal/adapters/redis/
make test # ユニット + 型チェック
go test -tags=integration -timeout=5m ./internal/adapters/... # 統合
/api/graph完全なインフラグラフ(ノード + エッジ)を返します。
レスポンス:
{
"data": {
"nodes": [
{
"id": "service-postgres",
"type": "postgres",
"name": "postgres",
"metadata": { "adapter": "postgres" },
"health": "healthy"
}
],
"edges": [
{
"id": "edge-1",
"source": "service-postgres",
"target": "pg-mydb",
"type": "contains",
"label": "contains"
}
]
}
}
/api/node/{id}特定のノードの詳細を返します。
/api/healthアダプターのヘルスステータス(ok/degraded/error)を返します。
/websocketリアルタイム更新をストリーミングします。2種類のメッセージが発行され、どちらも { "type": "...", "payload": { ... } } でラップされています。timestamp フィールドはありません。クライアントは到着順で順序を推定します。
health_update — スイープごと(5秒ごと)にすべてのノードに対して送信されます。アダプター所有のノードはアダプタールックアップを介してヘルスを取得し、トポロジノード(例: Kubernetes リソース)はノード自体にヘルスを保持します。
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health は healthy、degraded、unhealthy のいずれかです。
graph_update — ノードIDのセットが変更された場合(ノードが追加または削除された場合)に送信されます。payload は空です。クライアントは /api/graph を再取得する必要があります。
{
"type": "graph_update",
"payload": {}
}
internal/adapters/{name}/Adapter インターフェースを実装:
type Adapter interface {
Connect(config ConnectionConfig) error
Discover() ([]nodes.Node, []edges.Edge, error)
Health() (HealthMetrics, error)
Close() error
}
init() で自己登録 adapters.RegisterFactory("name", ...) を使用{name}_integration_test.go を作成し:
//go:build integrationTestMainadaptertest.RunContractTests を呼び出してインターフェース契約を検証internal/server/server.go で(init() のためのブランクインポート)ディスカバラーは internal/discovery/{name}/ に配置し、Discoverer インターフェースを実装します:
type Discoverer interface {
Name() string
Discover(ctx context.Context) ([]ServiceInfo, error)
Watch(ctx context.Context, onChange func()) error
Close() error
}
internal/discovery/{name}/Discoverer インターフェースを実装 — Discover() から []ServiceInfo を返します。トポロジを生成するディスカバラー(K8s など)は Nodes/Edges を直接設定し、アダプター指向のディスカバラー(Docker など)はアダプターブリッジ用に Config を設定します。internal/server/server.go で — build{Name}Discovery() 関数を追加し、既存のディスカバラーと一緒に呼び出します。//go:build integration を使用 — 実際のインフラ(K8s には kind/k3d、その他には testcontainers)を使用します。モックは使いません。詳細なガイダンスは CONTRIBUTING.md を参照してください。
コントリビューションを歓迎します!CONTRIBUTING.md で以下のガイドラインを確認してください:
想定される用途:
意図されていない用途:
ユーザーは、graph-go をインフラに接続する前に適切な許可を得ていることを確認する責任があります。
このプロジェクトは GNU Affero General Public License v3.0 (AGPL-3.0) の下でライセンスされています。
詳細は LICENSE ファイルを参照してください。AGPL では、ネットワーク経由で使用される修正版もオープンソースにする必要があります。
このプロジェクトは GitHub Actions を使用して継続的インテグレーションと自動リリースを行っています。
main ブランチへのプッシュ/PR ごとに実行されます — バックエンドのユニットテスト、統合テスト(testcontainers)、フロントエンドのビルドv*)によってトリガーされ、以下を生成します:
ghcr.io/guilherme-grimm/graph-go にプッシュされる単一の Docker イメージリリースを作成するには:
git tag v0.1.0
git push --tags
DevOps とインフラエンジニアの方々へ ❤️ を込めて
| ラベル | 効果 |
|---|
graphgo.ignore=true | このコンテナを完全にスキップ |
graphgo.type=postgres | アダプタータイプを強制(postgres、mongodb、mysql、redis、elasticsearch、s3、http) |
graphgo.dsn=... | 接続文字列を注入(postgres/mysql の場合は DSN、mongodb の場合は URI、それ以外は dsn にフォールバック) |
graphgo.node-type=gateway | ビジュアルノードタイプを上書き(service、gateway、auth、api、queue、cache) |
graphgo.name=... | グラフに表示されるノード名と、ノードID/ログで使用される名前を上書き |
| コマンド | 説明 |
|---|
graph-go demo | リポジトリからシード済みの Docker Compose デモスタックを起動し、その出力をフォアグラウンドに表示します。 |
graph-go serve | 自動検出とライブ更新を伴う HTTP サーバーを起動します(デフォルト — 引数なしで実行した場合と同じ)。 |
graph-go scan | 検出を1回実行し、結果を JSON として stdout に出力します。jq にパイプしたり、CI チェックや一度きりのエクスポートに便利です。 |
graph-go version | バージョン、コミット、ビルド日を表示します。 |
graph-go --health-check | ローカルの /health にアクセスし、終了コード 0/1 を返します。コンテナの HEALTHCHECK で使用されます。インタラクティブ用途ではありません。 |
internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx