ترحيل_من_s3: يجب تعطيل تحميلات S3 قبل تشغيل هذه المهمة

أنا أحاول نقل جميع البيانات من S3 إلى خادمي مرة أخرى. لكن الأمر rake uploads:migrate_from_s3 يعيد خطأ “يجب عليك تعطيل تحميلات S3 قبل تشغيل هذه المهمة”. لذا قمت بإلغاء تحديد خيار تفعيل تحميلات S3 في إعدادات Discourse، وأضفت أيضًا DISCOURSE_USE_S3: false إلى ملف app.yml. لكن دون جدوى، نفس الخطأ.

[1] pry(main)> SiteSetting.enable_s3_uploads
=> false
[2] pry(main)> GlobalSetting.use_s3
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true

أنا مشوش. كيف يمكنني تعطيله؟

هل يحتوي ملف app.yml الخاص بك على متغيرات بيئة S3؟ قد تحتاج إلى التحقق منها لتعطيل عمليات تحميل S3.

ما هو متغير بيئة S3؟ في حالتي، DISCOURSE_USE_S3 محفوظ ضمن env.

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

  UNICORN_WORKERS: 2

  ## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
  DISCOURSE_HOSTNAME: engineersasylum.com

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

  ## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل سيتم تعيينها كمسؤولين ومطورين عند التسجيل الأولي، مثال 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'praveen369gen@gmail.com'

  #إعدادات S3
  DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKxxxxxxxxxxxxxxxxxxxxxDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: QWVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLigGs
  DISCOURSE_S3_BUCKET: enginxxxxxxxxxxket
  DISCOURSE_S3_BACKUP_BUCKET: enginxxxxxxxxxxxxcket
  DISCOURSE_BACKUP_LOCATION: s3

… ولا تنسَ @Pravi أنك يجب أن تعيد بناء الحاوية (التطبيق) بعد تغيير معظم المتغيرات في ملف yml الخاص بك؛ فبعضها قد يتغير بإيقاف الحاوية وتشغيلها مرة أخرى، ولكن عند الشك، أعد بناء الحاوية (التطبيق) بعد إجراء أي تغيير على ملف yml.

أقوم بإعادة بناء الحاوية بعد كل تغيير في ملف app.yml. ومع ذلك، لا تزال معطلة.

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

لقد أضفت local إلى موقع النسخ الاحتياطي، ثم أعيد بناء الحاوية وحاولت الهجرة، لكن دون جدوى. ما زالت تظهر لي الرسالة: يجب عليك تعطيل عمليات تحميل S3 قبل تشغيل هذه المهمة

أنا آسف، لا أعرف ما الذي قد يكون سببًا في ذلك.

بعد إعادة البناء باستخدام DISCOURSE_USE_S3=false في ملف yml، هل نفذت مهمة rake وما زال النظام يعرض الرسالة “يجب تعطيل تحميلات S3”؟ هل ذهبت إلى لوحة الإدارة وقمت بتعطيل S3 هناك أيضًا؟

في الوقت الحالي، ما هو ناتج:

SiteSetting.Upload.enable_s3_uploads
SiteSetting.enable_s3_uploads
GlobalSetting.use_s3?

منطق GlobalSetting.use_s3? لا يستخدم البيئة بنفس الطريقة — بل يستخدم:

  def self.use_s3?
    (@use_s3 ||=
      begin
        s3_bucket &&
        s3_region && (
          s3_use_iam_profile || (s3_access_key_id && s3_secret_access_key)
        ) ? :true : :false
      end) == :true
  end

أرى كيف قد يكون هذا مربكًا — سأطلب من شخص ما الاطلاع عليه.

للموقت، إلغاء تعيين DISCOURSE_USE_S3 في البيئة و DISCOURSE_S3_BUCKET يجب أن يسمح لك بالانتقال من S3.

هذا ما أحصل عليه،

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)>

نعم، قمت بإضافة DISCOURSE_USE_S3=false إلى ملف app.yml، ثم أعيد بناء الحاوية، ثم أشغل مهمة rake، لكن لا يزال يعطيني نفس المخرجات. نعم، قمت بتعطيل الرفع في صفحة المسؤول.

كما ذُكر هنا، يجب عليك أيضًا إلغاء تعيين DISCOURSE_S3_BUCKET في ملف YAML. ربما يكفي وضع علامة # قبلها.

في الوقت الحالي، أعيد بناء الحاوية. سأبلغ عن النتيجة خلال بضع دقائق.

لا أعرف كيف يمكن أن تكون القيمة الأخيرة صحيحة إذا قمت بتعيين متغير البيئة على false وإعادة البناء. قيم SiteSetting تأتي من لوحة الإدارة الخاصة بك، بينما GlobalSettings يتم ضبطها عبر ملف app.yml.

تم تعطيل إعداد الموقع في لوحة التحكم الخاصة بي.

s3

إعدادات S3

  #DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
  #DISCOURSE_S3_BUCKET: engineers-leakybucket
  DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
  DISCOURSE_BACKUP_LOCATION: s3
  #DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com

إلغاء تعيين DISCOURSE_USE_S3 و DISCOURSE_S3_BUCKET يعطيني هذا الخطأ:

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads:migrate_from_s3
جاري نقل الملفات من S3 إلى التخزين المحلي لـ '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'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(انظر التتبع الكامل بتشغيل المهمة مع --trace)

تحديث:

قبل إلغاء تعيين DISCOURSE_USE_S3 و DISCOURSE_S3_BUCKET:

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)> 

بعد إلغاء تعيين DISCOURSE_USE_S3 و DISCOURSE_S3_BUCKET:

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)>

مرحبًا @Pravi

نعم، كنتُ سأتقدم باقتراح للتو: قم بإلغاء تفعيل جميع متغيرات البيئة هذه وحاول ما يلي:

DISCOURSE_USE_S3: false
#DISCOURSE_S3_REGION: ap-south-1
#DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
#DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
##DISCOURSE_S3_BUCKET: engineers-leakybucket
#DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
#DISCOURSE_BACKUP_LOCATION: s3
#DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com 

لكن بعد ذلك قرأت تحديثك الأخير (شكرًا لك على التفاصيل) ويبدو أنك تحرز تقدمًا.

تهانينا على تحقيق بعض التقدم. عمل رائع!

لقد جربتُ ذلك أيضًا. قمت بإلغاء التعليق عن كل شيء باستثناء DISCOURSE_USE_S3: false، وظهور نفس الخطأ السابق.

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads: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'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

تم تعطيل SiteSetting و GlobalSettings.

root@ip-172-31-7-247-app:/var/www/discourse# rails c
[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)> 

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

هل يعرف أحد كيفية حل هذه المشكلة؟