التنزيلات القادمة من S3 حتى مع تعيين DISCOURSE_S3_CDN_URL

اتبعت الدليل الموجود على Configure an S3 compatible object storage provider for uploads لإعداد Backblaze B2 لتخزين الملفات المرفوعة، ولاحظت مشكلة غريبة.

عند إنشاء موضوع ورفع صورة، يتم تعيين قيمة img src إلى S3_CDN_URL الخاص بي. أما عند رفع ملف مضغوط (zip)، فإن الرابط يكون ضمن /uploads ويعيد التوجيه مباشرة إلى الدلو (bucket) الخاص بي بدلاً من استخدام S3_CDN_URL. لم أقم بتعيين DISCOURSE_CDN_URL - ويشير الدليل إلى أن هذا لا يؤثر على هذه المشكلة.

إعداداتي ذات الصلة هي:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-west-000"
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  DISCOURSE_S3_ENDPOINT: "https://s3.us-west-000.backblazeb2.com"
  DISCOURSE_S3_ACCESS_KEY_ID: "ID"
  DISCOURSE_S3_SECRET_ACCESS_KEY: "KEY"
  DISCOURSE_S3_CDN_URL: "https://devforum-b2-cdn.freetls.fastly.net"
  DISCOURSE_S3_BUCKET: "bucket-name"
  DISCOURSE_S3_BACKUP_BUCKET: "backup-bucket/devforum"
  DISCOURSE_BACKUP_LOCATION: s3

لماذا يتم التعامل مع ملفات zip بشكل مختلف عن الصور؟

هذه المسألة الخاصة بالتخزين وتكوينه تعتبر فعلاً تحديًا كبيرًا على مر السنين.

كنت أخزن صوري على AWS S3. ثم غيرت التخزين الخاص بي إلى الخادم المحلي. الآن اختفت مئات الصور فجأة.

على الرغم من أن هذا ليس ردًا مباشرًا أو تعليقًا على استفسارك، إلا أنني أُعبّر عن تعاطفي مع المشكلات المشابهة.

انظر إعداد الموقع: استخدام URL CDN لجميع التحميلات على S3

استخدم URL CDN لجميع الملفات التي تم تحميلها على S3 بدلاً من الصور فقط.

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

ولكن يبدو أن هناك مشكلة أخرى. لقد قام بنقل تخزين S3 إلى خادم محلي. الآن العديد من مشاركاتي القديمة، والتي كانت تحتوي على 10 صور، يتم عرض حوالي نصفها والنصف الآخر لا. (مثال على أحد هذه المواضيع)

سيعمل على حل هذا في عطلة نهاية الأسبوع القادمة.



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

[اقتباس=“باتيندا، المشاركة:4، الموضوع:177000”]
شكرًا.
لقد عينت الوظيفة لبعض أصدقائي المحليين. وهو يطلع على الأمر.
[/اقتباس]

آسف. كنت أتحدث عن المشكلة الأخرى.

أعتقد أن مشكلتك، على الأرجح، أكثر تعقيدًا.

[اقتباس=“باتيندا، المشاركة:4، الموضوع:177000”]
نقل التخزين s3 إلى الخادم المحلي.
[/اقتباس]

هذا معقد بالفعل.

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

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

def process_uploads
  begin
    # قراءة قائمة أسماء الملفات
    filenames = File.readlines('/shared/uploads/allfiles.txt').map(&:strip)
    count = 0

    filenames.each do |filename|
      # إضافة /shared في بداية الاسم
      filename.gsub!(/\.\//, "")
      full_path = File.join('/shared/uploads/default/original/', filename)

      begin
        # التحقق من وجود المسار وأنه ملف عادي (وليس مجلد)
        count += 1
        
        if File.exist?(full_path) && File.file?(full_path)
          # فتح الملف
          File.open(full_path, 'r') do |tempfile|
            # إنشاء رفع باستخدام المعلمات المحددة
            u = UploadCreator.new(tempfile, 'imported', {}).create_for(-1)
            puts "#{count} -- #{u.id}: #{u.url}"
          end
        else
          puts "تحذير: المسار غير موجود أو ليس ملفًا عاديًا: #{full_path}"
        end
      rescue => e
        puts "خطأ في معالجة الملف #{full_path}: #{e.message}"
        # الاستمرار مع الملف التالي حتى لو فشل الحالى
        next
      end
    end
  rescue Errno::ENOENT
    puts "خطأ: لم يتم العثور على files.txt"
  rescue => e
    puts "خطأ في قراءة files.txt: #{e.message}"
  end
end

# تنفيذ المعالجة
process_uploads;