توقعات تكوين S3 بين الإعدادات العالمية وإعدادات الموقع

لديك مثيل Discourse، وبعد أشهر من إنشائه في البداية، قمنا بتفعيل “S3” (في حالتنا، DigitalOcean Spaces) لفترة قصيرة، وذلك فقط عبر إعدادات المسؤول، ودون استخدام أي خيارات إعداد DISCOURSE_ في ملف app.yml. لم نقم بنقل كل شيء إلى S3، لكن معظم الصور لدينا كُتبت أثناء تفعيل هذه الميزة. والآن نرغب في نقل كل شيء بعيدًا عن “S3” لأسباب مختلفة غير مهمة هنا.

(أعلم أن هذا يبدو حتى الآن كمنشور دعم فني. لكنه ليس كذلك…)

في طلب دمج (PR) تم قبوله مؤخرًا، أضفت مهمة rake باسم uploads:batch_migrate_from_s3 كغلاف بسيط حول uploads:migrate_from_s3 لتمكين نقل دفعات صغيرة قدرها صور منشور واحد فقط، وقمت بتشغيلها. عند هذه النقطة اكتشفت أن مهمة upload:migrate_from_s3 التي تستدعيها مهمتي تفترض أن ملف discourse.conf يحتوي على إعدادات S3 غير متاحة عبر واجهة المستخدم:

** Invoke uploads:batch_migrate_from_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:batch_migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'

ما هو الحل الأفضل؟

  1. من المتوقع دائمًا أن يتم إعداد S3 عبر متغيرات البيئة DISCOURSE_ في ملف app.yml وكتابتها في config/discourse.conf أثناء بناء الحاوية، وعليّ فعل ذلك وإعادة بناء التطبيق الآن. (ألاحظ أن متغير البيئة المُدخل إلى rake لا يبدو أنه يُعدّل GlobalSettings هنا أيضًا؛ لقد جربت ذلك أيضًا. ومن المفترض أن حقيقة أن أي شيء عمل مع إعداد SiteSettings فقط هو إغفال غير مقصود.) جربت ذلك بوضع s3_bucket في ملف config/discourse.conf داخل الحاوية الموجودة، فتم حل الخطأ بالنسبة لي.
  2. تعديل مهمة الهجرة بشكل أكبر بحيث، إذا كان SiteSetting.s3_upload_bucket مضبوطًا ولكن GlobalSetting.s3_bucket هو nil، يتم تعيين GlobalSetting.s3_bucket إلى SiteSetting.s3_upload_bucket — أعتقد أن هذا لن يكون PR صعبًا إذا اعتُبر صحيحًا، لكنني لم أراجع ذلك بعمق بعد. تعديل: حاولت تعديل GlobalSetting.s3_bucket داخل uploads:migrate_from_s3 ولم ينجح ذلك بسبب عدم وجود مُعرِّف (accessor).
  3. جعل SiteSetting.absolute_base_url يستخدم SiteSetting.s3_upload_bucket إذا كان GlobalSetting.s3_bucket هو nil — هل يُقصد بهذا حتى أن يكون إعدادًا صحيحًا؟
  4. إضافة إمكانية تعيين s3_bucket في إعدادات الموقع بحيث تكون متاحة في واجهة المستخدم.

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

وللتوضيح: لقد تجاوزت مشكلتي بطريقة تافهة؛ لكنني فوجئت بضرورة القيام بذلك.

إعجابَين (2)