
Semplicemente nodi e grafi
Vedi la tua infrastruttura. Zero Config.
Punta graph-go sul tuo stack e ottieni una mappa interattiva e live di ogni database, tabella, servizio e bucket di storage — con monitoraggio dello stato in tempo reale.
graph-go è un mapper di infrastruttura CLI-first. Scopre automaticamente la tua infrastruttura connettendosi al demone Docker, ispezionando i container in esecuzione e sondando database e servizi di storage. L'interfaccia utente è servita dal backend e riflette lo stato reale del backend — nessun inventario manuale necessario.
| Capacità | Dettagli |
|---|---|
| Auto-scoperta | Rileva l'infrastruttura dai container Docker e dai cluster Kubernetes — nessun inventario manuale necessario |
| Kubernetes | Namespace, Deployments, StatefulSets, DaemonSets, Pods, Services — con osservazione in tempo reale basata su informer |
| Docker | Classifica i container in esecuzione, estrae le credenziali, osserva gli eventi Docker, rispetta le label graphgo.* per sovrascrivere tipo/DSN/tipo-nodo/nome o ignorare un container |
| PostgreSQL | Tabelle, relazioni di chiave esterna, topologia dello schema |
| MongoDB | Database e collezioni |
| MySQL | Tabelle, relazioni di chiave esterna |
| Redis | Keyspaces e distribuzione delle chiavi |
| Elasticsearch | Indici, stato del cluster, stato degli shard |
| S3 / MinIO | Bucket e prefissi di primo livello |
| Servizi HTTP | Endpoint di health, mappatura delle dipendenze tra servizi |
| Stato in tempo reale | Aggiornamenti live tramite WebSocket ogni 5 secondi |
| Grafico interattivo | Layout a corsie, contenitori di gruppo per namespace, pan/zoom, filtro per tipo/stato, ricerca nodi |
graph-go rispetta un piccolo insieme di label container graphgo.* (impostale su qualsiasi container che vuoi controllare):
Usale per recuperare container classificati male, puntare graph-go verso un DSN personalizzato o nascondere un container dal grafico senza rimuoverlo.
Avvia lo stack demo preconfigurato con il CLI. Questo è il modo più veloce per vedere graph-go in un ambiente realistico ed è il percorso di onboarding previsto per i nuovi utenti:
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
Apri http://localhost:8080. Il comando viene eseguito in primo piano tramite Docker Compose. Premi Ctrl+C per fermare la sessione.
La prima esecuzione può richiedere diversi minuti su una macchina "fredda" perché Docker potrebbe dover scaricare le immagini di base e costruire le immagini demo locali. Le esecuzioni successive sono molto più veloci.
Lo stack demo richiede che queste porte host siano libere: 8080, 5432, 27017, 9000 e 9001.
Se hai bisogno di un abbattimento esplicito in seguito:
docker compose -f docker-compose.demo.yml down
Un container, una porta. Monta il socket Docker in sola lettura e graph-go scopre automaticamente tutto ciò che è in esecuzione sull'host:
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 legge solo dal socket Docker. Il flag
:rolo impone — mantienilo.
Apri http://localhost:8080. L'auto-scoperta gestisce i container Docker e (quando è presente un kubeconfig o un account di servizio in-cluster) le risorse Kubernetes senza alcun file di configurazione.
Per servizi che vivono al di fuori di Docker/Kubernetes (database remoti, servizi cloud gestiti), monta un file di configurazione — vedi Configurazione.
Singolo binario autonomo — l'interfaccia utente è inclusa, ma il punto di ingresso è sempre il CLI.
# Linux amd64 (richiede il CLI di GitHub; cerca nella sezione Releases altre piattaforme)
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 # oppure `./graph-go` - fa la stessa cosa
Apri http://localhost:8080. Altre piattaforme nella pagina Releases.
Flag globali (si applicano a ogni sottocomando): --config, --log-level, --log-format. Vedi graph-go <comando> --help per la superficie completa di ogni comando.
Flusso tipico:
graph-go demo per una dimostrazione realistica locale.graph-go serve per eseguire sulla tua infrastruttura.graph-go scan per automazione una tantum, esportazioni o controlli CI.| Porta | Scopo |
|---|---|
8080 | graph-go (UI + API + WebSocket — produzione) |
5173 | Server di sviluppo Vite (solo sviluppo — vedi CONTRIBUTING.md) |
L'auto-scoperta è la via maestra. Monta il socket Docker e/o esegui all'interno di un cluster Kubernetes — graph-go scopre la tua infrastruttura senza bisogno di file di configurazione.
Usa il file di configurazione YAML (conf/config.yaml) solo come valvola di sfogo per servizi non raggiungibili tramite scoperta — database remoti, servizi cloud gestiti, endpoint esterni. Vedi conf/config.sample.yaml per lo schema completo — esempi per ogni adapter e ogni blocco di configurazione (server, docker, kubernetes, connections).
Per usare un file di configurazione con il comando Docker sopra:
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
Uso autorizzato solo: graph-go è per visualizzare infrastrutture di tua proprietà o per cui hai permesso di accesso. Non puntarlo su sistemi senza autorizzazione.
┌─────────────────────────────────────┐
│ 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)
Componenti Chiave:
Discover, Watch, Close) per tutti i backend di scoperta — Docker e Kubernetes vengono eseguiti in parallelo, i risultati sono concatenatiAdapter per sondare database e servizi di storageScoperto da adapter:
Service Node (postgres/mongodb/s3)
└─ Database/Bucket Node
└─ Table/Collection/Prefix Node
Scoperto da Kubernetes:
Namespace (group container)
└─ Deployment / StatefulSet / DaemonSet
└─ Pod
└─ K8sService ──routes_to──→ Pod
Gli archi rappresentano relazioni (contains, foreign_key, routes_to, ecc.).
Backend:
Frontend:
Infrastruttura:
go test ./...
Viene eseguito senza Docker. Include test di funzioni pure e test degli handler HTTP.
go test -tags=integration -v -timeout=5m ./internal/adapters/...
Richiede Docker. Usa testcontainers-go per avviare istanze di database reali (PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, MinIO) — nessun mock.
Ogni adapter viene testato attraverso la suite di test del contratto (adaptertest.RunContractTests) che valida:
Esegui i test di un singolo adapter:
go test -tags=integration -v ./internal/adapters/redis/
make test # unit + type-check
go test -tags=integration -timeout=5m ./internal/adapters/... # integration
/api/graphRestituisce l'intero grafico dell'infrastruttura (nodi + archi).
Risposta:
{
"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}Restituisce i dettagli per un nodo specifico.
/api/healthRestituisce lo stato degli adapter (ok/degraded/error).
/websocketStream di aggiornamenti in tempo reale. Vengono emessi due tipi di messaggio, entrambi incapsulati come { "type": "...", "payload": { ... } }. Non c'è un campo timestamp: i client deducono l'ordine in base all'arrivo.
health_update — inviato per ogni nodo una volta per ciclo (ogni 5s). I nodi di proprietà dell'adapter ottengono lo stato tramite la ricerca dell'adapter; i nodi di topologia (es. risorse Kubernetes) portano lo stato direttamente sul nodo.
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health può essere healthy, degraded, unhealthy.
graph_update — inviato quando l'insieme degli ID dei nodi cambia (un nodo è stato aggiunto o rimosso dalla scoperta). payload è vuoto; i client dovrebbero rifare la richiesta /api/graph.
{
"type": "graph_update",
"payload": {}
}
internal/adapters/{nome}/Adapter:
type Adapter interface {
Connect(config ConnectionConfig) error
Discover() ([]nodes.Node, []edges.Edge, error)
Health() (HealthMetrics, error)
Close() error
}
init() con adapters.RegisterFactory("nome", ...){nome}_integration_test.go con:
//go:build integrationTestMain usando testcontainers-go per avviare un'istanza realeadaptertest.RunContractTests per validare il contratto dell'interfacciainternal/server/server.go (import vuoto per )I Discoverer risiedono in internal/discovery/{nome}/ e implementano l'interfaccia Discoverer:
type Discoverer interface {
Name() string
Discover(ctx context.Context) ([]ServiceInfo, error)
Watch(ctx context.Context, onChange func()) error
Close() error
}
internal/discovery/{nome}/Discoverer — restituisci []ServiceInfo da Discover(). I discoverer che producono topologia (es. K8s) popolano direttamente Nodes/Edges; quelli orientati agli adapter (es. Docker) popolano Config per il bridging con gli adapter.internal/server/server.go — aggiungi una funzione build{nome}Discovery() e chiamala insieme ai discoverer esistenti.//go:build integration — usa infrastruttura reale (kind/k3d per K8s, testcontainers per altri). Nessun mock.Vedi CONTRIBUTING.md per indicazioni dettagliate.
Accogliamo con piacere i contributi! Vedi CONTRIBUTING.md per linee guida su:
Uso Inteso:
Non Inteso Per:
Gli utenti sono responsabili di assicurarsi di avere la dovuta autorizzazione prima di connettere graph-go a qualsiasi infrastruttura.
Questo progetto è distribuito con licenza GNU Affero General Public License v3.0 (AGPL-3.0).
Vedi il file LICENSE per i dettagli. AGPL richiede che le versioni modificate utilizzate su una rete siano anch'esse open-source.
Il progetto usa GitHub Actions per l'integrazione continua e i rilasci automatici.
main — test unitari backend, test di integrazione (testcontainers) e build frontendv*) e producono:
ghcr.io/guilherme-grimm/graph-goPer creare un rilascio:
git tag v0.1.0
git push --tags
Realizzato con ❤️ per ingegneri DevOps e dell'infrastruttura
| Label | Effetto |
|---|
graphgo.ignore=true | Salta completamente questo container |
graphgo.type=postgres | Forza il tipo di adapter (postgres, mongodb, mysql, redis, elasticsearch, s3, http) |
graphgo.dsn=... | Inietta una stringa di connessione (DSN per postgres/mysql, URI per mongodb, altrimenti usa dsn) |
graphgo.node-type=gateway | Sovrascrive il tipo di nodo visivo (service, gateway, auth, api, queue, cache) |
graphgo.name=... | Sovrascrive il nome del nodo mostrato nel grafico e usato negli ID dei nodi / log |
| Comando | Cosa fa |
|---|
graph-go demo | Avvia lo stack demo Docker Compose preconfigurato dal repository e ne mostra l'output in primo piano. |
graph-go serve | Avvia il server HTTP con auto-scoperta e aggiornamenti live (predefinito - equivale a eseguire senza argomenti). |
graph-go scan | Esegue una scoperta una tantum e restituisce il grafico come JSON su stdout. Utile per pipeline in jq, controlli CI o esportazioni monouso. |
graph-go version | Stampa versione, commit e data di build. |
graph-go --health-check | Chiama il /health locale ed esce con 0/1. Usato dal HEALTHCHECK del container; non per uso interattivo. |
9001 |
| Console MinIO (solo stack demo) |
init()internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx