Я посмотрел на lib/taks/uploads.rake:migrate_from_s3 и обнаружил:
.where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")
Однако я заметил, что при загрузке видео псевдопротокол upload:// не используется, а ссылки становятся прямыми адресами к провайдеру хранилища (в моём случае — DigitalOcean Spaces).
Кажется очевидным, что мне придётся модифицировать эту задачу, чтобы она сработала.
Не будет ли более разумным ориентироваться на SiteSetting.s3_endpoint и SiteSetting.s3_upload_bucket — либо вместо ссылки на Amazon, либо в дополнение к ней?
Есть ли тесты для этих задач? Я их не вижу. У меня есть решение, которое, возможно, является очевидным исправлением, но у меня нет возможности дополнить существующие тесты, и нет простого способа провести тестирование без разрушения данных. Это вызывает у меня беспокойство…
index 0761c4712a..63f49155f3 100644
--- a/lib/tasks/uploads.rake
+++ b/lib/tasks/uploads.rake
@@ -129,12 +129,12 @@ def migrate_from_s3
Post
.where("user_id > 0")
- .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")
+ .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%#{SiteSetting.Upload.absolute_base_url}%' OR raw LIKE '%(upload://%'")
.find_each do |post|
begin
updated = false
- post.raw.gsub!(/(\/\/[\w.-]+amazonaws\.com\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
+ post.raw.gsub!(/(\/\/[\w.-]+(amazonaws\.com|#{Regexp.quote(SiteSetting.s3_endpoint)})\/(original|optimized)\/([a-z0-9]+\/)+\h{40}([\w.-]+)?)/i) do |url|
begin
if filename = guess_filename(url, post.raw)
file = FileHelper.download("http:#{url}", max_file_size: max_file_size, tmp_file_name: "from_s3", follow_redirect: true)
Кроме того, исходя из опыта, я ожидаю, что, несмотря на то, что все эти изображения уже оптимизированы, система решит, что ей нужно потратить 10 дней на повторную оптимизацию всех 50 ГБ изображений (96 ГБ общих файлов, оригиналы + оптимизированные) в процессе их перемещения, отключив при этом все уведомления по электронной почте для всего нашего сайта. Поскольку у меня нет хорошего способа протестировать это, я хотел спросить, так ли это на самом деле; если да, то я хотел бы узнать, есть ли способ обойти это — просто скопировать уже оптимизированные изображения.
Я могу легко скопировать все файлы на локальную систему с помощью MinIO Client. Мне интересно, насколько сложно было бы просто поместить файлы на нужное место и изменить базу данных так, чтобы она указывала на новое расположение, без повторной оптимизации всех этих изображений…