
einfach Knoten und Graphen
Sehen Sie Ihre Infrastruktur. Null Konfiguration.
Richten Sie graph-go auf Ihren Stack aus und erhalten Sie eine Live-Interaktiv-Karte jeder Datenbank, Tabelle, jedes Dienstes und Speicher-Buckets – mit Echtzeit-Health-Monitoring.
graph-go ist ein CLI-first Infrastruktur-Mapper. Es erkennt Ihre Infrastruktur automatisch, indem es eine Verbindung zum Docker-Daemon herstellt, laufende Container inspiziert und Datenbanken sowie Speicherdienste abfragt. Die UI wird vom Backend bereitgestellt und spiegelt den echten Backend-Status wider – kein manuelles Inventar erforderlich.
| Fähigkeit | Details |
|---|---|
| Auto-Discovery | Erkennt Infrastruktur aus Docker-Containern und Kubernetes-Clustern – kein manuelles Inventar erforderlich |
| Kubernetes | Namespaces, Deployments, StatefulSets, DaemonSets, Pods, Services – mit informer-basiertem Echtzeit-Watching |
| Docker | Klassifiziert laufende Container, extrahiert Anmeldedaten, beobachtet Docker-Ereignisse, berücksichtigt graphgo.*-Labels zur Überschreibung von Typ/DSN/Node-Typ/Name oder zum Ignorieren eines Containers |
| PostgreSQL | Tabellen, Fremdschlüsselbeziehungen, Schema-Topologie |
| MongoDB | Datenbanken und Collections |
| MySQL | Tabellen, Fremdschlüsselbeziehungen |
| Redis | Keyspaces und Key-Verteilung |
| Elasticsearch | Indizes, Cluster-Health, Shard-Status |
| S3 / MinIO | Buckets und Top-Level-Prefixes |
| HTTP-Dienste | Health-Endpunkte, Abhängigkeitszuordnung zwischen Diensten |
| Echtzeit-Health | WebSocket-gestützte Live-Status-Updates alle 5 Sekunden |
| Interaktiver Graph | Swimlane-Layout, Namespace-Gruppencontainer, Pan/Zoom, Filter nach Typ/Health, Knotensuche |
graph-go respektiert eine kleine Anzahl von graphgo.*-Container-Labels (setzen Sie diese auf jedem Container, den Sie kontrollieren möchten):
Verwenden Sie diese, um falsch klassifizierte Container zu korrigieren, graph-go auf eine benutzerdefinierte DSN zu lenken oder einen Container aus dem Graphen auszublenden, ohne ihn zu entfernen.
Starten Sie den vorkonfigurierten Demo-Stack mit der CLI. Dies ist der schnellste Weg, graph-go in einer realistischen Umgebung zu sehen und der empfohlene Onboarding-Pfad für Erstbenutzer:
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
Öffnen Sie http://localhost:8080. Der Befehl läuft als attachter Docker Compose-Container. Drücken Sie Ctrl+C, um die Sitzung zu beenden.
Der erste Start kann auf einem kalten Rechner mehrere Minuten dauern, da Docker möglicherweise Basis-Images herunterladen und die lokalen Demo-Images erstellen muss. Spätere Starts sind viel schneller.
Der Demo-Stack erwartet, dass die folgenden Host-Ports frei sind: 8080, 5432, 27017, 9000 und 9001.
Falls Sie einen expliziten Teardown benötigen:
docker compose -f docker-compose.demo.yml down
Ein Container, ein Port. Mounten Sie den Docker-Socket schreibgeschützt und graph-go erkennt automatisch alles, was auf dem Host läuft:
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 liest nur vom Docker-Socket. Das
:ro-Flag erzwingt dies – behalten Sie es bei.
Öffnen Sie http://localhost:8080. Auto-Discovery behandelt Docker-Container und (wenn eine Kubeconfig oder ein In-Cluster-Service-Account vorhanden ist) Kubernetes-Ressourcen ohne Konfigurationsdatei.
Für Dienste außerhalb von Docker/Kubernetes (Remote-Datenbanken, Managed-Cloud-Dienste) mounten Sie eine Konfigurationsdatei – siehe Konfiguration.
Einzige eigenständige Binärdatei – UI ist eingebettet, aber der Einstiegspunkt bleibt die CLI.
# Linux amd64 (erfordert die GitHub-CLI; andere Plattformen in den Releases durchsuchen)
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 # oder einfach `./graph-go` – dasselbe
Öffnen Sie http://localhost:8080. Andere Plattformen auf der Releases-Seite.
Globale Flags (für jeden Unterbefehl): --config, --log-level, --log-format. Siehe graph-go <command> --help für die vollständige befehlsspezifische Oberfläche.
Typischer Ablauf:
graph-go demo für einen realistischen lokalen Durchlauf.graph-go serve zur Ausführung gegen Ihre eigene Infrastruktur.graph-go scan für einmalige Automatisierung, Exporte oder CI-Checks.| Port | Zweck |
|---|---|
8080 | graph-go (UI + API + WebSocket – Produktion) |
5173 | Vite-Entwicklungsserver (nur Entwicklung – siehe CONTRIBUTING.md) |
Auto-Discovery ist der Weg. Mounten Sie den Docker-Socket und/oder führen Sie ihn innerhalb eines Kubernetes-Clusters aus – graph-go erkennt Ihre Infrastruktur ohne Konfigurationsdatei.
Verwenden Sie die YAML-Konfiguration (conf/config.yaml) nur als Notausstieg für Dienste, die nicht über Discovery erreichbar sind – Remote-Datenbanken, Managed Cloud Services, externe Endpunkte. Siehe conf/config.sample.yaml für das vollständige Schema – Beispiele für jeden Adapter und jeden Konfigurationsblock (server, docker, kubernetes, connections).
Zur Verwendung einer Konfigurationsdatei mit dem obigen Docker-Run:
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
Nur für autorisierte Nutzung: graph-go dient der Visualisierung von Infrastruktur, die Ihnen gehört oder auf die Sie Zugriff haben. Richten Sie es nicht gegen Systeme ohne Autorisierung.
┌─────────────────────────────────────┐
│ 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)
Schlüsselkomponenten:
Discover, Watch, Close) für alle Discovery-Backends – Docker und Kubernetes laufen parallel, Ergebnisse werden zusammengeführtAdapter-Interface zum Abfragen von Datenbanken und SpeicherdienstenAdapter-entdeckt:
Service-Knoten (postgres/mongodb/s3)
└─ Datenbank/Bucket-Knoten
└─ Tabelle/Collection/Prefix-Knoten
Kubernetes-entdeckt:
Namespace (Gruppencontainer)
└─ Deployment / StatefulSet / DaemonSet
└─ Pod
└─ K8sService ──routes_to──→ Pod
Kanten repräsentieren Beziehungen (contains, foreign_key, routes_to usw.).
Backend:
Frontend:
Infrastruktur:
go test ./...
Läuft ohne Docker. Enthält reine Funktionstests und HTTP-Handler-Tests.
go test -tags=integration -v -timeout=5m ./internal/adapters/...
Erfordert Docker. Verwendet testcontainers-go, um reale Datenbankinstanzen (PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, MinIO) zu starten – keine Mocks.
Jeder Adapter durchläuft die Vertragstestsuite (adaptertest.RunContractTests), die Folgendes validiert:
Führen Sie die Tests eines einzelnen Adapters aus:
go test -tags=integration -v ./internal/adapters/redis/
make test # unit + type-check
go test -tags=integration -timeout=5m ./internal/adapters/... # integration
/api/graphGibt den vollständigen Infrastrukturgraphen (Knoten + Kanten) zurück.
Antwort:
{
"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}Gibt Details zu einem bestimmten Knoten zurück.
/api/healthGibt den Adapter-Health-Status zurück (ok/degraded/error).
/websocketStreamt Echtzeit-Updates. Es werden zwei Nachrichtentypen ausgegeben, beide verpackt als { "type": "...", "payload": { ... } }. Es gibt kein timestamp-Feld – Clients leiten die Reihenfolge durch Ankunft ab.
health_update – wird für jeden Knoten einmal pro Durchlauf (alle 5s) gesendet. Adapter-eigene Knoten erhalten Health über die Adapter-Suche; Topologie-Knoten (z. B. Kubernetes-Ressourcen) tragen Health direkt auf dem Knoten.
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health ist einer von healthy, degraded, unhealthy.
graph_update – wird gesendet, wenn sich der Satz der Knoten-IDs ändert (ein Knoten wurde durch Discovery hinzugefügt oder entfernt). payload ist leer; Clients sollten /api/graph erneut abrufen.
{
"type": "graph_update",
"payload": {}
}
internal/adapters/{name}/Adapter-Interface implementieren:
type Adapter interface {
Connect(config ConnectionConfig) error
Discover() ([]nodes.Node, []edges.Edge, error)
Health() (HealthMetrics, error)
Close() error
}
init() mit adapters.RegisterFactory("name", ...){name}_integration_test.go mit:
//go:build integrationTestMain mit testcontainers-go, um eine reale Instanz zu startenadaptertest.RunContractTests aufrufen, um das Interface-Vertrag zu validiereninternal/server/server.go (Blank-Import für )Discoverer leben in internal/discovery/{name}/ und implementieren das Discoverer-Interface:
type Discoverer interface {
Name() string
Discover(ctx context.Context) ([]ServiceInfo, error)
Watch(ctx context.Context, onChange func()) error
Close() error
}
internal/discovery/{name}/Discoverer-Interface implementieren – geben Sie []ServiceInfo von Discover() zurück. Topologie-erzeugende Discoverer (wie K8s) füllen Nodes/Edges direkt; adapterorientierte (wie Docker) füllen Config für das Adapter-Bridging.internal/server/server.go – fügen Sie eine build{Name}Discovery()-Funktion hinzu und rufen Sie sie parallel zu den bestehenden Discoverern auf.//go:build integration – verwenden Sie echte Infrastruktur (kind/k3d für K8s, testcontainers für andere). Keine Mocks.Siehe CONTRIBUTING.md für detaillierte Anleitungen.
Wir freuen uns über Beiträge! Siehe CONTRIBUTING.md für Richtlinien zu:
Bestimmungsgemäße Verwendung:
Nicht vorgesehen für:
Benutzer sind dafür verantwortlich, sicherzustellen, dass sie vor dem Verbinden von graph-go mit jeglicher Infrastruktur über die entsprechende Autorisierung verfügen.
Dieses Projekt ist unter der GNU Affero General Public License v3.0 (AGPL-3.0) lizenziert.
Siehe LICENSE-Datei für Details. AGPL erfordert, dass modifizierte Versionen, die über ein Netzwerk genutzt werden, ebenfalls quelloffen sein müssen.
Das Projekt verwendet GitHub Actions für kontinuierliche Integration und automatisierte Releases.
main ausgeführt – Backend-Unit-Tests, Integrationstests (testcontainers) und Frontend-Buildv*) ausgelöst und erzeugen:
ghcr.io/guilherme-grimm/graph-go gesendet wirdSo erstellen Sie ein Release:
git tag v0.1.0
git push --tags
Mit ❤️ für DevOps- und Infrastruktur-Ingenieure entwickelt
| Label | Wirkung |
|---|
graphgo.ignore=true | Diesen Container vollständig überspringen |
graphgo.type=postgres | Erzwingt den Adaptertyp (postgres, mongodb, mysql, redis, elasticsearch, s3, http) |
graphgo.dsn=... | Injiziert einen Verbindungsstring (DSN für postgres/mysql, URI für mongodb, fällt auf dsn zurück, falls nicht anders) |
graphgo.node-type=gateway | Überschreibt den visuellen Knotentyp (service, gateway, auth, api, queue, cache) |
graphgo.name=... | Überschreibt den im Graphen angezeigten Knotennamen, der auch in Knoten-IDs/Logs verwendet wird |
| Befehl | Wirkung |
|---|
graph-go demo | Startet den vorkonfigurierten Docker Compose-Demo-Stack aus dem Repository und gibt dessen Ausgabe im Vordergrund aus. |
graph-go serve | Startet den HTTP-Server mit Auto-Discovery und Live-Updates (Standard – gleich wie Aufruf ohne Argumente). |
graph-go scan | Führt Discovery einmalig aus und gibt den Graphen als JSON nach stdout aus. Nützlich für Weiterleitung an jq, CI-Checks oder einmalige Exporte. |
graph-go version | Gibt Version, Commit und Build-Datum aus. |
graph-go --health-check | Ruft lokales /health auf und beendet mit 0/1. Wird vom Container-HEALTHCHECK verwendet; nicht für interaktive Nutzung. |
9001 |
| MinIO-Konsole (nur Demo-Stack) |
init()internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx