Migration des uploads non-images S3/spaces vers le local

J’ai lu la page suivante :

J’ai donc examiné lib/tasks/uploads.rake:migrate_from_s3 et j’ai trouvé :

    .where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")

Cependant, j’ai remarqué que les uploads de vidéos ne reçoivent pas le pseudo-protocole upload:// brut, mais se terminent simplement par des liens littéraux vers le fournisseur de stockage (dans mon cas, DigitalOcean Spaces).

Il semble évident que je devrai modifier cette tâche pour qu’elle fonctionne.

Serait-il plus judicieux de consulter SiteSetting.s3_endpoint et SiteSetting.s3_upload_bucket, soit à la place, soit en plus de la référence littérale à Amazon ?

Y a-t-il des tests pour les tâches ? Je n’en vois aucun. J’ai ce qui pourrait ressembler à une solution évidente, mais aucune possibilité d’enrichir les tests existants, et aucun moyen simple de tester de manière non destructive. Ce qui me rend inquiet…

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)

Par ailleurs, d’après mon expérience, je m’attends à ce que, même si toutes ces images ont déjà été optimisées, le système décide qu’il doit passer 10 jours à réoptimiser les 50 Go d’images (96 Go de fichiers au total, originaux + optimisés) lors de leur déplacement, désactivant toutes les notifications par e-mail de tout notre site pendant cette opération. Comme je n’ai pas de bon moyen de tester, je me demandais si c’est bien le cas ; si oui, je voudrais savoir s’il existe une solution pour contourner cela, c’est-à-dire simplement copier les images déjà optimisées.

Je peux facilement copier tous les fichiers sur le système local en utilisant MinIO Client. Je me demande à quel point il serait difficile de simplement placer les fichiers à leur emplacement et de modifier la base de données pour qu’elle pointe vers le nouvel emplacement, sans réoptimiser toutes ces images…

Je ne l’ai pas encore testé, mais au moins, il est partagé sous forme de demande de tirage (PR) plutôt que simplement en tant que publication sur le forum Meta.

Beaucoup d’autres corrections connexes, désormais validées par le processus réel de migration, dans une nouvelle PR