
ببساطة العقد والرسوم البيانية
شاهد بنيتك التحتية. بدون إعدادات.
وجّه graph-go إلى بيئتك واحصل على خريطة تفاعلية حية لكل قاعدة بيانات وجدول وخدمة ومخزن تخزين — مع مراقبة صحية فورية.
graph-go هو أداة لرسم البنية التحتية تعمل من سطر الأوامر أولاً. يكتشف تلقائياً بنيتك التحتية عن طريق الاتصال بخدمة Docker، وفحص الحاويات الجارية، واختبار قواعد البيانات وخدمات التخزين. يتم تقديم واجهة المستخدم من الواجهة الخلفية وتعكس حالة الواجهة الخلفية الحقيقية — لا حاجة لجرد يدوي.
| الإمكانية | التفاصيل |
|---|---|
| الاكتشاف التلقائي | يكتشف البنية التحتية من حاويات Docker ومجموعات Kubernetes — لا حاجة لجرد يدوي |
| Kubernetes | المساحات الاسمية، النشر، StatefulSets، DaemonSets، البودات، الخدمات — مع مراقبة فورية تعتمد على informer |
| Docker | يصنف الحاويات الجارية، يستخرج بيانات الاعتماد، يراقب أحداث Docker، يحترم وسوم graphgo.* لتجاوز النوع/DSN/نوع العقدة/الاسم أو تجاهل حاوية |
| PostgreSQL | الجداول، علاقات المفاتيح الخارجية، طوبولوجيا المخطط |
| MongoDB | قواعد البيانات والمجموعات |
| MySQL | الجداول، علاقات المفاتيح الخارجية |
| Redis | مساحات المفاتيح وتوزيع المفاتيح |
| Elasticsearch | الفهارس، صحة المجموعة، حالة المشارِز |
| S3 / MinIO | المجموعات والبادئات العلوية |
| خدمات HTTP | نقاط التحقق الصحي، رسم تبعيات الخدمات |
| الصحة الفورية | تحديثات حالة حية مدعومة بـ WebSocket كل 5 ثوانٍ |
| رسم تفاعلي | تخطيط المسارات السباحية، مجموعات حاويات المساحات الاسمية، تكبير/تصغير، تصفية حسب النوع/الصحة، بحث في العقد |
يحترم graph-go مجموعة صغيرة من وسوم الحاويات graphgo.* (ضعها على أي حاوية تريد التحكم فيها):
استخدم هذه الوسوم لإنقاذ الحاويات المصنفة بشكل خاطئ، أو توجيه graph-go إلى DSN مخصص، أو إخفاء حاوية من الرسم دون إزالتها.
شغّل مجموعة العرض التوضيحي المزودة بالبيانات باستخدام CLI. هذه أسرع طريقة لرؤية graph-go في بيئة واقعية وهي المسار الموصى به للمستخدمين الجدد:
git clone https://github.com/guilherme-grimm/graph-go.git
cd graph-go
go run ./cmd/app demo
افتح http://localhost:8080. يتم تشغيل الأمر مرتبطاً عبر Docker Compose. اضغط Ctrl+C لإيقاف الجلسة المرتبطة.
قد يستغرق التشغيل الأول عدة دقائق على جهاز بارد لأن Docker قد يحتاج إلى سحب الصور الأساسية وبناء صور العرض التوضيحي المحلية. عمليات التشغيل اللاحقة أسرع بكثير.
تتوقع مجموعة العرض التوضيحي أن تكون المنافذ التالية على المضيف شاغرة: 8080, 5432, 27017, 9000, 9001.
إذا كنت بحاجة إلى إيقاف تشغيل صريح لاحقاً:
docker compose -f docker-compose.demo.yml down
حاوية واحدة، منفذ واحد. قم بتركيب مقبس Docker للقراءة فقط وسيكتشف graph-go تلقائياً كل شيء يعمل على المضيف:
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 من مقبس Docker فقط. العلم
:roيفرض هذا — حافظ عليه.
افتح http://localhost:8080. يقوم الاكتشاف التلقائي بمعالجة حاويات Docker و (عند وجود kubeconfig أو حساب خدمة داخل المجموعة) موارد Kubernetes دون أي ملف إعداد.
للخدمات التي تعيش خارج Docker/Kubernetes (قواعد بيانات عن بُعد، خدمات سحابية مُدارة)، قم بتركيب ملف إعداد — راجع الإعدادات.
برنامج ثنائي مستقل واحد — واجهة المستخدم مضمنة، ولكن نقطة الدخول لا تزال CLI.
# Linux amd64 (يتطلب GitHub CLI؛ تصفّح Releases لمنصات أخرى)
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 # أو فقط `./graph-go` — نفس الشيء
افتح http://localhost:8080. منصات أخرى على صفحة الإصدارات.
العلامات العامة (تنطبق على كل أمر فرعي): --config, --log-level, --log-format. راجع graph-go <command> --help للحصول على السطح الكامل لكل أمر.
التدفق النموذجي:
graph-go demo للحصول على جولة محلية واقعية.graph-go serve للتشغيل على بنيتك التحتية الخاصة.graph-go scan للأتمتة لمرة واحدة، أو عمليات التصدير، أو فحوصات CI.| المنفذ | الغرض |
|---|---|
8080 | graph-go (واجهة المستخدم + API + WebSocket — الإنتاج) |
5173 | خادم تطوير Vite (التطوير فقط — راجع CONTRIBUTING.md) |
الاكتشاف التلقائي هو المسار. قم بتركيب مقبس Docker و/أو التشغيل داخل مجموعة Kubernetes — يكتشف graph-go بنيتك التحتية بدون الحاجة إلى ملف إعداد.
استخدم ملف إعداد YAML (conf/config.yaml) فقط كمنفذ احتياطي للخدمات التي لا يمكن الوصول إليها عبر الاكتشاف — قواعد بيانات عن بُعد، خدمات سحابية مُدارة، نقاط نهاية خارجية. راجع conf/config.sample.yaml للحصول على المخطط الكامل — أمثلة لكل مهايئ وكل كتلة إعداد (server, docker, kubernetes, connections).
لاستخدام ملف إعداد مع تشغيل Docker أعلاه:
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
الاستخدام المصرح به فقط: graph-go مخصص لتصور البنية التحتية التي تملكها أو لديك إذن بالوصول إليها. لا توجهه إلى أنظمة دون إذن.
┌─────────────────────────────────────┐
│ 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)
المكونات الرئيسية:
Discover, Watch, Close) لجميع واجهات الاكتشاف الخلفية — يعمل Docker و Kubernetes بالتوازي، ويتم دمج النتائجAdapter لاختبار قواعد البيانات وخدمات التخزينAdapter-discovered:
Service Node (postgres/mongodb/s3)
└─ Database/Bucket Node
└─ Table/Collection/Prefix Node
Kubernetes-discovered:
Namespace (group container)
└─ Deployment / StatefulSet / DaemonSet
└─ Pod
└─ K8sService ──routes_to──→ Pod
تمثل الأطراف العلاقات (contains, foreign_key, routes_to, إلخ).
الواجهة الخلفية:
الواجهة الأمامية:
البنية التحتية:
go test ./...
تعمل بدون Docker. تتضمن اختبارات الوظائف البحتة واختبارات معالج HTTP.
go test -tags=integration -v -timeout=5m ./internal/adapters/...
تتطلب Docker. تستخدم testcontainers-go لتشغيل حالات قواعد بيانات حقيقية (PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, MinIO) — بدون محاكاة.
يعمل كل مهايئ عبر مجموعة اختبار العقد (adaptertest.RunContractTests) التي تتحقق من:
تشغيل اختبارات مهايئ واحد:
go test -tags=integration -v ./internal/adapters/redis/
make test # unit + type-check
go test -tags=integration -timeout=5m ./internal/adapters/... # integration
/api/graphتُرجع الرسم البياني الكامل للبنية التحتية (العقد + الأطراف).
الاستجابة:
{
"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}تُرجع تفاصيل عقدة معينة.
/api/healthتُرجع حالة صحة المهايئ (ok/degraded/error).
/websocketيُدفع تحديثات فورية. يتم إصدار نوعين من الرسائل، كلاهما مغلف بالشكل { "type": "...", "payload": { ... } }. لا يوجد حقل timestamp — يستنتج العملاء الترتيب من خلال الوصول.
health_update — تُرسل لكل عقدة مرة واحدة كل دورة (كل 5 ثوانٍ). العقد المملوكة للمهايئ تحصل على الصحة عبر البحث في المهايئ؛ العقد الطوبولوجية (مثل موارد Kubernetes) تحمل الصحة مباشرة على العقدة.
{
"type": "health_update",
"payload": {
"nodeId": "service-postgres",
"health": "healthy"
}
}
health هي إحدى healthy, degraded, unhealthy.
graph_update — تُرسل عندما تتغير مجموعة معرفات العقد (تمت إضافة أو إزالة عقدة بواسطة الاكتشاف). payload فارغ؛ يجب على العملاء إعادة جلب /api/graph.
{
"type": "graph_update",
"payload": {}
}
internal/adapters/{name}/Adapter:
type Adapter interface {
Connect(config ConnectionConfig) error
Discover() ([]nodes.Node, []edges.Edge, error)
Health() (HealthMetrics, error)
Close() error
}
init() باستخدام adapters.RegisterFactory("name", ...){name}_integration_test.go مع:
//go:build integrationTestMain باستخدام testcontainers-go لتشغيل مثيل حقيقيadaptertest.RunContractTests للتحقق من عقد الواجهةinternal/server/server.go (استيراد فارغ من أجل )توجد المكتشفات في internal/discovery/{name}/ وتطبق واجهة Discoverer:
type Discoverer interface {
Name() string
Discover(ctx context.Context) ([]ServiceInfo, error)
Watch(ctx context.Context, onChange func()) error
Close() error
}
internal/discovery/{name}/Discoverer — تُرجع []ServiceInfo من Discover(). المكتشفات المنتجة للطوبولوجيا (مثل K8s) تُملأ Nodes/Edges مباشرة؛ المكتشفات الموجهة للمهايئ (مثل Docker) تُملأ Config لجسر المهايئ.internal/server/server.go — أضف دالة build{Name}Discovery() واستدعها بجانب المكتشفات الموجودة.//go:build integration — استخدم بنية تحتية حقيقية (kind/k3d لـ K8s، testcontainers للآخرين). بدون محاكاة.راجع CONTRIBUTING.md للحصول على إرشادات مفصلة.
نرحب بالمساهمات! راجع CONTRIBUTING.md للحصول على إرشادات حول:
الاستخدام المقصود:
غير مخصص لـ:
المستخدمون مسؤولون عن ضمان حصولهم على الترخيص المناسب قبل توصيل graph-go بأي بنية تحتية.
هذا المشروع مرخص بموجب GNU Affero General Public License v3.0 (AGPL-3.0).
راجع ملف LICENSE للحصول على التفاصيل. تتطلب AGPL أن تكون الإصدارات المعدلة المستخدمة عبر شبكة مفتوحة المصدر أيضًا.
يستخدم المشروع GitHub Actions للتكامل المستمر والإصدارات الآلية.
main — اختبارات وحدة الواجهة الخلفية، اختبارات التكامل (testcontainers)، وبناء الواجهة الأماميةv*) وتنتج:
ghcr.io/guilherme-grimm/graph-goلإنشاء إصدار:
git tag v0.1.0
git push --tags
بُني بحب ❤️ لمهندسي DevOps والبنية التحتية
| الوسم | التأثير |
|---|
graphgo.ignore=true | تخطِّ هذه الحاوية بالكامل |
graphgo.type=postgres | فرض نوع المهايئ (postgres, mongodb, mysql, redis, elasticsearch, s3, http) |
graphgo.dsn=... | حقن سلسلة اتصال (DSN لقاعدة بيانات postgres/mysql، URI لـ mongodb، وإلا يعود إلى dsn) |
graphgo.node-type=gateway | تجاوز نوع العقدة المرئية (service, gateway, auth, api, queue, cache) |
graphgo.name=... | تجاوز اسم العقدة الظاهر في الرسم والمستخدم في معرفات العقد والسجلات |
| الأمر | ما يفعله |
|---|
graph-go demo | تشغيل مجموعة العرض التوضيحي لـ Docker Compose من المستودع وعرض مخرجاتها في المقدمة. |
graph-go serve | بدء خادم HTTP مع الاكتشاف التلقائي والتحديثات الحية (الافتراضي — نفس التشغيل بدون وسائط). |
graph-go scan | تشغيل الاكتشاف مرة واحدة وإخراج الرسم البياني كـ JSON إلى stdout. مفيد للتوجيه إلى jq، أو فحوصات CI، أو التصدير لمرة واحدة. |
graph-go version | طباعة الإصدار، الالتزام (commit)، وتاريخ البناء. |
graph-go --health-check | الاتصال بـ /health المحلي والخروج بقيمة 0/1. يُستخدم بواسطة HEALTHCHECK للحاوية؛ ليس للاستخدام التفاعلي. |
9001 |
| وحدة تحكم MinIO (مجموعة العرض التوضيحي فقط) |
init()internal/graph/nodes/nodes.gowebui/src/types/graph.tswebui/src/components/graph/CustomNode.tsx