
simplesmente nós e grafos
Veja sua infraestrutura. Zero Configuração.
Aponte o graph-go para seu stack e obtenha um mapa interativo e ao vivo de todos os bancos de dados, tabelas, serviços e buckets de armazenamento — com monitoramento de saúde em tempo real.
graph-go é um mapeador de infraestrutura focado em CLI. Ele descobre automaticamente sua infraestrutura conectando-se ao daemon Docker, inspecionando contêineres em execução e sondando bancos de dados e serviços de armazenamento. A interface é servida pelo backend e reflete o estado real do backend — sem necessidade de inventário manual.
| Capacidade | Detalhes |
|---|---|
| Descoberta automática | Detecta infraestrutura a partir de contêineres Docker e clusters Kubernetes — sem inventário manual |
| Kubernetes | Namespaces, Deployments, StatefulSets, DaemonSets, Pods, Services — com monitoramento em tempo real baseado em informers |
| Docker | Classifica contêineres em execução, extrai credenciais, observa eventos Docker, respeita labels graphgo.* para sobrescrever tipo/DSN/tipo-de-nó/nome ou ignorar um contêiner |
| PostgreSQL | Tabelas, relações de chave estrangeira, topologia de esquema |
| MongoDB | Bancos de dados e coleções |
| MySQL | Tabelas, relações de chave estrangeira |
| Redis | Keyspaces e distribuição de chaves |
| Elasticsearch | Índices, saúde do cluster, status de shards |
| S3 / MinIO | Buckets e prefixos de primeiro nível |
| Serviços HTTP | Endpoints de saúde, mapeamento de dependências entre serviços |
| Saúde em tempo real | Atualizações de status ao vivo via WebSocket a cada 5 segundos |
| Grafo interativo | Layout de raias (swimlane), contêineres de agrupamento por namespace, pan/zoom, filtro por tipo/saúde, busca de nós |
O graph-go respeita um conjunto pequeno de labels de contêiner graphgo.* (defina-as em qualquer contêiner que deseja controlar):
Use estas para resgatar contêineres mal classificados, apontar o graph-go para um DSN personalizado ou ocultar um contêiner do grafo sem removê-lo.
Inicie o stack de demonstração com dados de exemplo usando a CLI. Esta é a maneira mais rápida de ver o graph-go em um ambiente realista e o caminho de integração recomendado para novos usuários:
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
Abra http://localhost:8080. O comando é executado anexado via Docker Compose. Pressione Ctrl+C para parar a sessão anexada.
A primeira execução pode levar vários minutos em uma máquina fria porque o Docker pode precisar baixar imagens base e construir as imagens de demonstração locais. Execuções posteriores são muito mais rápidas.
O stack de demonstração espera que as seguintes portas do host estejam livres: 8080, 5432, 27017, 9000 e 9001.
Se precisar de uma desmontagem explícita após:
docker compose -f docker-compose.demo.yml down
Um contêiner, uma porta. Monte o socket do Docker como somente leitura e o graph-go descobre automaticamente tudo que está rodando no host:
docker run -d -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
ghcr.io/guilherme-grimm/graph-go:latest
O graph-go apenas lê do socket Docker. A flag
:roimpõe isso — mantenha-a.
Abra http://localhost:8080. A descoberta automática lida com contêineres Docker e (quando um kubeconfig ou conta de serviço in-cluster está presente) recursos Kubernetes sem qualquer arquivo de configuração.
Para serviços que estão fora do Docker/Kubernetes (bancos de dados remotos, serviços gerenciados em nuvem), monte um arquivo de configuração — veja Configuração.
Binário único auto-contido — a interface está embutida, mas o ponto de entrada ainda é a CLI.
# Linux amd64 (requer a CLI do GitHub; veja Releases para outras plataformas)
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 # ou apenas `./graph-go` - mesma coisa
Abra http://localhost:8080. Outras plataformas na página de Releases.
Flags globais (aplicam-se a todos os subcomandos): --config, --log-level, --log-format. Veja graph-go <comando> --help para a superfície completa de cada comando.
Fluxo típico:
graph-go demo para um passo-a-passo realista local.graph-go serve para executar contra sua própria infraestrutura.graph-go scan para automação pontual, exportações ou verificações em CI.| Porta | Propósito |
|---|---|
8080 | graph-go (UI + API + WebSocket — produção) |
5173 | Servidor de desenvolvimento Vite (apenas desenvolvimento — veja CONTRIBUTING.md) |
A descoberta automática é o caminho. Monte o socket Docker e/ou execute dentro de um cluster Kubernetes — o graph-go descobre sua infraestrutura sem necessidade de arquivo de configuração.
Use a configuração YAML (conf/config.yaml) apenas como uma saída de emergência para serviços que não são alcançáveis via descoberta — bancos de dados remotos, serviços gerenciados em nuvem, endpoints externos. Veja conf/config.sample.yaml para o esquema completo — exemplos para cada adaptador e cada bloco de configuração (server, docker, kubernetes, connections).
Para usar um arquivo de configuração com o comando Docker acima:
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 autorizado apenas: o graph-go é para visualizar infraestrutura que você possui ou tem permissão para acessar. Não o aponte para sistemas sem autorização.
┌─────────────────────────────────────┐
│ Interface Discoverer │
│ Discover() · Watch() · Close() │
└──────────┬──────────┬───────────────┘
│ │
┌──────────▼──┐ ┌────▼──────────────┐
│ Docker │ │ Kubernetes │
│ Discoverer │ │ Discoverer │
│ (contêineres,│ │ (informers, pods, │
│ classificar,│ │ deployments, │
│ eventos) │ │ serviços, saúde) │
└──────┬──────┘ └────┬──────────────┘
│ │
┌──────▼───────────────▼──────┐
│ Descoberta Paralela + Merge │
│ (concatena ServiceInfo) │
└──────────────┬──────────────┘
│
Config (YAML) ──→ Merge YAML ──────────▶│
▼
┌─────────────────────────────┐
│ Registro de Adaptadores │
│ ├─ PostgreSQL → Tabelas + FK│
│ ├─ MongoDB → Coleções │
│ ├─ MySQL → Tabelas + FK│
│ ├─ Redis → Keyspaces │
│ ├─ Elasticsearch → Índices │
│ ├─ S3 → Buckets │
│ └─ HTTP → Saúde + deps │
│ │
│ + Topologia (nós/arestas K8s) │
└──────────────┬───────────────┘
▼
Modelo de Grafo (Nós + Arestas)
▼
API REST + WebSocket (Tempo real)
Componentes Chave:
Discover, Watch, Close) para todos os backends de descoberta — Docker e Kubernetes executam em paralelo, resultados são concatenadosAdapter para sondar bancos de dados e serviços de armazenamentoDescoberta por adaptador:
Nó de Serviço (postgres/mongodb/s3)
└─ Nó de Banco de Dados/Bucket
└─ Nó de Tabela/Coleção/Prefixo
Descoberta por Kubernetes:
Namespace (contêiner de grupo)
└─ Deployment / StatefulSet / DaemonSet
└─ Pod
└─ K8sService ──rotas_para──→ Pod
Arestas representam relacionamentos (contém, chave_estrangeira, rotas_para, etc.).
Backend:
Frontend:
Infraestrutura:
go test ./...
Executa sem Docker. Inclui testes de funções puras e testes de handlers HTTP.
go test -tags=integration -v -timeout=5m ./internal/adapters/...
Requer Docker. Usa testcontainers-go para iniciar instâncias reais de bancos de dados (PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, MinIO) — sem mocks.
Cada adaptador passa pela suíte de teste de contrato (adaptertest.RunContractTests) que valida:
Execute testes de um único adaptador:
go test -tags=integration -v ./internal/adapters/redis/
make test # unitários + verificação de tipos
go test -tags=integration -timeout=5m ./internal/adapters/... # integração
/api/graphRetorna o grafo completo da infraestrutura (nós + arestas).
Resposta:
{
"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}Retorna detalhes de um nó específico.
/api/healthRetorna o status de saúde dos adaptadores (ok/degraded/error).
/websocketTransmite atualizações em tempo real. Dois tipos de mensagem são emitidos, ambos encapsulados como { "type": "...", "payload": { ... } }. Não há campo timestamp — os clientes inferem a ordenação pelo momento de chegada.
health_update — enviado para cada nó uma vez por varredura (a cada 5s). Nós gerenciados por adaptadores obtêm saúde via consulta ao adaptador; nós de topologia (ex.: recursos Kubernetes) carregam saúde diretamente no nó.
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health é um dos valores: healthy, degraded, unhealthy.
graph_update — enviado quando o conjunto de IDs de nós muda (um nó foi adicionado ou removido pela descoberta). payload está vazio; os clientes devem buscar novamente /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() com adapters.RegisterFactory("nome", ...){nome}_integration_test.go com:
//go:build integrationTestMain usando testcontainers-go para iniciar uma instância realadaptertest.RunContractTests para validar o contrato da interfaceinternal/server/server.go (importação em branco para )Discoverers ficam em internal/discovery/{nome}/ e implementam a interface 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 — retorne []ServiceInfo de Discover(). Discoverers que produzem topologia (como K8s) preenchem Nodes/Edges diretamente; os orientados a adaptadores (como Docker) preenchem Config para ponte com adaptadores.internal/server/server.go — adicione uma função build{Nome}Discovery() e chame-a junto com os discoverers existentes.//go:build integration — use infraestrutura real (kind/k3d para K8s, testcontainers para outros). Sem mocks.Veja CONTRIBUTING.md para orientações detalhadas.
Aceitamos contribuições! Veja CONTRIBUTING.md para diretrizes sobre:
Uso Pretendido:
Não Pretendido Para:
Os usuários são responsáveis por garantir que possuem a devida autorização antes de conectar o graph-go a qualquer infraestrutura.
Este projeto está licenciado sob a GNU Affero General Public License v3.0 (AGPL-3.0).
Veja o arquivo LICENSE para detalhes. AGPL exige que versões modificadas usadas em rede também sejam de código aberto.
O projeto usa GitHub Actions para integração contínua e lançamentos automatizados.
main — testes unitários do backend, testes de integração (testcontainers) e build do frontendv*) e produzem:
ghcr.io/guilherme-grimm/graph-goPara criar um release:
git tag v0.1.0
git push --tags
Feito com ❤️ para engenheiros de DevOps e infraestrutura
| Label | Efeito |
|---|
graphgo.ignore=true | Ignorar este contêiner completamente |
graphgo.type=postgres | Forçar o tipo de adaptador (postgres, mongodb, mysql, redis, elasticsearch, s3, http) |
graphgo.dsn=... | Injetar uma string de conexão (DSN para postgres/mysql, URI para mongodb, caso contrário usa dsn) |
graphgo.node-type=gateway | Sobrescrever o tipo visual do nó (service, gateway, auth, api, queue, cache) |
graphgo.name=... | Sobrescrever o nome do nó mostrado no grafo e usado em IDs de nó / logs |
| Comando | O que faz |
|---|
graph-go demo | Inicia o stack de demonstração do Docker Compose com dados de exemplo a partir do repositório e exibe sua saída em primeiro plano. |
graph-go serve | Inicia o servidor HTTP com descoberta automática e atualizações ao vivo (padrão - o mesmo que executar sem argumentos). |
graph-go scan | Executa a descoberta uma vez e emite o grafo como JSON para stdout. Útil para canalizar para jq, verificações em CI ou exportações pontuais. |
graph-go version | Exibe versão, commit e data de compilação. |
graph-go --health-check | Acessa o endpoint /health local e sai com 0/1. Usado pelo HEALTHCHECK do contêiner; não para uso interativo. |
9001 | Console MinIO (apenas stack de demonstração) |
init()internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx