
simplemente nodos y grafos
Visualiza tu infraestructura. Sin configuración.
Apunta graph-go a tu stack y obtén un mapa interactivo en vivo de cada base de datos, tabla, servicio y bucket de almacenamiento — con monitoreo de salud en tiempo real.
graph-go es un mapeador de infraestructura orientado a CLI. Descubre automáticamente tu infraestructura conectándose al demonio de Docker, inspeccionando contenedores en ejecución y sondando bases de datos y servicios de almacenamiento. La interfaz de usuario es servida por el backend y refleja el estado real del backend — no se necesita inventario manual.
| Capacidad | Detalles |
|---|---|
| Auto-descubrimiento | Detecta infraestructura a partir de contenedores Docker y clústeres Kubernetes — no se necesita inventario manual |
| Kubernetes | Namespaces, Deployments, StatefulSets, DaemonSets, Pods, Services — con monitoreo en tiempo real basado en informers |
| Docker | Clasifica contenedores en ejecución, extrae credenciales, observa eventos de Docker, respeta las etiquetas graphgo.* para sobrescribir tipo/DSN/tipo-nodo/nombre o ignorar un contenedor |
| PostgreSQL | Tablas, relaciones de claves foráneas, topología de esquemas |
| MongoDB | Bases de datos y colecciones |
| MySQL | Tablas, relaciones de claves foráneas |
| Redis | Keyspaces y distribución de claves |
| Elasticsearch | Índices, salud del clúster, estado de shards |
| S3 / MinIO | Buckets y prefijos de primer nivel |
| Servicios HTTP | Endpoints de salud, mapeo de dependencias entre servicios |
| Salud en tiempo real | Actualizaciones en vivo vía WebSocket cada 5 segundos |
| Grafo interactivo | Disposición en carriles, contenedores de grupo por namespace, panorámica/zoom, filtrado por tipo/salud, búsqueda de nodos |
graph-go respeta un conjunto pequeño de etiquetas de contenedor graphgo.* (configúralas en cualquier contenedor que desees controlar):
Úsalas para rescatar contenedores mal clasificados, apuntar graph-go a un DSN personalizado, u ocultar un contenedor del grafo sin eliminarlo.
Inicia el stack de demostración precargado con la CLI. Esta es la forma más rápida de ver graph-go en un entorno realista y la ruta de incorporación prevista para nuevos usuarios:
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
Abre http://localhost:8080. El comando se ejecuta adjunto mediante Docker Compose. Presiona Ctrl+C para detener la sesión adjunta.
La primera ejecución puede tardar varios minutos en una máquina fría porque Docker puede necesitar descargar imágenes base y construir las imágenes locales de demostración. Las ejecuciones posteriores son mucho más rápidas.
El stack de demostración espera que estos puertos del host estén libres: 8080, 5432, 27017, 9000 y 9001.
Si necesitas una limpieza explícita después:
docker compose -f docker-compose.demo.yml down
Un contenedor, un puerto. Monta el socket de Docker en modo solo lectura y graph-go descubre automáticamente todo lo que se ejecuta en el 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 solo lee del socket de Docker. La bandera
:rolo impone — mantenla.
Abre http://localhost:8080. El auto-descubrimiento maneja los contenedores Docker y (cuando hay un kubeconfig o una cuenta de servicio dentro del clúster) los recursos de Kubernetes sin necesidad de archivo de configuración.
Para servicios que viven fuera de Docker/Kubernetes (bases de datos remotas, servicios gestionados en la nube), monta un archivo de configuración — consulta Configuración.
Binario único autocontenido — la interfaz de usuario está incrustada, pero el punto de entrada sigue siendo la CLI.
# Linux amd64 (requiere GitHub CLI; consulta Releases para otras 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 # o simplemente `./graph-go` — es lo mismo
Abre http://localhost:8080. Otras plataformas en la página de Releases.
Banderas globales (aplican a todos los subcomandos): --config, --log-level, --log-format. Consulta graph-go <comando> --help para la superficie completa por comando.
Flujo típico:
graph-go demo para un recorrido local realista.graph-go serve para ejecutar contra tu propia infraestructura.graph-go scan para automatización puntual, exportaciones o comprobaciones CI.| Puerto | Propósito |
|---|---|
8080 | graph-go (UI + API + WebSocket — producción) |
5173 | Servidor de desarrollo Vite (solo desarrollo — consulta CONTRIBUTING.md) |
El auto-descubrimiento es el camino. Monta el socket de Docker y/o ejecuta dentro de un clúster de Kubernetes — graph-go descubre tu infraestructura sin necesidad de archivo de configuración.
Usa la configuración YAML (conf/config.yaml) solo como una vía de escape para servicios que no son alcanzables mediante descubrimiento — bases de datos remotas, servicios gestionados en la nube, endpoints externos. Consulta conf/config.sample.yaml para el esquema completo — ejemplos para cada adaptador y cada bloque de configuración (server, docker, kubernetes, connections).
Para usar un archivo de configuración con el Docker run anterior:
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 únicamente: graph-go es para visualizar infraestructura que posees o para la que tienes permiso de acceso. No lo apuntes a sistemas sin autorización.
┌─────────────────────────────────────┐
│ Interfaz Discoverer │
│ Discover() · Watch() · Close() │
└──────────┬──────────┬───────────────┘
│ │
┌──────────▼──┐ ┌────▼──────────────┐
│ Docker │ │ Kubernetes │
│ Discoverer │ │ Discoverer │
│ (contened., │ │ (informers, pods, │
│ clasificar,│ │ deployments, │
│ eventos) │ │ servicios, salud) │
└──────┬──────┘ └────┬──────────────┘
│ │
┌──────▼───────────────▼──────┐
│ Descubrimiento Paralelo + │
│ Fusión (concatena ServiceInfo) │
└──────────────┬──────────────┘
│
Config (YAML) ──→ Fusión YAML ─────────▶│
▼
┌─────────────────────────────┐
│ Registro de Adaptadores │
│ ├─ PostgreSQL → Tablas + FK│
│ ├─ MongoDB → Colecciones │
│ ├─ MySQL → Tablas + FK │
│ ├─ Redis → Keyspaces │
│ ├─ Elasticsearch → Índices │
│ ├─ S3 → Buckets │
│ └─ HTTP → Salud + dep. │
│ │
│ + Topología (nodos/aristas K8s) │
└──────────────┬───────────────┘
▼
Modelo de Grafo (Nodos + Aristas)
▼
API REST + WebSocket (Tiempo real)
Componentes clave:
Discover, Watch, Close) para todos los backends de descubrimiento — Docker y Kubernetes se ejecutan en paralelo, los resultados se concatenanAdapter para sondear bases de datos y servicios de almacenamientoDescubiertos por adaptador:
Nodo de Servicio (postgres/mongodb/s3)
└─ Nodo de Base de Datos/Bucket
└─ Nodo de Tabla/Colección/Prefijo
Descubiertos por Kubernetes:
Namespace (contenedor de grupo)
└─ Deployment / StatefulSet / DaemonSet
└─ Pod
└─ K8sService ──rutas_a──→ Pod
Las aristas representan relaciones (contains, foreign_key, routes_to, etc.).
Backend:
Frontend:
Infraestructura:
go test ./...
Se ejecutan sin Docker. Incluye pruebas de funciones puras y pruebas de manejadores HTTP.
go test -tags=integration -v -timeout=5m ./internal/adapters/...
Requiere Docker. Usa testcontainers-go para levantar instancias reales de bases de datos (PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, MinIO) — sin mocks.
Cada adaptador ejecuta la suite de pruebas de contrato (adaptertest.RunContractTests) que valida:
Ejecutar las pruebas de un solo adaptador:
go test -tags=integration -v ./internal/adapters/redis/
make test # unitarias + verificación de tipos
go test -tags=integration -timeout=5m ./internal/adapters/... # integración
/api/graphDevuelve el grafo completo de la infraestructura (nodos + aristas).
Respuesta:
{
"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}Devuelve los detalles de un nodo específico.
/api/healthDevuelve el estado de salud del adaptador (ok/degraded/error).
/websocketTransmite actualizaciones en tiempo real. Se emiten dos tipos de mensaje, ambos envueltos como { "type": "...", "payload": { ... } }. No hay campo timestamp — los clientes infieren el orden por la llegada.
health_update — enviado para cada nodo una vez por barrido (cada 5s). Los nodos propiedad del adaptador obtienen salud mediante la búsqueda del adaptador; los nodos de topología (ej. recursos Kubernetes) llevan la salud directamente en el nodo.
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health es uno de healthy, degraded, unhealthy.
graph_update — se envía cuando cambia el conjunto de IDs de nodos (se añadió o eliminó un nodo por descubrimiento). payload está vacío; los clientes deben volver a obtener /api/graph.
{
"type": "graph_update",
"payload": {}
}
internal/adapters/{nombre}/Adapter:
type Adapter interface {
Connect(config ConnectionConfig) error
Discover() ([]nodes.Node, []edges.Edge, error)
Health() (HealthMetrics, error)
Close() error
}
init() con adapters.RegisterFactory("nombre", ...){nombre}_integration_test.go con:
//go:build integrationTestMain usando testcontainers-go para iniciar una instancia realadaptertest.RunContractTests para validar el contrato de la interfazinternal/server/server.go (importación en blanco para )Los Discoverers viven en internal/discovery/{nombre}/ e implementan la interfaz Discoverer:
type Discoverer interface {
Name() string
Discover(ctx context.Context) ([]ServiceInfo, error)
Watch(ctx context.Context, onChange func()) error
Close() error
}
internal/discovery/{nombre}/Discoverer — devolver []ServiceInfo desde Discover(). Los discoverers que producen topología (como K8s) llenan Nodes/Edges directamente; los orientados a adaptadores (como Docker) llenan Config para el puente de adaptadores.internal/server/server.go — agregar una función build{Name}Discovery() y llamarla junto con los discoverers existentes.//go:build integration — usar infraestructura real (kind/k3d para K8s, testcontainers para otros). Sin mocks.Consulta CONTRIBUTING.md para una guía detallada.
¡Aceptamos contribuciones! Consulta CONTRIBUTING.md para pautas sobre:
Uso previsto:
No previsto para:
Los usuarios son responsables de asegurarse de tener la autorización adecuada antes de conectar graph-go a cualquier infraestructura.
Este proyecto está licenciado bajo la GNU Affero General Public License v3.0 (AGPL-3.0).
Consulta el archivo LICENSE para más detalles. AGPL requiere que las versiones modificadas utilizadas a través de una red también se publiquen como código abierto.
El proyecto usa GitHub Actions para integración continua y lanzamientos automatizados.
main — pruebas unitarias del backend, pruebas de integración (testcontainers) y compilación del frontendv*) y producen:
ghcr.io/guilherme-grimm/graph-goPara crear un release:
git tag v0.1.0
git push --tags
Construido con ❤️ para ingenieros de DevOps e infraestructura
| Etiqueta | Efecto |
|---|
graphgo.ignore=true | Omitir este contenedor por completo |
graphgo.type=postgres | Forzar el tipo de adaptador (postgres, mongodb, mysql, redis, elasticsearch, s3, http) |
graphgo.dsn=... | Inyectar una cadena de conexión (DSN para postgres/mysql, URI para mongodb; de lo contrario, recurre a dsn) |
graphgo.node-type=gateway | Sobrescribir el tipo de nodo visual (service, gateway, auth, api, queue, cache) |
graphgo.name=... | Sobrescribir el nombre del nodo mostrado en el grafo y usado en IDs de nodo / registros |
| Comando | Qué hace |
|---|
graph-go demo | Inicia el stack de demostración Docker Compose precargado desde el repositorio y transmite su salida en primer plano. |
graph-go serve | Inicia el servidor HTTP con auto-descubrimiento y actualizaciones en vivo (predeterminado — igual que ejecutar sin argumentos). |
graph-go scan | Ejecuta el descubrimiento una vez y emite el grafo como JSON a stdout. Útil para canalizar a jq, comprobaciones CI o exportaciones puntuales. |
graph-go version | Imprime versión, commit y fecha de compilación. |
graph-go --health-check | Verifica el endpoint local /health y sale con 0/1. Usado por el HEALTHCHECK del contenedor; no para uso interactivo. |
9001 | Consola MinIO (solo stack de demostración) |
init()internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx