مرحبًا، أحاول تضمين تعليقات Discourse على موقعي الإلكتروني، تاركًا دليل التضمين، وقد اصطدمت بحائط ![]()
الأعراض
لقد جربت ذلك في Firefox و Chrome. في كلتا الحالتين، يتم تحميل إطار Discourse “جاري تحميل النقاش…” لكنه يتوقف هناك، مع ظهور أخطاء JavaScript متكررة في وحدة تحكم المطور.
في Firefox، أحصل على خطأ يتعلق بـ X-Frame-Options:
تم العثور على رأس X-Frame-Options غير صالح عند تحميل "https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927": "ALLOWALL" ليس توجيهًا صالحًا.
يلي ذلك خطأ DOMException في embed-application.js:7:
Uncaught DOMException: تم تحديد سلسلة غير صالحة أو غير قانونية
يتكرر هذان الخطآن كل 30 ثانية تقريبًا. لا توجد طلبات فاشلة في تبويب الشبكة.
في Chrome، لا أحصل على خطأ X-Frame-Options. بعد بضع ثوانٍ، أحصل على خطأ يتعلق بعدم تطابق الأصل المستهدف مع أصل نافذة المستلم:
فشل تنفيذ 'postMessage' على 'DOMWindow': الأصل المستهدف المقدم ('https://discourse.29th.local') لا يتطابق مع أصل نافذة المستلم ('https://personnel.29th.local').
لقد رأيت العديد من المواضيع على meta حول هذا الخطأ، وحاولت جميع خطوات استكشاف الأخطاء وإصلاحها، دون جدوى.
إعداداتي
لقد اتبعت دليل إعداد Discourse لنظام Mac مع استثناء طفيف: بدلاً من تثبيت postgres و redis و mailcatcher بشكل عام على جهاز الكمبيوتر المحمول الخاص بي، أقوم بتشغيلها في حاويات Docker، مع تعريض المنافذ علنًا. لا يعرف Discourse أنها تعمل في حاويات Docker بدلاً من الأجهزة المادية. Rails/discourse مثبت بشكل عام ولا يعمل في حاوية Docker.
بشكل منفصل تمامًا، يعمل تطبيق الويب المخصص الخاص بي في مكدس Docker Compose. يتضمن جزء من هذا المكدس خادم nginx يقوم بتوجيه personnel.29th.local إلى الحاوية الصاعدة المناسبة، و discourse.29th.local إلى host.docker.internal:3000 (هذا هو اسم المضيف السحري الذي يمكن لحاويات Docker استخدامه للوصول إلى localhost للمضيف).
(كما أذكر أدناه، أزلت طبقة nginx من المعادلة وانتهيت بنفس الخطأ)
قد تكون هناك مشكلة محتملة هنا وهي أن تطبيق الويب الخاص بي هو تطبيق صفحة واحدة (SPA) بلغة JavaScript. الصفحة التي يتم تضمين تعليقات Discourse فيها هي https://personnel.29th.local/#enlistments/1234 ولا يوجد عرض من جانب الخادم. إذا كانت هذه مشكلة، كنت أتوقع خطأً مع الزاحف، وعندها سأكتفي بـ Discourse بالربط بتطبيقي بدلاً من زحفه. لكن الأخطاء التي تظهر لا تبدو مرتبطة بفشل الزحف.
استكشاف الأخطاء وإصلاحها
لقد قمت بتعيين المضيف القابل للتضمين في Admin > Customize > Embedding إلى personnel.29th.local. في البداية، أظهرت كود التضمين النموذجي http://localhost:3000/ لـ discourseUrl، لذا شغلت rails console وقمت بتشغيل:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
وقمت بتفعيل “force https” في لوحة تحكم المسؤول. هذا أصلح الرابط في كود التضمين النموذجي.
لقد أضفت أيضًا https://personnel.29th.local كمجال CORS في قسم cors origins في الإعدادات.
أنا الآن أبدأ تشغيل Discourse بالأمر التالي:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
كما جربت تعطيل سياسة محتوى الأمان (Content Security Policy) في لوحة تحكم الإعدادات.
لقد نظرت في https://discourse.29th.local/logs/ لكنني لم أر أي أخطاء، ولا شيء يتعلق بـ Sidekiq.
بخصوص Sidekiq، لدي رسالة في لوحة تحكم المسؤول حول التحديثات:
لم يتم إجراء فحص للتحديثات. تأكد من تشغيل sidekiq.
لذلك قمت بتشغيل Sidekiq.redis { |r| puts r.flushall } في وحدة تحكم rails وحصلت على OK، ثم أعيدت تشغيل خادم rails، ولم يتغير شيء في الرسالة ولا في المشكلة العامة. لقد تلمست حول ذاكرة التخزين المؤقت لـ redis ولم أر أي شيء يتعلق بهذه الصفحة.
كما حاولت تبسيط الأمور بإخراج طبقة nginx من المعادلة: إعادة تعيين SiteSetting.force_hostname و SiteSetting.port إلى nil، وإيقاف تشغيل force https، والوصول إلى تطبيق الويب الخاص بي و Discourse عبر localhost، وإضافة تطبيق الويب الخاص بي إلى المضيفين القابلين للتضمين واسمات المضيفين CORS في Discourse (http://localhost:8080)، لكنني حصلت على نفس الخطأ، فقط مع مضيفات مختلفة:
فشل تنفيذ 'postMessage' على 'DOMWindow': الأصل المستهدف المقدم ('http://localhost:3000') لا يتطابق مع أصل نافذة المستلم ('http://localhost:8080').
أنا أعمل بالإصدار 2.6.0.beta6 ( 60bc38e6a8 )، الذي حصلت عليه عن طريق نسخ فرع master حسب دليل إعداد Discourse لنظام Mac قبل بضعة أسابيع وتشغيل git pull origin master اليوم.
لقد قمت أيضًا بإزالة مجلد tmp وأعدت تشغيل الخادم.
لقد خرجت أيضًا في نزهة، صرخت في وسادة، وبكيت تحت طاولتي.
أرجو أن يكون هذا يغطي جميع الجوانب. آمل أن يتمكن أحدكم من المساعدة!
