تقديم أصول JavaScript مجمعة مسبقًا للمستضيفين الذاتيين

:mega: ينشر Discourse الآن أصول JavaScript مُعدة مسبقًا، مما سيسرع بشكل كبير عملية التثبيت والتحديثات، خاصة للخوادم ذات الموارد المحدودة.


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

في اختباراتنا، تقلل هذه التغييرات من وقت بناء الأصول على خادم Digital Ocean بسعة 1 جيجابايت من ذاكرة الوصول العشوائي من 45 دقيقة إلى 3 دقائق فقط.

كيف يعمل؟

عند دمج كل التزام في main، يقوم سير عمل GitHub Actions ببناء وتجميع الأصول في ملفات .tar.gz (واحد للإنتاج، وواحد للتطوير). يتم نشر هذه الحزم عبر إصدارات GitHub في مستودع مخصص. نضمن نشر الأصول قبل أن ينتقل أي التزام إلى tests-passed.

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

هل يؤثر هذا على المستخدمين النهائيين؟

لا. لا تزال الأصول تُقدم للمستخدمين النهائيين من الخادم الخاص بك / شبكة توصيل المحتوى (CDN).

هل يمكنني إلغاء الاشتراك؟

نعم! إذا كنت تفضل بناء أصولك الخاصة ولديك خادم قوي بما فيه الكفاية، قم بتعيين DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 في ملف app.yml الخاص بك.

ماذا لو كنت أقوم بتشغيل نسخة من Discourse مُشعبة أو مُعدلة؟

تتم تسمية حزم الأصول حسب تجزئة الالتزام. إذا كنت تقوم بتشغيل نسخة مشعبة، فلن يتم العثور على حزمة وسيتم بناء الأصول من المصدر. إذا كانت نسخة Discourse الخاصة بك مُعدلة (أي أن شجرة العمل في git ليست نظيفة)، فلن يحاول Discourse تنزيل حزمة.

ماذا عن خطوات البناء الأخرى المتعلقة بالأصول؟

حاليًا، ينطبق هذا التحسين فقط على أصول JavaScript الأساسية. في المستقبل، قد نقوم بتوسيعه ليشمل بعض الإضافات وخطوات أخرى مثل ضغط gz/brotli.

ماذا عن الفرع المستقر؟

سيتم نشر الأصول المُعدة مسبقًا للفرع المستقر بدءًا من التحديث الرئيسي التالي، والمخطط له في أغسطس 2025.

53 إعجابًا

لقد قمت للتو بإعادة بناء https://discourse-on-a-pi5.falco.dev/ واستغرقت 3 دقائق و 35 ثانية فقط، هذا مثير للإعجاب للغاية!

23 إعجابًا

إعداد حاويتين وبدون قاعدة بيانات ~ 8 دقائق.

5 إعجابات

واو :scream: :person_bowing:

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

إليك ما يحدث عندما لا يفي التثبيت الخاص بك بالمعايير:

I, [2025-08-01T06:43:09.560655 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake assets:precompile:build'
[assemble_ember_build] حد heap_size_limit لـ Node.js أقل من 2048 ميجابايت. جارٍ تعيين --max-old-space-size=2048 و CHEAP_SOURCE_MAPS=1
[assemble_ember_build] لم يتم العثور على ملف معلومات البناء الموجود.
[assemble_ember_build] دليل عمل Git غير نظيف. لا يمكن تنزيل الأصول المجمعة مسبقًا.
[assemble_ember_build] جارٍ تشغيل بناء أساسي كامل...

أقوم ببعض التعديلات على config/initializers/100-sidekiq.rb في app.yml لإضافة دعم لعدد محاولات إعادة لجميع مهام sidekiq (والذي أفترض أنه الطريقة الوحيدة لتحقيق ذلك وليس ضمن مكون إضافي؟ ولكن يمكن إعادة النظر فيه) لذلك أعتقد أن هذا يكفي لعدم تلبية المعايير …

إعجابَين (2)

إنه ممكّن افتراضيًا. تحتاج فقط إلى تحديد التكوين إذا كنت تريد إلغاء الاشتراك.

نعم بالضبط. أي نوع من الاختلافات في مستودع git سيؤدي إلى فشله.

بخصوص أمر sidekiq، إذا فتحت موضوعًا حوله، فمن المؤكد أننا سنتمكن من إيجاد طريقة للقيام بذلك إما من مكون إضافي، أو ربما يمكننا تقديم GlobalSetting جديد له.

4 إعجابات

بالمناسبة، طريقة بسيطة جدًا لتوقيت عمليات البناء لديك دون الحاجة إلى البقاء حاضرًا عند وحدة التحكم الخاصة بك هي كالتالي:

time ./launcher rebuild app
11 إعجابًا

تغيير لطيف. أحصل على

حقيقي 2م41.898ث
مستخدم 0م0.372ث
نظام 0م0.583ث

شكرا لك على عملك

4 إعجابات

رائع، مثير للإعجاب، هل تم تحديد التاريخ؟ إصداري هو a81eaacb1c53581912519ae6574fa3523ef215dd هل يجب أن أنتظر لإعادة البناء؟

أوه، لطيف :star_struck:

شكرًا لك @merefield - لا أصدق أنني اكتشفت هذا الآن بعد 7 سنوات وعدة مئات من عمليات إعادة البناء عبر سطر الأوامر :grin:

5 إعجابات

إذا كنت تتبع قناة الإصدار القياسية الخاصة بنا، فيمكنك إعادة البناء الآن وجني الفوائد.

4 إعجابات

The Only Ones! شكرا لك.

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

4 دقائق لإعادة البناء. لقد فعلت هذا عدة مرات اليوم وتم الترحيل بالكامل! ديسكورس مثير للإعجاب! في إعادة البناء التالية، سأتذكر استخدام هذا الأمر الرائع، شكرًا للجميع.

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

ربما تكون فكرة الحد من هذا إلى app/assets و config/locales للنواة والإضافات؟ في الوقت الحالي، سيؤدي هذا أيضًا إلى إعادة بناء كاملة عند تطبيق تصحيحات Ruby فقط (أمنية).

نعم، من الممكن أن نقيد هذا بشكل أكبر. على الرغم من أنه في حالة تصحيحات الأمان، من الشائع جدًا أن تؤثر على تطبيق JS أيضًا… لذا سيظل إعادة البناء الكامل ضروريًا.

إعجابَين (2)

لقد جربتها للتو، إنها رائعة، حوالي 3 دقائق! يا لها من ميزة ذكية ومذهلة. :star_struck:
يجعلني أرغب في تثبيت كل إضافة موجودة واحدة تلو الأخرى الآن. :rofl:

5 إعجابات

حقًا حقًا، هذا رائع

في الواقع، أعتقد أن هذا من شأنه أن يهزم الغرض منه، إذا فهمت بشكل صحيح.

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

يجب عليه بناء وتجميع أي إضافة “غير معروفة” أثناء البناء، لذا فإن الكثير منها سيؤدي إلى إبطائه بشكل كبير.

إعجابَين (2)

التحديث إلى 3.6.0.beta1 والأصول المعدة مسبقًا غير موجودة

Fetching and extracting https://get.discourse.org/discourse-assets/3.6.0.beta1-d63a2431/production.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100     9  100     9    0     0     24      0 --:--:-- --:--:-- --:--:--    24
curl: (22) The requested URL returned error: 404
[assemble_ember_build] Failed to download prebuilt assets: Command failed with exit 22: curl
[assemble_ember_build] Running full core build...

إعجابَين (2)

هل تستهدف علامة beta لهذا التثبيت؟