
단순히 노드와 그래프
인프라를 한눈에 확인하세요. 설정이 필요 없습니다.
graph-go를 스택에 연결하면 모든 데이터베이스, 테이블, 서비스, 스토리지 버킷의 실시간 대화형 지도를 실시간 상태 모니터링과 함께 볼 수 있습니다.
graph-go는 CLI 우선 인프라 매퍼입니다. Docker 데몬에 연결하고, 실행 중인 컨테이너를 검사하며, 데이터베이스 및 스토리지 서비스를 프로빙하여 인프라를 자동으로 발견합니다. UI는 백엔드에서 제공되며 실제 백엔드 상태를 반영합니다. 수동 인벤토리가 필요하지 않습니다.
| 기능 | 세부 사항 |
|---|---|
| 자동 발견 | Docker 컨테이너 및 Kubernetes 클러스터에서 인프라를 감지합니다. 수동 인벤토리가 필요하지 않습니다. |
| Kubernetes | 네임스페이스, 디플로이먼트, 스테이트풀셋, 데몬셋, 파드, 서비스 — 인포머 기반 실시간 감시 제공 |
| Docker | 실행 중인 컨테이너 분류, 자격 증명 추출, Docker 이벤트 감시, graphgo.* 레이블을 통해 유형/DSN/노드 유형/이름을 재정의하거나 컨테이너 무시 가능 |
| PostgreSQL | 테이블, 외래 키 관계, 스키마 토폴로지 |
| MongoDB | 데이터베이스 및 컬렉션 |
| MySQL | 테이블, 외래 키 관계 |
| Redis | 키스페이스 및 키 분포 |
| Elasticsearch | 인덱스, 클러스터 상태, 샤드 상태 |
| S3 / MinIO | 버킷 및 최상위 접두사 |
| HTTP 서비스 | 헬스 엔드포인트, 서비스 간 종속성 매핑 |
| 실시간 상태 | WebSocket 기반으로 5초마다 실시간 상태 업데이트 |
| 대화형 그래프 | 수영장 레인 레이아웃, 네임스페이스 그룹 컨테이너, 패닝/줌, 유형/상태별 필터링, 노드 검색 |
graph-go는 제한된 graphgo.* 컨테이너 레이블 세트를 지원합니다 (제어하려는 모든 컨테이너에 설정 가능):
이 레이블들을 사용하여 잘못 분류된 컨테이너를 구출하고, graph-go에 사용자 정의 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가 기본 이미지를 가져오고 로컬 데모 이미지를 빌드해야 하므로 몇 분 정도 걸릴 수 있습니다. 이후 실행은 훨씬 빠릅니다.
데모 스택은 다음 호스트 포트가 비어 있어야 합니다: 8080, 5432, 27017, 9000, 9001.
이후 명시적으로 정리해야 하는 경우:
docker compose -f docker-compose.demo.yml down
하나의 컨테이너, 하나의 포트입니다. 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)
주요 구성 요소:
Discover, Watch, Close) — Docker와 Kubernetes가 병렬로 실행되고 결과가 연결됩니다.Adapter 인터페이스를 구현하여 데이터베이스 및 스토리지 서비스를 프로빙합니다.어댑터에 의해 발견됨:
서비스 노드 (postgres/mongodb/s3)
└─ 데이터베이스/버킷 노드
└─ 테이블/컬렉션/접두사 노드
Kubernetes에 의해 발견됨:
네임스페이스 (그룹 컨테이너)
└─ 디플로이먼트 / 스테이트풀셋 / 데몬셋
└─ 파드
└─ 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실시간 업데이트를 스트리밍합니다. 두 가지 메시지 유형이 발행되며, 둘 다 { "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 | 발견을 한 번 실행하고 그래프를 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