清理上传并从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 hourspurge deleted uploads grace period days 是控制检测到孤立或已删除上传文件后多久被清除并永久从站点中删除的两个设置。

有关 clean up uploads 作业的更多详细信息,请参阅 GitHub 上的 clean_up_uploads.rb 文件

清除 S3 上传文件

:warning: 以下部分仅适用于自托管的 Discourse 站点。

:information_source: 如果您目前托管在我们的 企业计划 上,如果您对从 S3 存储中删除上传文件有任何疑问,请联系 team@discourse.org

孤立和已删除上传文件的清理对于本地和 S3 存储都类似。本地存储和 S3 存储之间的唯一区别在于 S3 上传文件的清理由 S3 通过 墓碑策略 自动处理。有关 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)

如果一切正常,此查询不应返回任何行。如果您在 Data Explorer 插件 中使用此查询,它还将整齐地链接到包含未引用附件的帖子。

如果上述查询返回结果,您可以使用以下查询来修复缺失的上传引用:

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;

您需要直接访问数据库才能进行更正。