清理上传并清除 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 任务的更多详细信息,请参阅 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;

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