تنظيف الرفع وحذف الملفات من S3

:bookmark: هذا دليل مرجعي يصف كيفية إزالة التحميلات اليتيمة والممحوة تلقائيًا من موقع Discourse. ينطبق هذا الدليل على مواقع Discourse المستضافة ذاتيًا والمُستضافة.

:person_raising_hand: مستوى المستخدم المطلوب: المشرف

هل تساءلت يومًا عما يحدث للملفات والصور التي تم تحميلها إلى موقع Discourse ولكنها لم تعد مستخدمة، أو كيفية إزالة التحميلات من موقع؟ أنت في المكان الصحيح!

قد تحتاج إلى حذف الملفات والصور التي تم تحميلها إلى Discourse ولم تعد مستخدمة. لا توجد طريقة مدمجة للقيام بذلك من واجهة المستخدم، ومع ذلك، يحتوي Discourse على وظيفة Sidekiq مبرمجة تلقائيًا لإزالة التحميلات اليتيمة والممحوة تسمى clean up uploads.

التحميلات اليتيمة والممحوة

:information_source: التحميلات اليتيمة هي الملفات التي تم تحميلها إلى موقع Discourse ولكنها لم تعد مستخدمة. يُعتبر التحميل يتيماً فقط إذا لم يتم استخدامه في:

  • في أحدث إصدار من منشور
  • في مسودة
  • في منشور في قائمة الانتظار
  • في إعدادات الموقع (مثل الشعار، الأيقونة)
  • في رمز تعبيري مخصص
  • في سمة
  • في صورة ملف تعريف المستخدم/الخلفية/البطاقة
  • في صورة شعار الفئة/خلفية الفئة
  • في صورة وسام
  • في صورة تمييز المجموعة

:information_source: تُعتبر التحميلات “ممحوة” عند حذف الموضوع/المنشور الذي تحتويه.

تنظيف التحميلات

لإزالة التحميل بالكامل من Discourse، يجب عليك القيام بأحد الأمرين التاليين:

  • إجبار التحميل على أن يصبح يتيماً عن طريق إزالة أي مرجع إليه. يمكن القيام بذلك عن طريق تحرير رابط التحميل من المنشور الموجود فيه، أو من أي مكان آخر قد يكون التحميل مستخدمًا فيه.
  • حذف أي موضوع/منشور يحتوي على التحميل، مما يؤدي إلى اعتبار التحميل “ممحواً”. لاحظ أنه يجب عليك إزالة الصورة من المنشور قبل حذف المنشور لجعله يتيماً.

سيتم بعد ذلك إزالة جميع التحميلات اليتيمة غير المستخدمة والتحميل الممحوة من التخزين (بعد فترة سماح) بمجرد تشغيل وظيفة clean up uploads.

إعدادات الموقع

تتوفر إعدادات الموقع التالية في example.discourse.com/admin/site_settings/category/files لتعديل كيفية قيام Discourse بإزالة التحميلات تلقائيًا.

  • clean up uploads: الافتراضي true
  • clean orphan uploads grace period hours: الافتراضي 48
  • purge deleted uploads grace period days: الافتراضي 30

يمكن استخدام إعداد clean up uploads لتمكين أو تعطيل الحذف التلقائي للتحميلات اليتيمة غير المستخدمة. يتحكم إعداد clean orphan uploads grace period hours في المدة الزمنية التي يتم بعدها إزالة التحميل اليتيم المكتشف. يتحكم إعداد purge deleted uploads grace period days في المدة الزمنية التي يتم الاحتفاظ بها للتحميلات الممحوة (المُعلَّمة بالحذف) قبل إزالتها نهائيًا — ويتم التعامل مع ذلك بواسطة وظيفة مبرمجة منفصلة تسمى purge deleted uploads.

تتوفر تفاصيل إضافية حول وظيفة clean up uploads في ملف clean_up_uploads.rb على GitHub.

إزالة تحميلات S3

:warning: القسم التالي ينطبق فقط على مواقع Discourse المستضافة ذاتيًا.

:information_source: إذا كنت مستضافًا حاليًا في خطة المؤسسات، يرجى التواصل مع team@discourse.org إذا كان لديك أي أسئلة حول حذف التحميلات من تخزين S3 الخاص بك.

يعمل تنظيف التحميلات اليتيمة والممحوة بشكل مشابه لكل من التخزين المحلي وتخزين S3. الفرق الوحيد بين التخزين المحلي وتخزين S3 هو أن تنظيف تحميلات S3 يتم التعامل معه تلقائيًا بواسطة S3 عبر سياسة tombstone. راجع إدارة دورة حياة التخزين الخاص بك للحصول على تفاصيل إضافية حول كيفية معالجة ذلك في S3.

بشكل افتراضي، تتضمن وظيفة clean up uploads تحميلات S3. ومع ذلك، إذا كنت ترغب في تعطيل هذه الميزة، يمكنك إلغاء تحديد إعداد الموقع s3 configure tombstone policy.

4 إعجابات

هل هذا صحيح؟ أعتقد أنك بحاجة إلى إزالة الصورة من المنشور قبل حذف المنشور لجعله يتيمًا.

أيضًا، هل يجب أن يكون هذا الأخير purge deleted uploads grace period days؟

إعجاب واحد (1)

تمكين “تنظيف التحميلات” يبدو مخيفًا مع رسالة التحذير. عند تحويل منتدى موجود إلى Discourse، سيتم تعطيل هذا الإعداد. لن تقوم جميع نصوص الاستيراد بتسجيل جميع التحميلات في المشاركات بشكل صحيح، لذلك إذا قمت بتمكينه، فقد تفقد الكثير من المرفقات.

باستخدام الاستعلام التالي، يمكنك التحقق مما إذا كانت التحميلات مشار إليها بشكل صحيح بواسطة المشاركات:

select p.post_id, u.id as upload_id
from (select id post_id, (regexp_matches(cooked, 'data-download-href=[^\\s]+/default/([a-z0-9]+)', 'g'))[1] upload_sha from posts where raw like '%upload://%' order by created_at) as p
join uploads u on u.sha1 = p.upload_sha
where not exists(select * from upload_references r where r.upload_id = u.id)

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

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

insert into upload_references(upload_id, target_type, target_id, created_at, updated_at)
select u.id, 'Post', p.post_id, u.created_at, u.updated_at
from (select id post_id, (regexp_matches(cooked, 'data-download-href=[^\\s]+/default/([a-z0-9]+)', 'g'))[1] upload_sha from posts where raw like '%upload://%' order by created_at) as p
join uploads u on u.sha1 = p.upload_sha
on conflict do nothing;

ستحتاج إلى وصول مباشر إلى قاعدة البيانات لإجراء التغيير التصحيحي.