Cleaning up uploads and purging uploads from 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: Если вы в настоящее время размещены на нашем Enterprise Plan, пожалуйста, свяжитесь с team@discourse.org, если у вас возникнут вопросы об удалении загрузок из вашего хранилища S3.

Очистка сиротских и удаленных загрузок работает аналогично как для локального, так и для хранилища S3. Единственное различие между локальным хранилищем и хранилищем S3 заключается в том, что очистка загрузок S3 автоматически обрабатывается S3 с помощью политики tombstone. Дополнительные сведения о том, как это обрабатывается в S3, см. в разделе Управление жизненным циклом хранилища.

По умолчанию задача clean up uploads включает загрузки S3. Однако, если вы хотите отключить эту функцию, вы можете снять флажок настройки сайта s3 configure tombstone policy.

4 лайка

Is this accurate? I think you need to remove the image from the post before deleting the post to orphan it.

Also, should this last one be purge deleted uploads grace period days?

1 лайк

Enabling “clean up uploads” sounds scary with the warning message. When converting an existing forum to discourse this setting will be disabled. Not all import scripts will properly register all the uploads in posts, so if you enable it, you might lose a lot of attachments.

With the following query you can check if uploads are properly referenced by the posts:

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)

That should not return any rows if everything is correct. If you use this query in the Data Explorer plugin it will also neatly link to the posts which have unreferenced attachments.

If the above query does return results you can fix the missing upload references with the following query:

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;

You will need direct database access in order to make the corrective change.