تحديد روابط DISCOURSE_S3_CDN_URL للأصول في عنوان URL الخاص بـ S3 CDN

يمكنك التحقق من المتغيرات التي نعيّنها هنا infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

هذه هي المتغيرات التي نعيّنها المتعلقة بـ S3/CDN

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

أعتقد أن DISCOURSE_S3_BUCKET تم إهمالها لصالح DISCOURSE_S3_UPLOAD_BUCKET و DISCOURSE_S3_BACKUP_BUCKET. يجب عليك تعيين هذه بدلاً من ذلك.

هذا ما افترضته، لكنني لا أصل إلى أي نتيجة ما لم أقوم بتعيين كل من DISCOURSE_S3_UPLOAD_BUCKET و DISCOURSE_S3_BUCKET. كما ترون من مقتطف الكود المنشور أعلاه، فإن use_s3? لا تزال تبحث عن s3_bucket وليس s3_upload_bucket.

تعيين DISCOURSE_BACKUP_BUCKET لا يحل المشكلة، حسب ما أستطيع استنتاجه.

إذا قمت بتعيين متغيرات البيئة الخاصة بـ bucketين معًا، فإنني أتقدم خطوة واحدة، لكنني الآن واجهت مشكلة جديدة، حيث يتجاهل Discourse عنوان URL الخاص بـ S3 CDN الخاص بي ويحاول تحميل الأصول من المسار الأساسي الخاص بي. وهذا يتسبب في أخطاء CSP (سياسة أمان المحتوى) لأن سياسة أمان المحتوى تتضمن فقط مسار الأصول من S3 CDN الخاص بي.

يجب أن يكون DISCOURSE_S3_BACKUP_BUCKET بدلاً من DISCOURSE_BACKUP_BUCKET. بخلاف ذلك، إذا كنت تقوم بتعيين جميع المتغيرات مع توزيعات Cloudfront السحابة، فسيكون ذلك يعمل. إذا نظرت إلى إعداداتنا، فلن نقوم بتعريف DISCOURSE_S3_BUCKET

لست متأكدًا مما إذا كان إعادة التحميل (rebake) مطلوبًا أيضًا.

@Falco، حسب ما أذكر، أحد الأمور التي جعلت هذا الأمر غير بديهي للغاية هو وجود اختلاف في السلوك بين تعيين DISCOURSE_S3_CDN_URL كمتغير بيئة / إعداد عام، وتعيينه كإعداد موقع. ربما ترغب في الانتباه إلى ذلك في دليلك التعليمي (howto).

نعم، آسف، كان ذلك خطأ مطبعي فقط في منشوري السابق. DISCOURSE_S3_BACKUP_BUCKET لا تقوم بتعيين s3_bucket في GlobalSetting بالنسبة لي. لست متأكدًا من كيفية تشغيلك لتلك المهمة rake دون تعيين DISCOURSE_S3_BUCKET.

أقدر مساعدتك حقًا، وأدرك أن هذا ليس من مشاكلك التي يجب حلها، لذا شكرًا لك.

لا تقلق، ليست مشكلة. لقد نسيت أن أذكر أننا نحدد أيضًا USE_DB_S3_CONFIG: true في ملف app.yml الخاص بنا. infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

وأعتقد أنك على حق، لأن هذا يغير سلوك كيفية تعريف حاويات S3 (discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub)، وعلى الأرجح أنه خطأ.

تحقق مما إذا كان هذا الإعداد يحل المشكلة بالنسبة لك.

مرحباً @eatcodetravel، شكراً لك على منشورك الرائع.

أحاول إعداد CloudFront مثلك.

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

ماذا سيحدث بعد تحديث discourse؟ هل يجب أن أرفع المظهر مرة أخرى إذا لم يتم ذلك تلقائياً؟

شكراً لك.

بالطبع.

def ensure_s3_configured!
  unless GlobalSetting.use_s3? || use_db_s3_config
    STDERR.puts "ERROR: تأكد من إعداد S3 في config/discourse.conf أو متغيرات البيئة"
    exit 1
  end
end

use_db_s3_config يوفر عليك الحاجة إلى تعيين هذا المتغير الإضافي. يجب أن يكون هناك خطأ في global_setting.rb لأنه يجب أن أتمكن من تعيين DISCOURSE_S3_UPLOAD_BUCKET فقط، ما لم يكن هناك فرق بين ذلك و DISCOURSE_S3_BUCKET، لكنني أعتقد أنك محق في أن الأخير مفترض أن يكون مُعطلًا.

بغض النظر عن وجود خلل في global_setting.rb، ما زلت أواجه مشكلة حيث يبحث Discourse عن الأصول في مكانها المعتاد وليس على شبكة توصيل المحتوى (CDN) الخاصة بـ S3، رغم أنني حددت جميع المتغيرات الخاصة بي وتم تعيين DISCOURSE_ENABLE_S3_UPLOADS إلى true.

هناك مهمة مخصصة لذلك: bundle exec rake uploads:migrate_to_s3. بمجرد إعداد حاويات التخزين (buckets) الخاصة بك، قم بتشغيل هذه المهمة لنقل الملفات المرفوعة إلى S3. لقد تغير نظام S3/CDN في الأشهر القليلة الماضية، والوثائق غير محدثة، لذا تأكد من عمل نسخة احتياطية والتحضير مسبقًا في حال حدوث أي خطأ.

عند تمكين هذه الميزة لأول مرة، واجهنا بعض فترات التوقف عن العمل بينما كنا نحاول فهم كل شيء.

أظن أن هذا بسبب غياب DISCOURSE_CDN_URL. لدينا في إعداداتنا ما يلي:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # يشير هذا إلى الخادم
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # يشير هذا إلى حوض S3

يتم جلب أوراق الأنماط من الخادم، لذا تستخدم DISCOURSE_CDN_URL. أما ملفات JavaScript فتُحمّل إلى حوض S3 وتستخدم DISCOURSE_S3_CDN_URL. وقد شرح لي @Falco ذلك هنا.

نعم، لقد رأيت ذلك. لقد قمت بتعيين DISCOURSE_CDN_URL، لكنني ما زلت أواجه نفس المشكلة. ومع ذلك، أنا متعب، لذا ربما أغفلت شيئًا ما أثناء كل هذا التشتت. سأعود إلى هذا غدًا. شكرًا لك على المساعدة.

هل سيقوم هذا الرفع برفع الملفات كصور وكملفات أصول (assets) بصيغة JS إلى S3؟ وهل يجب أن أستخدم رابط CloudFront أم أن S3 كافٍ؟ شكراً لمساعدتكم.

bundle exec rake uploads:migrate_to_s3 سيقوم برفع المرفقات فقط إلى S3، ويجب تشغيل هذه المهمة مرة واحدة فقط. بعد تمكين S3، سيتم حفظ الرفع الجديد في سلال S3.

لرفع الأصول، يجب استخدام bundle exec rake s3:upload_assets، ويجب تشغيلها بعد كل إعادة بناء أو ترقية.

لقد قمت بما ذكرته، وتمت عمليات تحميل الملفات إلى S3 (مثل الصور) بنجاح، لكنني أحصل على الخطأ التالي بالنسبة إلى الأصول (assets):

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

لقد قمت بإعداد كلا المتغيرين:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # يشير هذا إلى الخادم
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # يشير هذا إلى دلو S3

ربما يكون هذا مرتبطًا بـ USE_DB_S3_CONFIG: true. حاول تعيين هذا المتغير لمعرفة ما إذا كان سيؤدي إلى عمل.

إليك جميع المتغيرات التي قمت بتعيينها المتعلقة بـ S3/CDN

نعم، شكرًا لك :slightly_smiling_face:. هذا قد حل المشكلة.

هناك مشكلة مثيرة للاهتمام؛ فـ Discourse يحاول الوصول إلى ملفات الأصول من مسار خاطئ. فهو يحاول الوصول من مسار brotli_asset، لكن هذا المسار غير موجود في حزمة S3.

كما يحاول الوصول إلى ملفات الجافا سكريبت وملفات الأنماط (CSS) من عنوان CDN، لكن هذه الملفات غير موجودة في الحزمة أيضًا.

@ufukayyildiz أعتقد أن جميع إجابات مشاكلك موجودة في هذا الموضوع. لقد مررت للتو بنفس الإعداد.

باختصار، يجب أن تتأكد من أنك قمت برفع أصولك بعد تجميعها مسبقًا.

انتظر
لا أفهم نقطة واحدة.

لماذا يتم إعداد هذه البيانات في ENV؟

سأقدم مثالاً خاصاً بي.

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

المثال الثاني مختلف لأنني لا أستطيع نقل البيانات القديمة إلى S3 (تعمل البيانات الجديدة فقط) ولكن هنا إدخال هذه البيانات في ملف app.yml (DISCOURSE_S3_ACCESS_KEY_ID: ‘key’ وما إلى ذلك) لا يغير أي شيء ولا يزال لا يعمل (أي

rake uploads:migrate_to_s3

لا يعمل)

هل يمكنك شرح ذلك لي؟

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