كل الإضافات لا تعمل بسبب خطأ CORS بعد الترقية الأخيرة

منذ الأسبوع الماضي، توقفت جميع الإضافات، سواء الأساسية أو المثبتة، عن العمل حتى عند تمكينها على المنتدى الخاص بنا. في البداية، اعتقدت أن الأمر يتعلق بالخطأ المذكور سابقًا https://meta.discourse.org/t/fix-compile-missing-rollup-plugin-bundles-on-demand-in-development/398864/8، لكننا قمنا بتشغيل عدة تحديثات منذ ذلك الحين ولم يحل أي منها المشكلة. حاولت تمكين إضافة غير مستخدمة سابقًا، وهي “ملاحظات المستخدمين” المثبتة مسبقًا، لكن لا توجد خيارات لإضافة ملاحظات لأي مستخدم. حتى مدير Docker توقف، مما يعني أن جميع التحديثات يجب تشغيلها على مستوى الخادم، مما يسمح لشخص واحد فقط بتطبيقها بدلاً من فريق الإدارة.

لقد حاولت البحث عن حل لهذه المشكلة، لكن كل ما وجدته يتعلق بتعطيل الإضافات تلقائيًا أو ما شابه ذلك، وليس محددًا مثل حالتنا.

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

شكرًا لكم دائمًا على دعمكم المستمر :smiley:

حسناً، يبدو أن هذه مشكلة تتعلق بشبكة تسليم المحتوى (CDN) الخاصة بك:


لقد قمت بتفعيل إضافة تجاهل CORS الخاصة بي، وتم تحميل السكريبتات بنجاح، لكنني لا أرى أي تغييرات مرئية من الإضافات. أنصحك بتجربة ذلك، وإذا نجح الأمر، فيجب عليك تحديد ما يسبب الخطأ في شبكة تسليم المحتوى (CDN) الخاصة بك.

شكرًا جزيلاً لك على تخصيص الوقت للنظر في هذا الأمر نيابةً عنا. سنقوم بتشغيل بعض الاختبارات خلال عطلة نهاية الأسبوع وسنقوم بالتحديث بمجرد أن نتمكن من ذلك.

أواجه نفس المشكلة مع bunnycdn. كان يعمل بشكل جيد حتى تحديث حديث.

لقد حاولت إضافة .js إلى رؤوس CORS في bunny.net كما هو موضح هنا:

وكما كان الحال آنذاك، لا أفهم سبب بدء هذه المشكلة عند ترقيتي إلى الإصدار 6800ad3adf3ef9c3caeb9a4d849997c7a3dc98d7 الأسبوع الماضي.

شكرًا لك يا جاي، لقد كان لدينا “باني” وقد حل الإصلاح الذي ذكرته جميع المشكلات الآن! شكرًا لك وللجميع على المساعدة والدعم في هذا الأمر، عاد منتدانا إلى وضعه الطبيعي. أو ما يمكن اعتباره طبيعيًا :smiley:

يسعدنا سماع أنك قد نجحت في حل المشكلة!

في نظام الإضافات الجديد، نستخدم script type="module"، والذي يتطلب تعيين رؤوس CORS الصحيحة. أما نمط script type="text/javascript" القديم فلا يتطلب تلك الرؤوس.

لقد قمنا بنقل أنظمة مختلفة تدريجيًا إلى type="module" على مدار السنوات القليلة الماضية. كانت السمات تستخدمه بالفعل، وكذلك كان highlightjs (وهو ما ذُكر في الموضوع الآخر). كما أن تحميل الخطوط من شبكة CDN يتطلب أيضًا توافقًا مع CORS.

لذلك، ربما كانت هناك بعض الأمور الأخرى معطلة بشكل خفي حتى قبل التغييرات الأخيرة في نظام الإضافات. الآن بعد أن قمت بإعداد تكوين CORS، يجب أن يعمل كل شيء بشكل صحيح مرة أخرى :chefs_kiss:

أها. هذا ما لم أكن لأخمنه.

تنبيه بسيط للجميع: إذا كنت تستخدم Azure Classic CDN، فقد بدأت هذه المشكلة في الظهور. أنا أحاول تجربة حل من جانب شبكة CDN، ولكن قد أحتاج إلى الانتقال إلى Front Door الفعلي بدلاً من Classic CDN.

نعم، تم تأكيد هذه المشكلة أيضًا على Azure Classic CDN.

يتعين عليك إضافة قاعدة جديدة إلى محرك القواعد، وفيما يلي مثال:

"rules": [

                        {

                            "name": "JSCORS",

                            "order": 1,

                            "conditions": [

                                {

                                    "name": "RequestUri",

                                    "parameters": {

                                        "typeName": "DeliveryRuleRequestUriConditionParameters",

                                        "operator": "Contains",

                                        "negateCondition": false,

                                        "matchValues": [

                                            "/assets/js/plugins/"

                                        ],

                                        "transforms": []

                                    }

                                }

                            ],

                            "actions": [

                                {

                                    "name": "ModifyResponseHeader",

                                    "parameters": {

                                        "typeName": "DeliveryRuleHeaderActionParameters",

                                        "headerAction": "Overwrite",

                                        "headerName": "Access-Control-Allow-Origin",

                                        "value": "https://forums.mycoolforum.com"

                                    }

                                },

                                {

                                    "name": "ModifyResponseHeader",

                                    "parameters": {

                                        "typeName": "DeliveryRuleHeaderActionParameters",

                                        "headerAction": "Overwrite",

                                        "headerName": "Content-Type",

                                        "value": "application/javascript"

                                    }

                                },

                                {

                                    "name": "CacheExpiration",

                                    "parameters": {

                                        "typeName": "DeliveryRuleCacheExpirationActionParameters",

                                        "cacheBehavior": "BypassCache",

                                        "cacheType": "All"

                                    }

                                }

                            ]

غريب، هذه المشكلة لم تؤثر على القوالب، بل على الإضافات فقط بالنسبة لنا.

هل توجد مكان للعثور على إرشادات أو توجيهات بشأن هذه التغييرات الأخيرة المتعلقة بـ CORS لأولئك الذين يستخدمون Cloudflare؟

@pfaffman @TomoftheFog @tanya_byrne @denvergeeks، هل يمكنكم تأكيد كيفية تكوين أصولكم؟ هل لديكم فقط شبكة توصيل محتوى (CDN) وخادم التطبيق؟ أم أنكم تخزنون الأصول أيضًا على S3 أو على تخزين متوافق مع S3؟

إذا كنتم تستخدمون S3 أو تخزينًا متوافقًا مع S3، فللأسف فإن الطريقة الموثوقة الوحيدة هي إضافة بعض التكوينات الخاصة بشبكة توصيل المحتوى (CDN). لقد افترضت أن هذا الموضوع يتعلق بأصول S3، لكنني الآن لست متأكدًا؟

بالنسبة للأشخاص الذين يستخدمون شبكة توصيل محتوى (CDN) بسيطة مقابل خادم التطبيق، لا ينبغي أن يكون هناك أي عمل تكوين إضافي مطلوب. يجب أن تعمل الأمور “بشكل تلقائي”، تمامًا مثل حزم theme-javascripts وhightlightjs. لكن يبدو أننا كنا نفتقر بالفعل إلى الرأس (header) في تكوين NGINX الافتراضي لدينا. نعتذر عن ذلك!

هذا يجب أن يعيد الأمور للعمل مرة أخرى:

بمجرد دمج هذا التعديل، ستكون هناك حاجة لتشغيل أمر ./launcher rebuild app ليصبح ساري المفعول. لا يتم تطبيق تغييرات تكوين NGINX أثناء تحديثات واجهة المستخدم.

تمت إضافة هذه المعلومات إلى الموضوع الرئيسي:

نعتذر عن هذا الاضطراب! كان ينبغي علينا إجراء اختبارات أكثر شمولاً مع تكوينات مختلفة لشبكات توصيل المحتوى (CDN). يرجى إخبارنا إذا كنت لا تزال تواجه أي مشاكل بعد إعادة البناء.

تأكيد أننا لا نستخدم S3

جميع المواقع التي أعرفها والتي تظهر فيها المشكلة مضافة على S3. كانت بعض شبكات تسليم المحتوى (CDNs) تحتوي بالفعل على JavaScript في القائمة، بينما لم يكن بعضها الآخر. لا أعرف السبب في ذلك؛ ربما تغيرت الإعدادات الافتراضية على مر السنين؟

نعتذر عن التأخر في الرد، نحن نستخدم S3 بالفعل.

واجهتُ صعوبة في جعل إعدادات CORS في Cloudflare R2 تعمل مع نطاق مخصص لهذا الغرض. انتهى بي الأمر بحل المشكلة بالقوة من خلال استخدام قاعدة تحويل الرؤوس لإدراج الرأس الصحيح دائمًا لنطاق شبكة توصيل المحتوى (CDN) الخاص بي. فقط في حال كان هذا مفيدًا لشخص آخر.

لقد اكتشفنا أيضًا مشكلة أخرى منذ ظهور هذه المشكلة: لا يستطيع بعض المستخدمين رؤية صور الرموز التعبيرية عند استخدام زر تنسيق النص المُعد مسبقًا في Markdown. يحاول النظام تحميل highlight-js ويظهر خطأ يشير إلى فشل CORS:

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

أفترض أن f.insertcred.it هو شبكة توصيل المحتوى (CDN) الخاصة بـ S3؟ يجب تحميل HighlightJS من ‘شبكة توصيل محتوى التطبيق’ وليس من شبكة S3، لذا فإن هذه مشكلة مفاجئة. حسب علمي، لم يتغير أي شيء يتعلق بـ highlightjs خلال الأشهر القليلة الماضية.

هل لديك شبكة توصيل محتوى للتطبيق؟ أم أنك تعتمد فقط على S3 + شبكة S3؟

لقد تلقيت تحديثًا من المسؤول الرئيسي في المنتدى:


بحسب علمي، لا نملك تطبيق CDN. لم نقم بإلغاء التعليق عن DISCOURSE_CDN_URL في ملف app.yml.

نحن نستخدم متغيرات S3 فقط مثل DISCOURSE_S3_ENDPOINT و DISCOURSE_S3_CDN_URL وما إلى ذلك.

إليك ملف app.yml الخاص بنا بعد إزالة المعلومات الحساسة

## هذا هو قالب حاوية Docker المستقلة الشاملة لـ Discourse
##
## بعد إجراء أي تغييرات على هذا الملف، يجب عليك إعادة البناء
## /var/discourse/launcher rebuild app
##
## كن *حذرًا جدًا* عند التعديل!
## ملفات YAML حساسة للغاية للأخطاء في المسافات البادئة أو المحاذاة!
## قم بزيارة http://www.yamllint.com/ للتحقق من صحة هذا الملف حسب الحاجة

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## قم بإلغاء التعليق عن السطر التالي لتفعيل مستمع IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## قم بإلغاء التعليق عن هذين السطرين إذا كنت ترغب في إضافة Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## أي منافذ TCP/IP يجب أن تعرضها هذه الحاوية؟
## إذا كنت ترغب في مشاركة منفذ لـ Discourse مع خادم ويب آخر مثل Apache أو nginx،
## راجع https://meta.discourse.org/t/17247 للحصول على التفاصيل
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## اضبط db_shared_buffers على أقصى 25% من إجمالي الذاكرة.
  ## سيتم ضبطه تلقائيًا بواسطة bootstrap بناءً على الذاكرة المكتشفة، أو يمكنك تجاوز ذلك
  db_shared_buffers: "256MB"

  ## يمكن أن يحسن أداء الفرز، لكنه يزيد من استخدام الذاكرة لكل اتصال
  #db_work_mem: "40MB"

  ## أي إصدار Git يجب أن تستخدمه هذه الحاوية؟ (الافتراضي: tests-passed)
  #version: tests-passed

  ## الحد الأقصى لحجم التحميل (الافتراضي: 10m)
  upload_size: 20m

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## كم عدد طلبات الويب المتزامنة المدعومة؟ يعتمد على الذاكرة ونوى المعالج.
  ## سيتم ضبطه تلقائيًا بواسطة bootstrap بناءً على المعالجات المكتشفة، أو يمكنك تجاوز ذلك
  UNICORN_WORKERS: 4

  ## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
  ## مطلوب. لن يعمل Discourse مع عنوان IP عاري.
  DISCOURSE_HOSTNAME: forums.insertcredit.com

  ## قم بإلغاء التعليق إذا كنت تريد تشغيل الحاوية بنفس اسم النطاق
  ## (-h option) كما هو محدد أعلاه (الافتراضي "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل سيتم تعيينها كمسؤولين ومطورين
  ## عند التسجيل الأولي مثال 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'EMAIL'
  
  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
  ## عنوان SMTP واسم المستخدم وكلمة المرور مطلوبة
  ## تحذير: قد يسبب حرف '#' في كلمة مرور SMTP مشاكل!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: USERNAME
  DISCOURSE_SMTP_PASSWORD: "PASSWORD"
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (اختياري، الافتراضي true)
  DISCOURSE_SMTP_DOMAIN: forums.insertcredit.com
  DISCOURSE_NOTIFICATION_EMAIL: noreply@forum.insertcred.it
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: nyc3
  DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
  DISCOURSE_S3_ACCESS_KEY_ID: KEY_ID
  DISCOURSE_S3_SECRET_ACCESS_KEY: ACCESS_KEY_VALYE
  DISCOURSE_S3_CDN_URL: https://f.insertcred.it
  DISCOURSE_S3_BUCKET: insertcredit-forum
  DISCOURSE_S3_BACKUP_BUCKET: insertcredit-forum-backup
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_INSTALL_CORS_RULE: false

  DISCOURSE_CAN_PERMANENTLY_DELETE: true

  ## إذا أضفت قالب Lets Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
  LETSENCRYPT_ACCOUNT_EMAIL: EMAIL

  ## عنوان CDN http أو https لهذه النسخة من Discourse (مُهيأ للسحب)
  ## راجع https://meta.discourse.org/t/14857 للحصول على التفاصيل
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## مفتاح عنوان IP من Maxmind للبحث عن عناوين IP
  ## راجع https://meta.discourse.org/t/-/137387/23 للحصول على التفاصيل
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## حاوية Docker عديمة الحالة؛ جميع البيانات مخزنة في /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## تذهب الإضافات هنا
## راجع https://meta.discourse.org/t/19157 للحصول على التفاصيل
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git
          - git clone https://github.com/discourse/discourse-signatures.git
          - git clone https://github.com/discourse/discourse-chart.git
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

## أي أوامر مخصصة للتشغيل بعد البناء
run:
  - exec: echo "Beginning of custom commands"
  ## إذا كنت ترغب في تعيين عنوان البريد الإلكتروني 'من' للتسجيل الأول، قم بإلغاء التعليق وتغيير:
  ## بعد الحصول على أول بريد إلكتروني للتسجيل، قم بإعادة التعليق على السطر. يجب تشغيله مرة واحدة فقط.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

آمل أن يكون هذا مفيدًا فيما يتعلق بالسؤال. نقطة واحدة تجدر ملاحظتها هي أننا لم نتلق أي تقارير عن مشاكل اختفاء الصور الرمزية (avatars) التي واجهناها قبل بضعة أيام. إلى علمي، لم يتم تغيير أي شيء، لذا نحن غير متأكدين مما إذا كانت المشكلة قد كانت لمجموعة صغيرة من المستخدمين فقط، وأنه منذ حل المشكلة السابقة، تم حلها تلقائيًا مع مرور الوقت.

شكرًا مرة أخرى على اهتمامك بهذا الأمر.