S3-Fehler beim Hochladen von Profilfotos

Ich verwende die neueste Beta und habe S3 aktiviert, um hochgeladene Dateien zu verwalten.

Uploads in Beiträgen funktionieren einwandfrei (die Datei wird auf S3 hochgeladen und im Beitrag angezeigt), aber beim Versuch, Profilbilder hochzuladen, treten nun „Access Denied"-Fehler in der Benutzeroberfläche auf. Im Admin-Fehlerprotokoll ist nichts verzeichnet.

Einige meiner frühen Nutzer scheinen zwar Avatarbilder hochgeladen zu haben, diese werden jedoch lokal gespeichert, wie man am Quellcode erkennen kann:

<img alt="" width="45" height="45" src="/user_avatar/example.com/jackie/90/29_2.png" class="avatar" title="image title" aria-label="Imagery/FIT">

Gibt es eine Möglichkeit, Profilbilder zu S3 zu migrieren und sicherzustellen, dass neue Bilder dort hochgeladen werden können?

EDIT: Ich hätte erwähnen sollen, dass ich sichere Medien-Uploads aktiviert habe.

1 „Gefällt mir“

Verwendest du zufällig Cloudflare? Ich bin der Meinung, dass die Profilbilder tatsächlich auf S3 gespeichert, aber über deinen Server proxyed werden. Ich habe ein ähnliches Problem gelöst (alle hochgeladenen Avatare erscheinen leer), indem ich die Server-IP-Adresse in Cloudflare freigegeben habe.

1 „Gefällt mir“

Danke – aber nein, ich verwende kein CDN, sondern nur ganz normales S3 mit gesicherten Medien. Ich bin mir nicht sicher, wie man prüft, ob Anfragen proxied werden, aber hier ist die curl-Ausgabe der Header:

Das deutet für mich darauf hin, dass es nicht proxied wird, aber ich weiß nicht genug, um sicher zu sein…

curl -I https://example.com/user_avatar/discourse.psy.plymouth.ac.uk/jackie/90/29_2.png
HTTP/2 200 
server: nginx
date: Thu, 09 Sep 2021 11:26:33 GMT
content-type: image/jpeg
content-length: 4068
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: user_avatars/show
last-modified: Thu, 09 Sep 2021 09:38:05 GMT
content-transfer-encoding: binary
cache-control: max-age=31556952, public, immutable

1 „Gefällt mir“

Diese URL-Struktur ist konsistent mit einem proxied Avatar, was verwirrend ist (die Implementierung der Avatar-URLs hier auf Meta unterscheidet sich von Standard-Discourse-Instanzen). Aus der curl-Ausgabe kann ich nicht wirklich erkennen, ob es dort Informationen gibt, die ausschließen, dass Discourse die Avatares proxyt (ich bin kein Experte).

Aus meiner bisherigen Erfahrung mit diesem Thema: Wenn die Bildbeiträge auf S3 hochgeladen werden, dann sind es in der Regel auch die Avatare, es sei denn, es wird etwas sehr Individuelles umgesetzt. Ich habe bisher keine sicheren Medien-Uploads ausprobiert oder S3 ohne CDN verwendet, daher könnten diese Aspekte einen erheblichen Unterschied machen.

Es wäre gut, einen neuen Avatar hochzuladen und zu prüfen, ob du die Datei im lokalen Speicher oder im S3-Bucket finden kannst.

Meine Vermutung geht in die Richtung, dass die Server-IP bei S3 freigegeben werden muss. Ich bin jedoch kein Experte, und ich hoffe, dass sich jemand anderes dazu äußern kann.

1 „Gefällt mir“

Das Problem ist, dass S3-Uploads für Beiträge funktionieren, aber nicht für Avatar-Bilder. Meine Vermutung ist, dass die einzigen Benutzer, die Avatare haben, solche sind, die Bilder vor der Einrichtung von S3 hochgeladen haben, aber das kann ich nicht bestätigen.

1 „Gefällt mir“

Das könnte hilfreich sein: How are avatars stored and accessed? - #5 by DanielMarquard

Ich hatte ein ähnliches Problem: Beiträgebilder funktionierten, Profilbilder wurden nicht angezeigt. Die Uploads wurden für beide erfolgreich auf S3 hochgeladen, aber es gab ein Problem bei der Anzeige (Server-IP wurde drosselt/blockiert).

2 „Gefällt mir“

Ich kann bestätigen, dass beim Versuch, einen Avatar hochzuladen, die Ladebalken-Anzeige bis auf 100 % fortschreitet und erst dann „Error: Access Denied“ (Fehler: Zugriff verweigert) anzeigt.

In der JavaScript-Konsole erhalte ich folgenden Fehler:

https://discourse.psy.plymouth.ac.uk/uploads.json?client_id=0a2569993a6b43d6b5f8c60fdd2c913e
Ressource konnte nicht geladen werden: Der Server antwortete mit dem Statuscode 422 ()

Wenn ich dieser URL folge:

{"errors":["Die angeforderte URL oder Ressource konnte nicht gefunden werden."],"error_type":"not_found"}

Bei einer Prüfung des S3-Buckets habe ich festgestellt, dass nichts im Ordner „Originals“ gelandet ist.

Im Gegensatz dazu funktioniert das Hochladen eines Bildes in einen Beitrag einwandfrei: Das Bild erscheint im S3-Bucket und wird zudem verkleinert/optimalisiert.

1 „Gefällt mir“

Der HTTP-Status 422 steht anscheinend für „unprocessable entity". Das deutet darauf hin, dass Discourse den Upload aus irgendeinem Grund ablehnt, es könnte aber auch etwas anderes sein – ich denke, 422 bedeutet im Grunde nur: „Die Anfrage wurde korrekt aufgebaut, aber etwas in der Anfrage ist falsch".

Handelt es sich bei dem Bild, das du hochladen möchtest, um einen ungewöhnlichen Bildtyp oder vielleicht um ein riesiges Bild?
Hast du versucht, genau diese Bilddatei in einem Beitrag einzubinden?

Das Avatar-Bild wird standardmäßig in verschiedene Größen skaliert, daher könnte der Fehler dort auftreten, zum Beispiel wenn bei einem riesigen Bild ein Speicherlimit überschritten wird. Das ist jedoch größtenteils Spekulation.

Ich würde nicht erwarten, von S3 eine 422-Fehlermeldung zu erhalten, und diese wird auch nicht in den Fehlerantworten ihrer API-Referenz aufgeführt. Daher gehe ich davon aus, dass das Problem in Discourse auftritt, bevor ein Versuch unternommen wird, das Bild auf S3 hochzuladen.

1 „Gefällt mir“

Es hat definitiv etwas mit der Verarbeitung von Avatarbildern zu tun. Ich habe es gerade erneut mit demselben Bild versucht (diesmal über den iOS-Mobilclient), und es wird zwar innerhalb eines Beitrags problemlos hochgeladen, aber beim Verwenden desselben Bildes als Avatar tritt derselbe Fehler „Zugriff verweigert" auf.

Kann jemand anderes, der S3 mit gesicherten Medien verwendet, diesen Fehler nachvollziehen? Könnte es mit den Berechtigungen für den Bucket zusammenhängen, da das Hochladen für einen Beitrag funktioniert?

1 „Gefällt mir“