
simplement des nœuds et des graphes
Visualisez votre infrastructure. Zéro configuration.
Pointez graph-go sur votre pile et obtenez une carte interactive en direct de chaque base de données, table, service et compartiment de stockage — avec une surveillance de santé en temps réel.
graph-go est un mappeur d'infrastructure en ligne de commande. Il découvre automatiquement votre infrastructure en se connectant au démon Docker, en inspectant les conteneurs en cours d'exécution et en sondant les bases de données et les services de stockage. L'interface utilisateur est servie par le backend et reflète l'état réel du backend — pas d'inventaire manuel nécessaire.
| Capacité | Détails |
|---|---|
| Auto-découverte | Détecte l'infrastructure à partir des conteneurs Docker et des clusters Kubernetes — aucun inventaire manuel nécessaire |
| Kubernetes | Espaces de noms, Déploiements, StatefulSets, DaemonSets, Pods, Services — avec surveillance en temps réel basée sur les informateurs |
| Docker | Classe les conteneurs en cours d'exécution, extrait les identifiants, surveille les événements Docker, honore les étiquettes graphgo.* pour remplacer le type/DSN/type de nœud/nom ou ignorer un conteneur |
| PostgreSQL | Tables, relations de clés étrangères, topologie du schéma |
| MongoDB | Bases de données et collections |
| MySQL | Tables, relations de clés étrangères |
| Redis | Keyspaces et distribution des clés |
| Elasticsearch | Index, santé du cluster, état des fragments |
| S3 / MinIO | Compartiments et préfixes de premier niveau |
| Services HTTP | Points de terminaison de santé, cartographie des dépendances entre services |
| Santé en temps réel | Mises à jour d'état en direct via WebSocket toutes les 5 secondes |
| Graphe interactif | Disposition en couloirs, conteneurs de groupes d'espaces de noms, panoramique/zoom, filtrage par type/santé, recherche de nœuds |
graph-go respecte un petit ensemble d'étiquettes de conteneur graphgo.* (définissez-les sur tout conteneur que vous souhaitez contrôler) :
Utilisez-les pour rattraper les conteneurs mal classifiés, pointer graph-go vers un DSN personnalisé, ou masquer un conteneur du graphe sans le supprimer.
Lancez la pile de démonstration préconfigurée avec la CLI. C'est le moyen le plus rapide de voir graph-go dans un environnement réaliste et le chemin d'intégration prévu pour les nouveaux utilisateurs :
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
Ouvrez http://localhost:8080. La commande s'exécute attachée via Docker Compose. Appuyez sur Ctrl+C pour arrêter la session attachée.
La première exécution peut prendre plusieurs minutes sur une machine froide car Docker peut avoir besoin de télécharger les images de base et de construire les images de démonstration locales. Les exécutions suivantes sont beaucoup plus rapides.
La pile de démonstration s'attend à ce que les ports hôtes suivants soient libres : 8080, 5432, 27017, 9000, et 9001.
Si vous avez besoin d'un démontage explicite après :
docker compose -f docker-compose.demo.yml down
Un conteneur, un port. Montez le socket Docker en lecture seule et graph-go découvre automatiquement tout ce qui tourne sur l'hôte :
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 ne fait que lire le socket Docker. Le flag
:roimpose cela — conservez-le.
Ouvrez http://localhost:8080. L'auto‑découverte gère les conteneurs Docker et (lorsqu'un kubeconfig ou un compte de service in‑cluster est présent) les ressources Kubernetes sans aucun fichier de configuration.
Pour les services qui vivent en dehors de Docker/Kubernetes (bases de données distantes, services cloud gérés), montez un fichier de configuration — voir Configuration.
Binaire unique autonome — l'interface utilisateur est intégrée, mais le point d'entrée reste la CLI.
# Linux amd64 (nécessite GitHub CLI ; parcourez les Releases pour d'autres plateformes)
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 simplement `./graph-go` — c'est pareil
Ouvrez http://localhost:8080. Autres plateformes sur la page Releases.
Flags globaux (s'appliquent à chaque sous‑commande) : --config, --log-level, --log-format. Voir graph-go <commande> --help pour la surface complète par commande.
Flux typique :
graph-go demo pour une démonstration locale réaliste.graph-go serve pour exécuter contre votre propre infrastructure.graph-go scan pour une automatisation ponctuelle, des exports ou des vérifications CI.| Port | Objectif |
|---|---|
8080 | graph-go (interface utilisateur + API + WebSocket — production) |
5173 | Serveur de développement Vite (développement uniquement — voir CONTRIBUTING.md) |
L'auto‑découverte est le chemin. Montez le socket Docker et/ou exécutez à l'intérieur d'un cluster Kubernetes — graph-go découvre votre infrastructure sans aucun fichier de configuration nécessaire.
Utilisez la configuration YAML (conf/config.yaml) uniquement comme échappatoire pour les services qui ne sont pas atteignables via la découverte — bases de données distantes, services cloud gérés, points de terminaison externes. Voir conf/config.sample.yaml pour le schéma complet — exemples pour chaque adaptateur et chaque bloc de configuration (server, docker, kubernetes, connections).
Pour utiliser un fichier de configuration avec l'exécution Docker ci-dessus :
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
Utilisation autorisée uniquement : graph-go est destiné à visualiser l'infrastructure que vous possédez ou pour laquelle vous avez la permission d'accéder. Ne le pointez pas vers des systèmes sans autorisation.
┌─────────────────────────────────────┐
│ Interface Discoverer │
│ Discover() · Watch() · Close() │
└──────────┬──────────┬───────────────┘
│ │
┌──────────▼──┐ ┌────▼──────────────┐
│ Docker │ │ Kubernetes │
│ Discoverer │ │ Discoverer │
│ (conteneurs,│ │ (informateurs, │
│ classifie, │ │ pods, │
│ événements)│ │ déploiements, │
│ │ │ services, santé) │
└──────┬──────┘ └────┬──────────────┘
│ │
┌──────▼───────────────▼──────┐
│ Découverte parallèle + │
│ Fusion (concaténer │
│ ServiceInfo) │
└──────────────┬──────────────┘
│
Config (YAML) ──→ Fusion YAML ──────────▶│
▼
┌─────────────────────────────┐
│ Registre d'adaptateurs │
│ ├─ PostgreSQL → Tables + FK │
│ ├─ MongoDB → Collections │
│ ├─ MySQL → Tables + FK │
│ ├─ Redis → Keyspaces │
│ ├─ Elasticsearch → Indexes │
│ ├─ S3 → Compartiments│
│ └─ HTTP → Santé + dép. │
│ │
│ + Topologie (nœuds/arêtes K8s)│
└──────────────┬───────────────┘
▼
Modèle de graphe (Nœuds + Arêtes)
▼
API REST + WebSocket (Temps réel)
Composants clés :
Discover, Watch, Close) pour tous les backends de découverte — Docker et Kubernetes s'exécutent en parallèle, les résultats sont concaténésAdapter pour sonder les bases de données et services de stockageDécouvert par adaptateur :
Nœud de service (postgres/mongodb/s3)
└─ Nœud de base de données/compartiment
└─ Nœud de table/collection/préfixe
Découvert par Kubernetes :
Espace de noms (conteneur de groupe)
└─ Déploiement / StatefulSet / DaemonSet
└─ Pod
└─ Service K8s ──routes_vers──→ Pod
Les arêtes représentent des relations (contient, clé_étrangère, routes_vers, etc.).
Backend :
Frontend :
Infrastructure :
go test ./...
S'exécute sans Docker. Inclut des tests de fonctions pures et des tests de gestionnaires HTTP.
go test -tags=integration -v -timeout=5m ./internal/adapters/...
Nécessite Docker. Utilise testcontainers-go pour lancer des instances de bases de données réelles (PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, MinIO) — pas de simulations.
Chaque adaptateur passe par la suite de tests contractuels (adaptertest.RunContractTests) qui valide :
Exécuter les tests d'un seul adaptateur :
go test -tags=integration -v ./internal/adapters/redis/
make test # unitaires + vérification de type
go test -tags=integration -timeout=5m ./internal/adapters/... # intégration
/api/graphRetourne le graphe complet de l'infrastructure (nœuds + arêtes).
Réponse :
{
"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}Retourne les détails d'un nœud spécifique.
/api/healthRetourne l'état de santé de l'adaptateur (ok/dégradé/erreur).
/websocketDiffuse des mises à jour en temps réel. Deux types de messages sont émis, tous deux encapsulés comme { "type": "...", "payload": { ... } }. Il n'y a pas de champ timestamp — les clients déduisent l'ordre par arrivée.
health_update — envoyé pour chaque nœud une fois par cycle (toutes les 5 s). Les nœuds possédés par un adaptateur obtiennent leur santé via la recherche d'adaptateur ; les nœuds de topologie (par exemple, ressources Kubernetes) portent leur santé directement sur le nœud.
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health peut valoir healthy, degraded ou unhealthy.
graph_update — envoyé lorsque l'ensemble des identifiants de nœuds change (un nœud a été ajouté ou supprimé par la découverte). payload est vide ; les clients doivent re‑récupérer /api/graph.
{
"type": "graph_update",
"payload": {}
}
internal/adapters/{nom}/Adapter :
type Adapter interface {
Connect(config ConnectionConfig) error
Discover() ([]nodes.Node, []edges.Edge, error)
Health() (HealthMetrics, error)
Close() error
}
init() avec adapters.RegisterFactory("nom", ...){nom}_integration_test.go avec :
//go:build integrationTestMain utilisant testcontainers-go pour lancer une instance réelleadaptertest.RunContractTests pour valider le contrat de l'interfaceinternal/server/server.go (import vide pour )Les découvreurs se trouvent dans internal/discovery/{nom}/ et implémentent l'interface Discoverer :
type Discoverer interface {
Name() string
Discover(ctx context.Context) ([]ServiceInfo, error)
Watch(ctx context.Context, onChange func()) error
Close() error
}
internal/discovery/{nom}/Discoverer — retourner []ServiceInfo depuis Discover(). Les découvreurs producteurs de topologie (comme K8s) remplissent directement Nodes/Edges ; ceux orientés adaptateur (comme Docker) remplissent Config pour le pont adaptateur.internal/server/server.go — ajouter une fonction build{Nom}Discovery() et l'appeler aux côtés des découvreurs existants.//go:build integration — utiliser une infrastructure réelle (kind/k3d pour K8s, testcontainers pour les autres). Pas de simulations.Voir CONTRIBUTING.md pour des conseils détaillés.
Les contributions sont les bienvenues ! Voir CONTRIBUTING.md pour les directives concernant :
Utilisation prévue :
Non destiné à :
Les utilisateurs sont responsables de s'assurer qu'ils disposent des autorisations appropriées avant de connecter graph-go à une infrastructure.
Ce projet est sous licence GNU Affero General Public License v3.0 (AGPL-3.0).
Voir le fichier LICENSE pour les détails. AGPL exige que les versions modifiées utilisées sur un réseau soient également open‑source.
Le projet utilise GitHub Actions pour l'intégration continue et les releases automatisées.
main — tests unitaires backend, tests d'intégration (testcontainers) et build frontendv*) et produisent :
ghcr.io/guilherme-grimm/graph-goPour créer une release :
git tag v0.1.0
git push --tags
Construit avec ❤️ pour les ingénieurs DevOps et d'infrastructure
| Étiquette | Effet |
|---|
graphgo.ignore=true | Ignorer complètement ce conteneur |
graphgo.type=postgres | Forcer le type d'adaptateur (postgres, mongodb, mysql, redis, elasticsearch, s3, http) |
graphgo.dsn=... | Injecter une chaîne de connexion (DSN pour postgres/mysql, URI pour mongodb, sinon utilise dsn) |
graphgo.node-type=gateway | Remplacer le type de nœud visuel (service, gateway, auth, api, queue, cache) |
graphgo.name=... | Remplacer le nom du nœud affiché dans le graphe et utilisé dans les identifiants de nœud / journaux |
| Commande | Ce qu'elle fait |
|---|
graph-go demo | Lance la pile de démonstration Docker Compose préconfigurée depuis le dépôt et affiche sa sortie au premier plan. |
graph-go serve | Démarre le serveur HTTP avec auto‑découverte et mises à jour en direct (par défaut — pareil que sans arguments). |
graph-go scan | Exécute la découverte une fois et émet le graphe au format JSON sur stdout. Utile pour rediriger vers jq, vérifications CI ou exportations ponctuelles. |
graph-go version | Affiche la version, le commit et la date de construction. |
graph-go --health-check | Frappe le /health local et se termine avec 0/1. Utilisé par le HEALTHCHECK du conteneur ; pas pour une utilisation interactive. |
9001 | Console MinIO (pile de démonstration uniquement) |
init()internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx