جعل Discourse يرى عنوان IP لخادم Prometheus

مرحبًا بالجميع!

حتى الآن، إذا فهمتُ بشكل صحيح، لضمان قدرة مثيل Prometheus على سحب البيانات من نقطة النهاية /metrics، يجب إضافة عنوان IP لتلك الآلة في قائمة السماح عن طريق تعديل DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX.

هل توجد طريقة أخرى للقيام بذلك؟ تقع مثيلتنا الخاصة بـ Discourse خلف وكيل DNS الخاص بـ Cloudflare ولا نتمكن من رؤية عنوان IP الفعلي للمستخدمين النهائيين. سأفضل حقًا إذا أمكننا التوصل إلى طريقة للقيام بذلك باستخدام مفاتيح API! على الرغم من أن هذا يبدو غير مرجح بسبب القيود المفروضة على كيفية استهلاك Prometheus للبيانات.

في هذه الحالة، تكون Discourse معطلة، وتحتاج إلى إضافة قالب Cloudflare.

أعتقد أن ذلك سيعمل. هل جربت ذلك؟ لكنني لا أعتقد أنه يمكنك جعل Grafana تضع المفاتيح في رأس الطلب، وهو السبب الذي دفعني لإضافة هذه الميزة في المقام الأول.

إعجاب واحد (1)

إذن فإن Discourse معطّل وتحتاج إلى إضافة قالب Cloudflare.

آه، ماذا تقصد بـ “قالب Cloudflare”؟

أعتقد أن ذلك قد ينجح. هل جربت؟ لكنني لا أظن أنه يمكنك جعل Grafana تضع المفاتيح في الرأس، وهو السبب الذي دفعني لإضافة هذه الميزة من الأساس.

نعم، جربت ذلك. لا يزال Prometheus لا يسمح بعناوين رأس مخصصة في تكوينات الماسح الضوئي. لذا، لا توجد طريقة لي لاستقبال مقاييس Discourse في Prometheus إذا لم أستطع إضافة عنوان IP الخاص بخادم Prometheus إلى القائمة البيضاء، وهو أمر غير ممكن في حالتي.

من المرجح أن هناك أشخاصًا آخرين يديرون مثيلات Discourse خلف وكلاء مثل Cloudflare. لذا، وبافتراض ذلك، أعتقد أننا سنضطر إلى تعديل أداة التصدير قليلاً.

تستخدم واجهة برمجة تطبيقات Discourse رؤوس Api-Key و Api-Username الخاصة بها بدلاً من شيء معياري إلى حد ما مثل المصادقة الأساسية لـ HTTP (والتي تدعمها وحدة الماسح الضوئي في Prometheus). لذا، لا أملك أي طريقة لاستخدام ذلك في إعدادي.

ستحتاج إلى البحث. لكن يمكنك العثور عليه داخل مجلد القوالب وإضافته إلى ملف app.yml.

إعجاب واحد (1)

شكرًا لك!

تم تمكين cloudflare.template.yml. :slight_smile: لكن إذا فهمت بشكل صحيح، كان ذلك فقط لتعطيل تحديد معدل الطلبات للحوافز القادمة من عناوين IP الخاصة بـ Cloudflare.

في الوقت الحالي، يبدو تكوين Prometheus الخاص بي كالتالي:

scrape_configs:
        - job_name: forum
          scrape_interval: 5s
          scheme: https
          static_configs:
                  - targets:
                          - forum-behind-cloudflare-dns-proxy.com

الآن، المشكلة التي أواجهها هي أن Discourse لا يرى عنوان IP الفعلي للطلب. لذا، ولجعل نهج قائمة السماح يعمل، جربت ما يلي:

  1. أضفت عنوان IPv6 الخاص بخادم Prometheus الخاص بي إلى متغير البيئة DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX في ملف app.yml.

  2. قمت بتعيين عنوان IPv6 الفعلي للمنتدى يدويًا في /etc/hosts على خادم Prometheus. الآن، يمكن للمنتدى رؤية عنوان IP الخاص بخادم Prometheus الخاص بي والسماح بالوصول إليه. :slight_smile:

لا تزال هناك بعض المشاكل الأخرى لدي، مثل: أن Prometheus يعمل داخل حاوية. /etc/hosts من المضيف لا يتم مشاركته داخل الحاوية. لذا، يستمر في حل عنوان المنتدى إلى عنوان IP تابع لـ Cloudflare ويفشل أثناء المصادقة.

يمكنني مشاركة /etc/hosts من المضيف مع حاوية Docker مثل -v /etc/hosts:/etc/hosts أثناء بدء تشغيل Prometheus، لكن هذا يؤدي إلى خطأ مثل:

Get "https://forum-behind-cloudflare-dns-proxy.com:443/metrics": dial tcp [<ipv6-address>]:443: connect: cannot assign requested address

الآن، عليّ فقط حل هذه المشكلة.

تعديل #1: تمكنت من حل هذه المشكلة أيضًا. كان IPv6 معطلًا داخل حاوية Docker. يمكنني إصلاح ذلك عن طريق تمكين IPv6 في حاوية Docker أو ببساطة استخدام --net=host.}

هل تقف خلف وكيل عكسي؟ ستحتاج إلى إعداد nginx للسماح للعنوان البعيد الحقيقي بالوصول إلى Discourse. أعتقد أن تشغيل مواقع أخرى على نفس الخادم الذي يستضيف Discourse قد يمنحك تلميحًا حول كيفية حل هذه المشكلة.

إعجاب واحد (1)

نعم، تعمل نسخة Discourse خلف وكيل عكسي. يُقدّم الوكيل العكسي من قبل Cloudflare، ونحن نستخدم فقط الخطة الاحترافية (Pro plan) ولا نملك خيار تمرير عنوان IP الفعلي للعميل إلى نسخة Discourse من Cloudflare. على أي حال، تم حل مشكلتي بالفعل. :slight_smile:

يجب تحديث لوحة تحكم Grafana في هذه المرحلة. فمع مرور الوقت، تم تحديث مُصدّر Prometheus بحيث لم يعد يرسل مقاييس معينة، لكن لوحة تحكم Grafana لا تزال مُهيأة لقراءة قيم تلك المقاييس (التي لم تعد موجودة الآن).

إعجاب واحد (1)