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