Daraufhin habe ich lib/tasks/uploads.rake:migrate_from_s3 untersucht und folgendes gefunden:
.where("raw LIKE '%.s3%.amazonaws.com/%' OR raw LIKE '%(upload://%'")
Mir ist jedoch aufgefallen, dass Video-Uploads nicht das rohe upload://-Pseudoprotokoll erhalten, sondern stattdessen einfach als direkte Links zum Speicheranbieter enden (in meinem Fall DigitalOcean Spaces).
Es liegt auf der Hand, dass ich diese Aufgabe anpassen muss, damit sie erfolgreich ist.
Wäre es sinnvoller, entweder anstelle von oder zusätzlich zur direkten Referenz auf Amazon die Werte SiteSetting.s3_endpoint und SiteSetting.s3_upload_bucket zu prüfen?
Gibt es Tests für die Aufgaben? Ich sehe keine. Ich habe eine Lösung, die wie die offensichtliche Korrektur aussieht, aber keine Möglichkeit, bestehende Tests zu erweitern, und keine einfache Methode, um nicht-destruktiv zu testen. Das macht mich unsicher…
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)
Außerdem erwarte ich aus Erfahrung, dass das System, obwohl alle diese Bilder bereits optimiert sind, beschließt, 10 Tage lang alle 50 GB Bilder (insgesamt 96 GB Dateien, Original + optimiert) beim Verschieben neu zu optimieren und dabei alle E-Mail-Benachrichtigungen für die gesamte Website abzuschalten. Da ich keine gute Möglichkeit zum Testen habe, wollte ich fragen, ob das der Fall ist. Falls ja, möchte ich wissen, ob es eine Umgehung gibt, um einfach die bereits optimierten Bilder herunterzuladen.
Ich kann alle Dateien ganz einfach mit dem MinIO Client auf das lokale System kopieren. Mich interessiert, wie aufwendig es wäre, die Dateien einfach an den richtigen Ort zu legen und die Datenbank so anzupassen, dass sie auf den neuen Speicherort zeigt, ohne alle Bilder neu zu optimieren…