Gli avatar impiegano molto tempo a caricarsi dopo il passaggio a R2 compatibile con S3

Ciao,

Ho appena migrato a R2 e tutto è andato alla perfezione. Tutte le immagini utilizzano il link CDN S3. Tuttavia, ho notato un problema: gli avatar impiegano molto tempo a caricarsi. In media, ci vogliono circa 3-4 secondi, sia che si faccia clic sull’avatar di un utente, sia che si guardi all’interno di un post. È normale?

Mmm, sospetto che il problema possa essere uno di tre diversi, ma il più probabile per me è il ridimensionamento dinamico.

1. Ridimensionamento dinamico degli avatar

quando hai migrato i tuoi upload su R2, sono state spostate anche le immagini originali; tuttavia, Discourse utilizza molte dimensioni diverse di avatar (ad esempio 45px per i messaggi, 120px per la scheda utente).

se quelle dimensioni ottimizzate specifiche non sono state migrate perfettamente, o non sono state ancora generate, Discourse deve generarle in modo sincrono nel momento in cui l’utente le clicca:

  1. Discourse scarica l’avatar originale da R2 sul server locale
  2. lo ridimensiona utilizzando ImageMagick
  3. carica la nuova dimensione su R2
  4. reindirizza il browser al nuovo URL, e questo processo richiede da 3 a 4 secondi

per verificare: aggiorna forzatamente la pagina: se l’avatar impiega 3-4 secondi la prima volta, ma si carica istantaneamente la seconda volta, è esattamente ciò che sta accadendo.

per risolvere: il problema si risolverà naturalmente man mano che gli utenti navigano e le dimensioni vengono generate. Ma puoi risolverlo immediatamente forzando il server a pre-generare tutti gli avatar in background accedendo al server tramite SSH ed eseguendo:

./launcher enter app
rake avatars:refresh

2. Timeout IPv6 di 3 secondi

se gli avatar impiegano 3-4 secondi ogni volta, anche dopo più aggiornamenti, probabilmente stanno incontrando un timeout di rete.

Gli endpoint API di Cloudflare R2 sono dual-stack, ovvero utilizzano sia IPv4 che IPv6. Se il tuo droplet del server ha un indirizzo IPv6 assegnato, ma il gateway IPv6 dell’host non è instradato correttamente, la connessione interna di Ruby al bucket R2 tenterà prima IPv6, rimarrà in attesa per 3 secondi (questo è il timeout TCP predefinito di Linux), fallirà e quindi avrà successo istantaneamente utilizzando IPv4.

per verificare: accedi al server tramite SSH ed esegui:

curl -I -6 https://cloudflare.com

se rimane in attesa per alcuni secondi e fallisce, l’IPv6 del server non funziona correttamente, causando un ritardo di 3 secondi in ogni controllo interno dell’API S3.

per risolvere: dovrai oppure correggere il routing IPv6 nel pannello di controllo dell’host o forse disabilitare completamente IPv6 sul droplet.

3. Ritardi di Gravatar

se il tuo sito è configurato per controllare gli aggiornamenti di Gravatar, potrebbe contattare i server esterni di Gravatar prima di visualizzare l’avatar. Se il server ha una connessione in uscita lenta (spesso correlata anche a DNS o IPv6), potrebbe bloccare il rendering dell’avatar.

per verificare: esegui questo comando sul server
curl -I -6 https://gravatar.com
se rimane in attesa per 3 secondi, l’IPv6 non funziona correttamente (vedi sopra)

soluzione relativa a Gravatar: nelle impostazioni di Discourse, vai su scarica automaticamente i gravatars, disattivala temporaneamente e vedi se questo risolve il problema. Non penso che sia questo il problema, ma se lo è, puoi lasciare l’impostazione disattivata, oppure correggere il routing IPv6 come descritto al punto 2, oppure cambiare il resolver DNS.

Grazie per la tua rapida risposta. Credo di aver già provato prima ‘rake avatars:refresh’, ma non ne sono assolutamente sicuro.

Quello che funzionava per me per far apparire immediatamente l’avatar era cliccarci una prima volta; al secondo clic, si apriva istantaneamente. Ma probabilmente è dovuto alla cache. Inoltre, ho appena testato il tuo secondo suggerimento e restituisce un “HTTP/2 301”, con diverse altre righe. La stessa cosa per il suggerimento 3. Eseguiò di nuovo avatars:refresh tra qualche giorno, poiché ho dovuto ripristinare un’istantanea. Grazie ancora!

Gravatar

server: nginx
date: Mon, 22 Jun 2026 19:29:00 GMT
content-type: text/html; charset=utf-8
content-length: 0
content-language: en
expires: Wed, 11 Jan 1984 05:00:00 GMT
cache-control: no-cache, must-revalidate, max-age=0
x-redirect-by: Gravatar
location: https://en.gravatar.com/
alt-svc: h3=":443"; ma=86400
strict-transport-security: max-age=31536000; includeSubdomains; preload

CF

HTTP/2 301
date: Mon, 22 Jun 2026 19:27:00 GMT
content-type: text/html
content-length: 167
location: https://www.cloudflare.com/
cache-control: max-age=3600
expires: Mon, 22 Jun 2026 20:26:59 GMT
set-cookie: __cf_bm=eBP2aJ7Eg30nHPuvMMNxxKrgNtcNwKs0WDgnYyONeus-1782156420-1.0.1.1-sXpW27iuhGDF615cOfwNFybH4IMxgvZy3uA_3X_o..402T_3KSgT7CSymipL5RjdpGe3raWEqsVxQFFLPKRoDjfoT7B.0rqyDt.osbkOF98; path=/; expires=Mon, 22-Jun-26 19:57:00 GMT; domain=.cloudflare.com; HttpOnly; Secure; SameSite=None
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=QfYqSekEDPJHC2k%2BMjHN0cGjz172tmUWe2GSR8EgwNLh3TGjFYkQ0vwPxlzY1NcBcKFOMaAi4FlgjqjhETOOtHf%2BH9KdQSvqN3OME2Uh1i4nHIw%2Fy1qkvSpf4jxDchM7CaDW80tJkjBV4OqF"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
strict-transport-security: max-age=15780000; includeSubDomains
server: cloudflare
cf-ray: a0fda5d8ecd6b26d-LAX
alt-svc: h3=":443"; ma=86400

Sì, dato il tuo messaggio, sono quasi certo che si tratti del problema n. 1, poiché i risultati del comando curl per Cloudflare e Gravatar sembrano essere quelli attesi. Prova rake avatars:refresh quando ti fa comodo e fammi sapere se funziona.