تسجيل غير متسق / مفقود وأخر عنوان IP

لدينا تثبيت لـ Discourse استمر لسنوات، لكنه حاليًا على أحدث إصدار (2.4.0beta2) باستخدام أحدث صورة Docker، وعنوان IP عام، بدون وكيل أو أي عناصر أخرى أمامه، وشهادات Let’s Encrypt.

في بعض الأحيان تعمل عناوين IP المسجلة عند تسجيل المستخدمين وعناوين IP الأخيرة بشكل مثالي، وفي أحيان أخرى لا تعمل. لا أرى أي نمط أو سبب واضح. على سبيل المثال، إليك مستخدم تم إنشاؤه قبل 7 ساعات، مع عناوين غير منطقية:

مستخدم آخر تم إنشاؤه قبل 17 ساعة يعمل بشكل مثالي:

وهكذا يستمر الأمر؛ فبعض المستخدمين يبدو كل شيء معهم على ما يرام، بينما لا يكون الأمر كذلك مع آخرين. هل لديكم أي أفكار حول ما يحدث هنا؟

ما يلفت انتباهي الآن عند النظر في الأمر هو أنه قد يكون بسبب أن هؤلاء المستخدمين يأتون عبر IPv6، حيث لم أرَ أبدًا عنوان IPv6 في هذه الحقول. هل لا يفهم Discourse عناوين IPv6؟ هل لا يفهم وكيل Docker المعلومات ذات الصلة أو لا ينقلها؟ أم هناك شيء آخر؟

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

IPv6 يعمل بكفاءة عالية، ويتم استخدامه مع إعدادات صور Docker الموصى بها باستخدام قوالب الويب وقواعد البيانات. لا يوجد أي شيء آخر أمامه. ما الذي يجب علينا تعديله؟

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

يبدو أن الأشخاص الآخرين الذين يشغّلون إعدادات Docker الافتراضية يواجهون نفس المشكلة.

https://meta.discourse.org/t/why-are-my-301-redirects-not-working-ipv6-users-also-show-as-localhost/80442/9

من الصعب القول. لقد قمت للتو بمراجعة آخر 8 مستخدمين جدد تقريبًا الذين سجلوا في talk.commonmark.org، وهو تثبيت قياسي افتراضي للغاية، وجميعهم كان لديهم عناوين IPv4 صالحة لعنوان IP الأخير وعنوان IP للتسجيل (أحيانًا اختلف الاثنان أيضًا).

أعلم أنه إذا وصلت حسابات المستخدمين عبر SSO أو طرق أخرى غير عادية، فقد يؤثر ذلك على عناوين IP المبلغ عنها هناك. هل جميع هؤلاء المستخدمين الذين تشير إليهم هم تسجيلات عادية عبر نافذة تسجيل المستخدم الجديد القياسية في Discourse؟

هل كانت أي من تلك العناوين IPv6؟

لا، لم يكن أي منها كذلك، لكنني لا أعرف ما إذا كان هذا المضيف المشترك يدعم حتى IPv6.

إذن أنا متأكد من أنه لن يُظهر مشكلة عرض عنوان localhost بدلاً من عناوين IPv6 للمستخدمين الذين يدخلون عبر IPv6. هذا لا يعني أن المشكلة غير موجودة.

المشكلة غير موجودة في الاستضافة الرسمية لمنصة Discourse، على الأقل، وهي تدعم بروتوكول IPv6. كما أنني لا أرى أي مشاكل في تثبيت قياسي على خادم استضافة عشوائي. لا أعرف ما الذي يمكنني إضافته غير أنكم لم تجيبوا على سؤالي المهم نسبيًا:

آه، نعم، هذه تسجيلات عادية، لا يوجد مصادقة موحدة (SSO) أو حسابات مرتبطة.

لا أشك في أن الأمر يعمل في استضافتك، لكنك لا تستخدم إعداد “Docker” القياسي الذي يستخدمه معظم المستخدمين، أليس كذلك؟ أعني، أنا متأكد من أنه ممكن أن يعمل بشرط وجود وكيل (proxy) يضبط الرؤوس (headers) بشكل صحيح وما إلى ذلك، لكن السؤال هو فقط ما إذا كان الإعداد الافتراضي يفعل ذلك، وإذا لم يكن كذلك، هل يمكننا جعله يفعل ذلك.

أنا متأكد إلى حد كبير أنك بحاجة إلى إضافة شيء ما إلى ملف app.yml يخبر nginx بتعريف عنوان IPv6 الخاص بك وتحويل عنوان العميل. ومع ذلك، لم أستطع بعد معرفة كيفية القيام بذلك. تحتوي المواضيع المتعلقة بتشغيل وكيل عكسي على أمثلة لـ IPv6 تقدم بعض التلميحات.

هذا الأمر مدرج في قائمتي بالأشياء التي أحتاج إلى حلها، لكن قائمتي طويلة جدًا. لقد انتهيت بإيقاف IPv6، وأعتقد أن السبب هو هذه المشكلة، لكن ربما كان بسبب جهل آخر بـ IPv6.

(جيف، يمكنك الحصول على كتلة IPv6 يتم توجيهها، لكن يجب أن تطلبها ثم تقوم بتكوين مضيفيك لاستخدامها.)

Meta عبارة عن تثبيت Docker قياسي بالإضافة إلى وكيل عكسي خارجي، وتتعامل مع IPv6 بكفاءة:

هل يوجد قسم في ملف discourse.conf الخاص بك يخبره بـ set_real_ip باستخدام عنوان IPv6 الخاص بك، شبيهًا بهذا؟

    - replace:
        filename: /etc/nginx/conf.d/discourse.conf
        from: "types {"
        to: |
          set_real_ip_from 192.168.1.0/24;
          set_real_ip_from 172.18.0.0/24;
          set_real_ip_from 172.17.0.0/24;
          set_real_ip_from <عنوان_IP_V6_هنا؟>
          real_ip_recursive on;
          real_ip_header X-Forwarded-For;
          types {

أعتقد أن الوكيل العكسي الخارجي هو المفتاح - لا أعتقد أن هذه المشكلة قابلة للحل على الإطلاق، أو على الأقل ليس بسهولة، من داخل حاوية Docker فقط.

لقد حللتها الآن عن طريق جعل حاوية Discourse تستمع إلى مقبس Unix وتضع أمامها Caddy على نفس الجهاز (خارج Docker). إعداد Caddy تافه، ويشمل Let’s Encrypt، والآن يعمل كما هو متوقع أيضًا مع IPv6.

forum.example.com {
  proxy / unix:/var/discourse/shared/web-only/nginx.http.sock {
    transparent
    websocket
  }
}