Alte Beiträge neu backen zieht keine neue S3 CDN URL nach Umbenennung des S3-Buckets

Nach der Installation von Discourse (2.7.0.beta1) und dem Import alter Google Groups-Beiträge habe ich die S3-Bucket-/Schlüsselkonfiguration hinzugefügt (jedoch keine CDN-URL) und ausgeführt:

rake uploads:migrate_to_s3

Dies schien hervorragend zu funktionieren. Alle Bilder wurden auf S3 hochgeladen, und Discourse versuchte, über eine automatisch generierte S3-URL darauf zuzugreifen – etwas wie:

https://ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

Anschließend habe ich den Bucket umbenannt (in ortus-discourse-uploads) und eine Cloudfront-Distribution davor eingerichtet, mit einem von Cloudflare konfigurierten CNAME namens:

https://communitycdn.ortussolutions.com/

Der CNAME, Cloudfront und S3 funktionieren alle einwandfrei. URLs wie diese liefern korrekt eines der Bilder im Bucket aus:

https://communitycdn.ortussolutions.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

Das Problem ist jedoch, dass Discourse vollständig auf die alte Domain ortus-discourse.s3.dualstack.us-west-2.amazonaws.com festgefahren ist (die aufgrund des umbenannten Buckets nicht funktioniert), und egal wie oft ich den Container neu erstellt oder die alten Beiträge neu gebacken habe, ich kann Discourse auf keine Weise dazu bringen, die neue CDN-URL zu verwenden. Ich habe einen Tag lang danach gesucht und wahrscheinlich ein Dutzend Mal neu gebacken (innerhalb des app-Containers) mit verschiedenen Einstellungen. Jedes Forumsthema gibt denselben Rat – neu erstellen und neu backen –, aber es funktioniert nicht.

Es sind nicht nur die Bilder in den Beiträgen defekt; selbst das <link rel="icon" type="image/png" href=""> und das Site-Logo bleiben auf der alten Domain und verwenden nicht die S3-CDN-URL.

Hier sind meine aktuellen S3-Einstellungen:

  DISCOURSE_S3_ACCESS_KEY_ID: '********'
  DISCOURSE_S3_SECRET_ACCESS_KEY: '******'
  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_ENABLE_S3_UPLOADS: true
  DISCOURSE_S3_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_UPLOAD_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_BACKUP_BUCKET: 'ortus-discourse-backups'
  DISCOURSE_S3_REGION: 'us-west-2'
  DISCOURSE_S3_CDN_URL: https://communitycdn.ortussolutions.com

  DISCOURSE_CDN_URL: https://community.ortussolutions.com

Ich habe sogar versucht, die alte URL in Beiträgen wie folgt auf die neue URL umzuleiten:

rake posts:remap["ortus-discourse.s3.dualstack.us-west-2.amazonaws.com","communitycdn.ortussolutions.com"]

Der Befehl meldete jedoch, dass 0 Beiträge betroffen waren.

Nirgendwo in meinen Umgebungsvariablen oder DB-Einstellungen habe ich etwas, das auf den alten Bucket-Namen ortus-discourse verweist, daher kann ich nicht herausfinden, woher Discourse diesen bezieht. Ich bin neu bei Discourse und kein Ruby-Entwickler, daher habe ich nicht tiefer geschaut als das, was ich in meiner app.yml, der Admin-Oberfläche und der Ausgabe der rake-Befehle sehen kann, die ich in den Foren gefunden habe.

Was ist der Wert dieser Uploads in der Tabelle Uploads?

./launcher enter app
rails c
Upload.all.sample(10).pluck(:url)

@Falco Danke für die Rückmeldung. Hier ist die Ausgabe dieses Befehls.

root@discourse-app:/var/www/discourse# rails c
Upload.all.sample(10).pluck(:url)
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/52b3aff4e63a7e38bef42d469bafd1ed7c1cc1a2.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f90374a280a4681332bcd2191b8de43462f8776.png",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/29691fba566fc998a966aa93859753e3cf0b8528.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6ae912ced40d60adc1356c1d7acf144b0fa0985a.jpeg",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/4dfe5b48fc8cb5d79880d70355c34d7ed02be812.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/897c4b4e755c1c8e93224a27187dc631a02e4388.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/59886f322e6834b567d473138108fab6e0f33764.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/e3e3429d63155cf0d850e161846d187bc6f273ea.jpeg",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/1b701869b4b235daa8d6a9a7728766f3b4e69814.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/c83aaee941462d47ef91f0c6448257d07487b231.png"]
[2] pry(main)>

Es gibt tatsächlich einige Dateien mit dem alten Bucket.

Die erforderliche Zuordnung lautet:

./launcher enter app
rails c
DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")

Bitte erstelle vorher ein Backup, da eine solche Operation nicht rückgängig gemacht werden kann.

@Falco Nochmals vielen Dank. Ich habe zwei Remaps ausgeführt:

DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")
DbHelper.remap("ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")

Ich habe das Image neu erstellt, und das hat Dinge wie das Logo im Seitenkopf behoben. Ich baue jetzt alle Beiträge erneut auf, um zu sehen, ob damit auch die Bildinhalte in den Beiträgen korrigiert werden, aber das wird eine Weile dauern.


Während wir also auf den Neuaufbau warten: Was ist hier schiefgelaufen? Ist das ein Fehler in Discourse, bei dem meine Uploads an der alten URL hängen geblieben sind und nicht auf die neue umgestellt werden konnten?

Ich habe Beiträge wie diesen gelesen, die über das Ändern einer CDN-URL sprachen, aber dort wurde nur das Ersetzen von Zeichenketten in den Beiträgen erwähnt (was nicht funktioniert hat) und die DBUtil-Remap-Funktion wurde überhaupt nicht angesprochen. How do I change the legacy CDN URLs of images in posts?

Ich habe sogar versucht, das Rake-Skript für den Import nach S3 erneut auszuführen, erhielt aber einen Fehler (Entschuldigung, ich habe ihn mir damals nicht notiert).

Außerdem habe ich ein migrate_from_s3-Rake-Skript gefunden, das ich fast ausgeführt hätte, um zu prüfen, ob ich von vorne beginnen könnte. Dann habe ich jedoch einen Forenbeitrag hier gefunden, der darauf hinwies, dass meine Datenbank beschädigt würde, wenn ich es ausführe, also habe ich es in Ruhe gelassen.

Ich bin ratlos, was ich anders hätte tun sollen oder welcher Forenbeitrag mir hätte weiterhelfen können. (Ich habe wirklich alles versucht, das Problem selbst zu lösen, bevor ich hier gepostet habe!)

Leider hat das Neuberechnen die in Beiträgen eingebetteten Bilder anscheinend nicht behoben. Interessant ist, dass ich beim Bearbeiten eines alten Beitrags das Bild so dargestellt sehe:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

Beim Anzeigen des Beitrags ist jedoch nur ein großer leerer Bereich im Beitrag zu sehen, der auf folgendes verweist:

https://community.ortussolutions.com/images/transparent.png

Dies ist eine recht neue Änderung. Die meisten Bilder von gestern wiesen einfach auf die alte, falsche S3-URL hin, aber irgendwann gestern Abend oder heute ist das transparente PNG aufgetaucht.

Hmmmm, das ist nicht das, was ich dir in meiner Antwort gesagt habe :face_with_raised_eyebrow:

In der uploads-Tabelle erwarten wir den S3-Speicherort, und dieser wird erst im Cook-Prozess des Markdowns durch das CDN ersetzt.

Du hast das CDN in die uploads-Tabelle eingetragen, was nicht dem entspricht, was die Software normalerweise tut.

Entschuldige bitte, ich habe angenommen, du hast den Originalbeitrag nicht sorgfältig genug gelesen, um zu sehen, dass ich die Cloudflare-Distribution erwähnt habe und dass ich sie anpassen musste, um meine eigentliche URL zu verwenden. Mir war nicht klar, dass die unerwünschte URL tatsächlich irgendwo in der Datenbank gespeichert war. Ich hätte fast geantwortet und gefragt, ob das das war, was du meintest, aber es schien offensichtlich, was ich tun musste.

Kein Problem, ich kann diese problemlos zurück auf die S3-URL umleiten. Dies ist eine neue Discourse-Installation, und der gesamte hochgeladene Inhalt befindet sich am selben Ort, sodass ein Wechsel einfach ist.

Meine Fragen dazu, was in meinem vorherigen Beitrag schiefgelaufen ist, bleiben bestehen.

Ich glaube, es ist so einfach: Wir unterstützen das Ändern des Object Storage-Buckets nicht.

Mit „unterstützen

Ok, das ist fair. Das eigentliche Problem war also, dass ich den S3-Bucket umbenannt habe und davon ausgegangen bin, dass das Aktualisieren des Bucket-Namens im Admin-Bereich alles Nötige erledigt. Vielleicht wäre eine Warnung in der Admin-Oberfläche beim Bearbeiten des Bucket-Namens hilfreich. (Ich habe zunächst die Einstellungen im Admin-Bereich verwendet, bevor ich auf Umgebungsvariablen umgestiegen bin, in der Hoffnung, dass dies irgendwie helfen könnte.) Es war definitiv nicht klar, dass das Ändern des Bucket-Namens nach dem Hochladen problematisch sein würde.

Ich habe die Domains wieder auf die korrekte AWS S3-Domain umgemappt.

DbHelper.remap("communitycdn.ortussolutions.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/fc05f9be9b783479819fec68b1d8e493110007a4.cfc",
 "/images/d-logo-sketch-small.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/50f0d6f260cdb4ef91e29023d92b46df096ab34e.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/65d80cddc6dc15b9a4d1b9e9d88cc9a8928c5316.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/a86aa2a12183428f3289caa95787ea16f22e2e4d.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f76b5238b147a60c8ad5f65bd7fa4bb6b58d852.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6a4c9b992e6cd8a15ddeaec0d158ebd473164525.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/93420848249ecea2261d405e46f7f450cc02a3af.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/d67c39e06ce624b9deb7625dd041d21cffd96df9.png"]

Ich habe die App erneut neu aufgebaut und bin nun dabei, die Beiträge neu zu backen. Mal sehen, ob der 37. Versuch der Glücksfall ist :slight_smile:

Alle Uploads haben die korrekte S3-Bucket-URL, der Container wurde neu erstellt und alle 30.000 Beiträge wurden erneut generiert. Dennoch erscheint anstelle aller meiner Bilder nach wie vor:

/images/transparent.png

Beim Bearbeiten der Beiträge wird weiterhin Folgendes angezeigt:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

Interessant ist, dass andere Anhänge wie ZIP-Dateien jetzt einwandfrei funktionieren.

Fehlt noch ein Baustein, damit die eingebetteten Bilder in alten Beiträgen korrekt angezeigt werden?

Können Sie die Attribute des Upload-Objekts für yTDVQSa4wbIeLGEZvE7muXe8sAJ ausgeben?

Das würde ich sehr gerne machen, aber ich brauche hier etwas Hilfe. Ich bin Entwickler, aber kein Ruby-Entwickler. Ich habe herausgefunden, wie man alle Attribute eines zufälligen Uploads so ausgeben kann:

[17] pry(main)> Upload.all.sample(1)
=> [#<Upload:0x00005633230f8af0
  id: 353,
  user_id: 273,
  original_filename: "helloWorldF.zip",
  filesize: 50542,
  width: nil,
  height: nil,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
  created_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  updated_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  sha1: "3a532dec6390d5087ed6154fc0335c2c0f1ea543",
  origin: nil,
  retain_hours: nil,
  extension: "zip",
  thumbnail_width: nil,
  thumbnail_height: nil,
  etag: nil,
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

Und ich habe einige Referenzen zu RORs Active Record zum Auffinden spezifischer Datensätze gefunden, aber ich kann dort keine Daten finden, die auch nur annähernd wie yTDVQSa4wbIeLGEZvE7muXe8sAJ aussehen. Wie finde ich den entsprechenden Upload-Datensatz?

Oh, gute Nachrichten. Während ich recherchierte, wie man Upload-Einträge findet, bin ich auf diesen Beitrag gestoßen, der mir zeigte, wie man den Base62-String in den SHA1-Hash umwandelt.

Darin wurde erwähnt, dass Bilder, die nur die transparent.png anzeigen, als „tombstoned