لماذا تستضيف Prometheus وGrafana ذاتيًا على خادم VPS
على خلاف الأداة الشاملة، تفصل حزمة Prometheus + Grafana بوضوح بين الجمع (يجمع Prometheus المقاييس التي تعرضها المُصدِّرات) والتخزين (قاعدة بيانات السلاسل الزمنية المدمجة) والعرض البصري (Grafana). هذه الوحدوية هي بالضبط ما يجعلها معيارًا: تراقب الخادم VPS نفسه باستخدام Node Exporter، وحاوياتك باستخدام cAdvisor، وقاعدة بيانات PostgreSQL أو MySQL باستخدام المُصدِّر المخصص، وتزود تطبيقاتك الخاصة بأدوات القياس بتنسيق Prometheus.
كل ذلك على خادم VPS تتحكم فيه، مما يجنبك إرسال مقاييس بنية تحتية حساسة إلى خدمة SaaS تُحاسَب بحسب الاستيعاب. تحتفظ بالسجل طالما سمح قرصك بذلك، وتبني لوحات معلومات خاصة بحزمتك، وتحدد قواعد التنبيه الخاصة بك عبر Alertmanager.
مع إصدار Prometheus 3.x (أحدث إصدار مستقر: v3.15.0، سبتمبر 2026)، تم تحسين محرك تخزين TSDB لتقليل استهلاك الذاكرة بنسبة 15 إلى 20% — ميزة مباشرة للخوادم VPS. يجلب Grafana 13.x (الإصدار v13.2.3، نهاية سبتمبر 2026) محررًا محسنًا للوحات المعلومات ونظام تنبيه موحدًا.
ما تقدمه هذه الحزمة على خادمك VPS
- مقاييس نظام مفصلة (CPU وRAM وإدخال/إخراج القرص والشبكة) عبر Node Exporter v1.12.1، محفوظة كسجل على المدى الطويل.
- مراقبة حاويات Docker باستخدام cAdvisor: الاستهلاك لكل حاوية في الوقت الفعلي.
- لوحات معلومات Grafana مخصصة، قابلة للاستيراد من مكتبة مجتمعية تضم آلاف القوالب.
- تنبيهات قوية عبر Alertmanager v0.34.1: عتبات وتجميع وكتم وتوجيه متعدد القنوات (البريد الإلكتروني وSlack وPagerDuty...).
- مراقبة توفر نقاط نهاية HTTP/TCP مع Blackbox Exporter: اكتشاف وقت الاستجابة وانتهاء صلاحية شهادة TLS.
- جمع سجلات التطبيقات مع Loki (نفس الناشر Grafana): ربط السجلات والمقاييس في لوحة معلومات واحدة.
- لغة الاستعلام PromQL لإنشاء مؤشرات مشتقة ومعدلات التغيير.
- تزويد تطبيقاتك الخاصة بأدوات القياس بتنسيق Prometheus، دون تكلفة استيعاب خارجية.
المتطلبات الأساسية للخادم VPS والموارد اللازمة
هذه الحزمة أكثر استهلاكًا للموارد من مراقب بسيط، لأن Prometheus يحتفظ بالسلاسل الزمنية في الذاكرة قبل كتابتها على القرص. احسب خادم VPS بـ 2 vCPU وذاكرة RAM من 2 إلى 4 غيغابايت لمراقبة خادم واحد أو أكثر. أضف Loki وAlertmanager واستهدف 4 غيغابايت كحد أدنى.
التخزين هو النقطة الحرجة: يولد Prometheus ما يقارب 1 إلى 2 ميغابايت لكل سلسلة زمنية يوميًا. لـ 500 سلسلة على مدى 30 يومًا، خطط لـ 15 إلى 30 غيغابايت. ابدأ بـ 40 غيغابايت من SSD، واضبط --storage.tsdb.retention.time حسب احتياجاتك.
المتطلبات البرمجية: Docker 26+ وDocker Compose v2، واسم نطاق يشير إلى خادم VPS الخاص بك (لوكيل HTTPS العكسي الخاص بـ Grafana)، وufw أو ما يعادله لتقييد المنافذ.
نشر الحزمة باستخدام Docker Compose
إنشاء هيكل مجلد المشروع
على خادم VPS الخاص بك، أنشئ مجلدًا مخصصًا وهيكل الملفات:
mkdir -p ~/monitoring/{prometheus,alertmanager,loki} cd ~/monitoringيعزل هذا التنظيم كل إعداد في مجلده الخاص، مما يبسط التحديثات.
كتابة ملف docker-compose.yml
عرِّف الخدمات التالية في ملف
docker-compose.yml:prometheus(صورةprom/prometheus:v3.15.0)، وgrafana(صورةgrafana/grafana:13.2.3)، وnode-exporter(صورةprom/node-exporter:v1.12.1)، وcadvisor(صورةgcr.io/cadvisor/cadvisor:latest)، وalertmanager(صورةprom/alertmanager:v0.34.1).قم بتحميل ملفات الإعداد كوحدات تخزين bind-mount وأنشئ وحدات تخزين مُسمَّاة لاستمرارية البيانات:
prometheus_dataوgrafana_data. مثال على bind لـnode-exporter:volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:roثم شغِّل
docker compose up -dلبدء الحزمة.إعداد prometheus.yml مع جميع مهام الجمع
في
prometheus/prometheus.yml، أعلن عن الأهداف في قسمscrape_configs. أربع مهام أساسية:scrape_configs: - job_name: 'node' static_configs: - targets: ['node-exporter:9100'] - job_name: 'cadvisor' static_configs: - targets: ['cadvisor:8080'] - job_name: 'alertmanager' static_configs: - targets: ['alertmanager:9093'] - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']أعد تحميل الإعداد دون إعادة التشغيل:
curl -X POST http://localhost:9090/-/reload.إعداد Alertmanager (alertmanager.yml)
أنشئ
alertmanager/alertmanager.yml. إعداد أدنى يوجه التنبيهات إلى Slack:route: receiver: 'slack-notifications' group_wait: 30s group_interval: 5m repeat_interval: 4h receivers: - name: 'slack-notifications' slack_configs: - api_url: 'https://hooks.slack.com/services/YOUR/WEBHOOK' channel: '#vps-alerts' title: '{{ .CommonAnnotations.summary }}'للبريد الإلكتروني، استبدل
slack_configsبـemail_configsمع حقولtoوfromوsmarthostوauth_usernameوauth_password.إنشاء قواعد التنبيه في Prometheus
في
prometheus/rules.yml، عرِّف قواعدك. ثلاثة أساسية لخادم VPS:groups: - name: vps rules: - alert: CPUMرتفع expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 5m annotations: summary: 'CPU > 85% لمدة 5 دقائق' - alert: ذاكرةMنخفضة expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.10 for: 5m annotations: summary: 'الذاكرة المتاحة < 10%' - alert: قرصMمتلئ expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 0.85 for: 10m annotations: summary: 'القرص > 85%'استشهد بهذا الملف في
prometheus.ymlضمنrule_files: ['rules.yml'].ربط Grafana بـ Prometheus (وLoki)
افتح Grafana على المنفذ 3000. بيانات الاعتماد الافتراضية: admin / admin — غيِّرها فورًا.
أضف مصدر بيانات Prometheus بالرابط
http://prometheus:9090. اختبر الاتصال: يجب أن يعيد 'Data source is working'.إذا أضفت Loki إلى Compose (إصدار
grafana/loki:3.3.2)، أضف مصدر بيانات Loki ثانيًا بالرابطhttp://loki:3100. ستتمكن بعد ذلك من ربط ارتفاعات CPU في لوحة Prometheus بسجلات التطبيقات في Loki دون تغيير الأداة.إتاحة Grafana عبر HTTPS بوكيل عكسي
لا يجب أبدًا إتاحة Grafana عبر HTTP غير آمن. أعدّ Nginx كوكيل عكسي:
server { listen 443 ssl; server_name grafana.your-domain.com; ssl_certificate /etc/letsencrypt/live/grafana.your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/grafana.your-domain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; } }أغلق المنافذ الداخلية في جدار الحماية:
ufw deny 9090،ufw deny 9093،ufw deny 3000. يجب أن يكون المنفذ 443 فقط (Nginx) مفتوحًا للعموم.التحقق من جمع Prometheus لجميع الأهداف
انتقل إلى
http://localhost:9090/targets(عبر SSH أو من خلال الوكيل العكسي). يجب أن تُظهر جميع الأهداف المعلنة الحالة UP باللون الأخضر. الحالة DOWN تشير إلى مشكلة في شبكة Docker (اسم خدمة خاطئ) أو منفذ أو إعداد. أصلح قبل المتابعة.
استيراد لوحات معلومات Grafana المجتمعية
يوفر Grafana مكتبة من لوحات المعلومات الجاهزة على grafana.com/grafana/dashboards. معرِّفان أساسيان لخادم VPS:
المعرف 1860 — Node Exporter Full: لوحة المعلومات المرجعية لمقاييس النظام. تعرض في الوقت الفعلي وعلى المدى الطويل: حمل CPU لكل نواة، استخدام الذاكرة (بما فيها المخازن المؤقتة)، إدخال/إخراج القرص لكل جهاز، تشبع الشبكة والطابور. قابلة للتصفية حسب النسخة، مما يجعلها صالحة لمراقبة عدة خوادم VPS من Grafana واحد.
المعرف 893 — cAdvisor: مقاييس Docker لكل حاوية — تقييد CPU، استخدام الذاكرة، إدخال/إخراج وأخطاء الشبكة. مفيد للكشف عن حاوية تستهلك بشكل غير طبيعي دون إبطاء خادم VPS بأكمله.
لاستيراد لوحة معلومات: في Grafana، انتقل إلى Dashboards → Import، أدخل المعرف، حدد مصدر بيانات Prometheus الخاص بك وأكد. تُستورَد اللوحة في ثوانٍ دون بناء أي شيء يدويًا.
إعداد التنبيهات مع Alertmanager
Alertmanager هو المكون الذي يستقبل التنبيهات من Prometheus ويقرر ما يفعله بها: تجميعها، أو كتمها خلال الصيانة، أو توجيهها إلى قنوات مختلفة حسب الخطورة.
التجميع: تُجمَّع تنبيهات متعددة تُطلَق في نفس الوقت (انقطاع الشبكة → CPU مرتفع + قرص غير متاح + خدمة متوقفة) في إشعار واحد. هذا هو الحقل group_by: ['alertname', 'instance'] في alertmanager.yml.
الكتم: قبل صيانة مخططة، أنشئ كتمًا في واجهة Alertmanager (http://localhost:9093) أو عبر واجهة برمجة التطبيقات: amtool silence add --duration=2h alertname=~'.*'. تستمر التنبيهات في التقييم بواسطة Prometheus لكنها لا تُرسَل خلال النافذة.
التوجيه متعدد القنوات: التنبيهات الحرجة (CPU > 95%) تذهب إلى PagerDuty أو Slack مع ذكر @channel، والتحذيرات (CPU > 85%) إلى قناة مراقبة أقل إلحاحًا.
بعد كل تعديل على alertmanager.yml، أعد التحميل دون إعادة التشغيل: curl -X POST http://localhost:9093/-/reload.
Prometheus مقابل InfluxDB مقابل Zabbix: أيهما تختار؟
مرّر الجدول أفقيًا
| المعيار | Prometheus | InfluxDB | Zabbix |
|---|---|---|---|
| نموذج الجمع | سحب (جمع نشط) | دفع (عملاء أو API) | وكيل + SNMP + JMX |
| التخزين | TSDB مدمج، فعال على VPS | InfluxDB مفتوح المصدر أو سحابي | PostgreSQL / MySQL، ثقيل |
| لغة الاستعلام | PromQL (قوية، منحنى تعلم حاد) | Flux / InfluxQL (مشابهة SQL) | ماكرو Zabbix (محدودة) |
| التنبيه | Alertmanager مخصص، مرن | مدمج (محدود في النسخة المجانية) | مدمج، غني لكن معقد |
| منحنى التعلم | معتدل (PromQL) | منخفض (مشابه SQL) | مرتفع (واجهة كثيفة، عملاء) |
| حالة الاستخدام المثالية | بنية تحتية محاوية، تطبيقات مُجهَّزة | إنترنت الأشياء، سلاسل زمنية عالية التردد | شبكات المؤسسات، SNMP |
التصليب: لا تعرض Prometheus للعموم أبدًا
لا يملك Prometheus نظام مصادقة أصليًا. تكشف واجهته الويب قائمة جميع أهدافك، وتسميات بنيتك التحتية، وقواعد التنبيه الخاصة بك — معلومات قيّمة للمهاجم.
ثلاثة قواعد غير قابلة للتفاوض:
1. ربط Prometheus على 127.0.0.1:9090 فقط (--web.listen-address=127.0.0.1:9090 في Compose).
2. حظر المنافذ 9090 و9093 و9100 و8080 في جدار الحماية (ufw deny 9090).
3. حماية Grafana بكلمة مرور قوية وتعطيل الحساب المجهول (GF_AUTH_ANONYMOUS_ENABLED=false كمتغير بيئة).
إذا احتجت إلى الوصول لواجهة Prometheus من الخارج لأغراض التشخيص، استخدم نفقًا SSH (ssh -L 9090:localhost:9090 [email protected]) بدلًا من وكيل عكسي عام.
إضافة مراقبة حاويات Docker مع cAdvisor
يعرض cAdvisor (Container Advisor) مقاييس حاوية Docker لكل حاوية بتنسيق Prometheus: استخدام CPU كنسبة من الحصة المخصصة، استهلاك الذاكرة مع وبدون ذاكرة التخزين المؤقت، إدخال/إخراج الشبكة والقرص، وإعادة التشغيل.
في docker-compose.yml، أضف الخدمة:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- '127.0.0.1:8080:8080'
restart: unless-stoppedثم أضف المهمة المقابلة في prometheus.yml. تعرض لوحة Grafana ذات المعرف 893 (cAdvisor) بعد ذلك عرضًا لكل حاوية، مع مرشح على اسم خدمة Docker.
استكشاف الأخطاء: الأخطاء الأكثر شيوعًا
الهدف DOWN في Prometheus (/targets): تحقق أولًا من اسم الخدمة في docker-compose.yml — يحل Prometheus الأسماء عبر DNS الداخلي لـ Docker. إذا كانت الخدمة تسمى node-exporter في Compose، يجب أن يكون رابط الجمع node-exporter:9100 وليس localhost:9100.
لوحات معلومات فارغة بعد الاستيراد: السبب الأكثر شيوعًا هو مهمة جمع تسميتها لا تتطابق مع ما تتوقعه لوحة المعلومات. يتوقع Node Exporter Full (المعرف 1860) مهمة تسمى node — إذا سميتها node_exporter في prometheus.yml، فصِّل يدويًا في متغيرات لوحة المعلومات أو أعد تسمية المهمة.
Alertmanager لا يستقبل التنبيهات: تحقق من أن Prometheus يمكنه الوصول إلى Alertmanager. في prometheus.yml، يجب أن يشير قسم alerting إلى alertmanager:9093 (اسم خدمة Docker). اختبر بـ: docker compose exec prometheus curl http://alertmanager:9093/-/healthy.
خطأ 'context deadline exceeded' عند إعادة التحميل: يستغرق Prometheus أكثر من 30 ثانية لإعادة التحميل إذا كانت القواعد كثيرة أو هدف بطيء. زد مهلة الجمع في prometheus.yml: scrape_timeout: 20s ضمن global.
للمزيد من التعمق
تغطي هذه الحزمة أساسيات مراقبة خادم VPS. للاحتياجات الأكثر تقدمًا:
الاحتفاظ على المدى الطويل: يخزن Prometheus البيانات محليًا، مثالي لـ 30 إلى 90 يومًا. للحصول على تاريخ من 1 إلى 2 سنة دون إشباع القرص، اربط Thanos (مخزن كائنات متوافق مع S3) أو VictoriaMetrics كبديل مباشر للتخزين. VictoriaMetrics مناسب بشكل خاص لخوادم VPS المتواضعة: يستهلك 5 إلى 10 مرات أقل ذاكرة من Prometheus لنفس حجم السلاسل.
مراقبة نقاط نهاية HTTP: أضف Blackbox Exporter إلى Compose لاختبار توفر عناوين URL الخاصة بك، ورمز HTTP المُعاد، والكمون، وتاريخ انتهاء صلاحية شهادة TLS.
السجلات مع Loki: إذا أردت ربط المقاييس بسجلات التطبيقات، أضف Loki + Promtail إلى Compose. يعرض Grafana المقاييس والسجلات في نفس اللوحة.
للاطلاع على جميع خيارات الإعداد المتقدمة، راجع الوثائق الرسمية لـ Grafana ووثائق Prometheus.