Modifica del bucket s3 per gli upload

Ciao!

Stiamo migrando tutti i nostri file/caricamenti tra due servizi compatibili con S3 (entrambi sono spazi Digital Ocean, se è rilevante) e ho deciso che ci troviamo in una situazione piuttosto critica.

Inizierò spiegando come è stata eseguita la migrazione:

  1. Abbiamo clonato/sincronizzato il bucket iniziale sul nuovo bucket con rclone.
  2. Tutti i riferimenti nella pagina Files nell’amministrazione di Discourse sono stati aggiornati ai nuovi endpoint.
  3. È stato eseguito un re-bake.

Purtroppo, questo non ha prodotto l’effetto desiderato e ora tutte le immagini sono “scomparse” dal forum. Sono ancora presenti nel bucket S3 (e fortunatamente anche in quello vecchio) ma nessun post riesce a trovare la propria immagine.

La dimensione del bucket è di circa 60 GB, quindi si tratta (anche se non estrema) di una quantità di dati piuttosto consistente.

Ho ricostruito il container, ho provato a recuperare dati dal tombstone, ho fatto praticamente tutto ciò che mi è venuto in mente o che ho trovato nel forum di supporto o nelle attività rake.
Ho anche provato con una sostituzione del database (tramite discourse remap).

Al momento, ogni immagine nel contenuto bakes appare più o meno così:

<img src="https://xxxx.xxxxx.xx/images/transparent.png" alt="image" data-orig-src="upload://h8UudilPhVsGnNmvlJ5lQYEr8PT.jpeg" width="375" height="500">

Questo mi fa pensare che il b64-sha del link sia danneggiato o che lo SHA dell’immagine sia cambiato per qualche motivo.

Qualcuno ha già fatto qualcosa di simile? Sono tutte le immagini perse per sempre? (sì sì, ho un backup e le immagini originali, quindi so che esiste un modo per risolvere).

2 Mi Piace

Potrebbe valere la pena menzionare che ho anche provato a utilizzare l’URI CDN fornito per il bucket Spaces (con un rebake).

1 Mi Piace

Risultato dai caricamenti mancanti:

rake posts:missing_uploads
Ricerca di caricamenti mancanti su: default
Ripristino dei caricamenti mancanti:
🚫
Mancano 17075 caricamenti di post.

Mancano 16906 caricamenti.
1 su 16906 è un caricamento con lo schema vecchio.
14646 su 139801 post sono interessati.

post_uploads ha 3448 voci
optimized_images ha 25681 voci
uploads ha 5764 voci

1 Mi Piace

Puoi vedere Moving from one S3 bucket to another

Penso di avere una bozza di come fare che proverò a pubblicare domani.

5 Mi Piace

Sarebbe molto utile, grazie mille!

1 Mi Piace

Ciao @Jite!

Controlla se questo funziona per te. Se sì, procederò a creare una guida howto adeguata.

Vecchi bucket

Questo presuppone che tu possa installare e configurare uno strumento per spostare i dati dal tuo vecchio bucket a una macchina locale e poi fare lo stesso dal locale al nuovo bucket. Consulta aws cli sync (che può essere configurato anche per bucket non AWS) e gsutil rsync per ulteriori informazioni. Se hai grandi quantità di dati o stai spostando tra bucket dello stesso provider, potresti voler esplorare metodi che spostano i dati direttamente tra i bucket.

Entra in una directory adatta come spazio temporaneo (ad esempio, mkdir temp-bucket; cd temp-bucket) prima di eseguire operazioni come quelle seguenti. Questi esempi includono gli switch -n e --dry-run per mostrarti cosa accadrà. Se sembra corretto, esegui di nuovo il comando senza tale switch.

Sposta i vecchi dati dal vecchio bucket al locale

    gsutil  rsync -r -n  gs://=OLD= .

o

    aws s3 sync s3://=OLD= .

Sposta i dati dal locale al nuovo bucket

    gsutil rsync -r -n . gs://=NEW=

o

    aws s3 sync . s3://=NEW=

Aggiornamento del database per utilizzare il nuovo bucket

Esegui questi comandi dalla console di Rails. Per accedervi, esegui:

cd /var/discourse
./launcher enter app
rails c

Per il nuovo bucket, carica un’immagine con la nuova configurazione ed esegui:

Upload.last.url

Dovresti vedere qualcosa del genere:

=> "//discourse-bucket.s3.dualstack.us-east-2.amazonaws.com/original/2X/7/12345fbea574afc4e02db80107e6682430aede2c.png"

Otterrai quindi discourse-bucket.s3.dualstack.us-east-2.amazonaws.com per il nuovo bucket. Ottieni lo hostname del vecchio bucket allo stesso modo dall’output sopra.

Usa questo per verificare che i tuoi upload siano dove pensi che siano:

Upload.order(Arel.sql('RANDOM()')).limit(10).pluck(:id, :url)

Ora, aggiornerai il database per utilizzare il nuovo bucket invece del vecchio. DbHelper.remap sostituirà le occorrenze in tutte le tabelle.

DbHelper.remap("//=OLDHOST=/","//=NEWHOST=/")

Passare ad AWS potrebbe richiedere la cancellazione del tuo s3_endpoint.

NOTA: Se hai definito un s3_endpoint nelle tue SiteSettings nel database e passi ad AWS (dove non è necessario alcun endpoint), dovrai cancellare quella impostazione del sito dopo aver creato il nuovo container con le impostazioni aggiornate (o dopo aver ripristinato un database che lo contiene).

Rigenera i post che fanno riferimento al bucket invece che alla CDN S3

Se hai post che collegano direttamente al nuovo bucket s3 (magari non avevi definito un s3_cdn_url in precedenza), ecco come rigenerare solo i post che ne hanno bisogno.

Ottieni i post:

  posts=Post.where("cooked like '%=NEWHOST=%'")

Controlla quanti sono:

  posts.count

Rigenera quei post:

  posts.each do |p| p.rebake! end

Oppure, sostituisci semplicemente il bucket con la CDN:

posts.each do |p|
  p.cooked.gsub!(/=NEWHOST=/,"=CDN=")
  p.save!
end

8 Mi Piace

Grazie per la risposta.

In pratica ho fatto lo stesso che l’ultima volta, ma ho riprovato. Il problema è che posts.count restituisce 0. Tutti i post contengono il file transperent.png nel post “cooked” e includono un hash nel “uncooked”.

C’è qualche modo per far sì che l’immagine venga risolta correttamente durante il bake?

1 Mi Piace

Hmm. Giusto. Questa modifica temporanea serve solo a evitare la ricreazione. Se la ricreazione non funziona, allora c’è qualcosa che non va. Forse le risorse non si trovano dove pensa Discourse?

1 Mi Piace

Beh, è possibile, ma il “movimento” è stato praticamente un trasferimento 1:1 di tutti i file nel bucket, hehe…

2 Mi Piace

Quindi puoi sostituire il vecchio URL del bucket con quello nuovo e funziona?

I valori in Uploads sembrano corretti?

1 Mi Piace

Ho un po’ paura che tornando al vecchio bucket si avvierà un’operazione per spostare tutto nel tombstone, dato che ora sono considerati “vecchi”, ma sì, il database sembra puntare alle immagini corrette (nuova posizione); è praticamente solo che i vecchi post non risolvono verso l’immagine corretta (immagino…).

1 Mi Piace

Dopo aver eseguito il task rake di recupero dei tombstone e poi il task rake di fix_missing_uploads, finalmente è iniziato il “ripristino” delle immagini.
Sembra che le stia scaricando e ricaricando di nuovo, e richiede molto tempo e utilizza molte risorse, ma almeno gli utenti riavranno le loro immagini!

Grazie per l’aiuto @pfaffman :slight_smile:

3 Mi Piace

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.