Configura il caricamento di file e immagini su S3

Il primo post sopra\nhttps://meta.discourse.org/t/set-up-file-and-image-uploads-to-s3\nè ancora una guida valida che consente agli amministratori di farlo? In caso contrario, esiste un altro luogo in cui si trova la guida S3 corretta per il 2024? Viene detto che questa è ufficiale e supportata dal team Discourse.\n\nL’abbiamo implementata come sopra e le immagini sono corrotte nell’istanza Discourse, sebbene vengano caricate su S3.\n\nIl nostro flusso\n1) Impostare il bucket S3 stesso e la policy in S3 come sopra (tutti i passaggi sono stati seguiti accuratamente)\n2) Impostare l’ambiente in app.yml e in admin (identico) come sopra\n\n3) ricostruire l’app con launcher\n\n3) non viene utilizzato alcun CDN poiché la nostra comprensione è che sia opzionale e dovrebbe funzionare senza CDN.\n\nRisultato:\n1) Le immagini vengono caricate nel bucket da Discourse\n2) i link nei post vengono correttamente sostituiti da Discourse con link Amazon come\nxxx-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/a1b21eb5de071799d4b5e5215619d11d28602dfe.jpeg\n3) i link non sono accessibili (presumibilmente a causa della policy S3 nella guida ufficiale)\n\nPresunta modifica per la policy S3 ufficiale nella guida. Principal: Questa policy non specifica un Principal, il che significa che si applica a chiunque sia stato autenticato con le giuste autorizzazioni. Se si desidera consentire l’accesso anonimo (pubblico), è necessario specificare \"Principal\": \"*\". Anche questa potrebbe non essere una buona soluzione poiché rende il bucket pubblico.\nquesta è un’ipotesi poiché apprezziamo se qualcuno aggiornerà la guida per renderla corretta nel 2024

Hey,
.we are using Cloudflare R2 for s3 storage(it works now) and i wanted to move discourse to another server.
However profile pictures were missing when restoring from a backup even when checking the “backup uploads” option.

so i ran the s3 migrate command on the old server to migrate images that are still local, and it’s failing with this trace, it’s not clear what’s the reason.

rake uploads:migrate_to_s3 --trace
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
Please note that migrating to S3 is currently not reversible! 
[CTRL+c] to cancel, [ENTER] to continue

Migrating uploads to S3 for 'default'...
Uploading files to S3...
 - Listing local files
..... => 5123 files
 - Listing S3 files
....... => 6871 files
 - Syncing files to S3
.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^[[B............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
828 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 4898 of 5838 uploads are not migrated to S3. S3 migration failed for db 'default'. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:73:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:455:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'

it seems these pictures are still stored locally for some reason, even though i ran this migration script before.

1 Mi Piace

La mia ipotesi è che tu abbia modificato qualcosa nella configurazione di S3 e che le immagini mancanti si trovino in un bucket o in un percorso diverso rispetto a quelle nuove.

Puoi guardare

Upload.pluck(:url)

per vedere cosa c’è che non va, forse.

1 Mi Piace

Ho recentemente avuto lo stesso problema e sono riuscito a risolverlo. L’ho fatto aggiornando i permessi IAM con questo ruolo

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
               "s3:List*",
               "s3:Get*",
               "s3:AbortMultipartUpload",
               "s3:DeleteObject",
               "s3:PutObject",
               "s3:PutObjectAcl",
               "s3:PutObjectVersionAcl",
               "s3:PutLifecycleConfiguration",
               "s3:CreateBucket",
               "s3:PutBucketCORS"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    },
    {
       "Effect": "Allow",
       "Action": [
           "s3:ListAllMyBuckets",
           "s3:ListBucket"
       ],
       "Resource": "*"
    }
  ]
}

Ho anche dovuto abilitare la proprietà dell’oggetto ACL

Ecco le mie configurazioni complete quando cerco s3

4 Mi Piace

Configura CORS sul bucket insieme alle impostazioni di cui sopra per i caricamenti in più parti.

[
    {
        "AllowedHeaders": [
            "content-type",
            "x-amz-acl",
            "x-amz-meta-sha1-checksum"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD",
            "PUT"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

È possibile cambiare fornitore di servizi S3?

Vorrei sapere se ci saranno problemi se provo a cambiare fornitore di servizi S3, ignorando la questione delle immagini già caricate. Non ho problemi particolari con questo, dato che il sito non è ancora attivo; lo sto ancora sviluppando.

È possibile salvare le immagini in locale e poi attivare nuovamente S3 con il nuovo fornitore di servizi?

È possibile impostare siteSettings.include_s3_uploads_in_backups=true in rails ed eseguire quindi un backup, modificare le impostazioni S3 e ripristinare il backup.

1 Mi Piace

Va bene, ho capito. Grazie mille!

1 Mi Piace

Il thread collegato menziona una PR per rimuovere un’attività migrate_from_s3, e non ho visto alcun motivo per credere che sia stata aggiunta in seguito, ma volevo verificare se fosse ancora così. Sto pensando di migrare a MinIO e sono un po’ preoccupato di renderlo una dipendenza.

Mi chiedo se questo possa fornire una soluzione alternativa a quanto ho menzionato sopra. Includere quell’impostazione, fare un backup, disabilitare le impostazioni S3 e ripristinare il backup.

Sì. Lo ripristinerei su un nuovo server, così se qualcosa va storto hai ancora un server funzionante.

Da questo thread, sembra che questa impostazione scarichi i singoli file da S3, ma mi chiedo se potrebbero esserci problemi con i post che fanno riferimento a URL S3 anziché a file locali. Non sono sicuro di come ciò venga gestito nel database. Sarei interessato a sapere se la tua migrazione a un altro provider ha avuto successo, @Rhod.

1 Mi Piace

Ho effettuato la transizione senza problemi. Sottolineo che non ho avuto problemi importanti perché il numero di immagini o backup era minimo. Il forum era interamente a scopo di test, non ancora in “produzione”. Infine, dopo diversi tentativi ed errori, ho reinstallato il forum su un nuovo server (Hetzner) e configurato S3 (Cloudflare R2) per backup e immagini con il server che alla fine mi ha convinto.

Mi dispiace di non poter essere di grande aiuto. Vedrò se potrò testarlo su un altro server in futuro.

Con CF R2, le miniature della tua chat funzionano correttamente?

1 Mi Piace

Non avevo notato quell’errore; la verità è che ho la chat disabilitata sul mio sito.

Non credo che la userò, ma ho ancora lo stesso errore che hai menzionato nel tuo post.

Tuttavia, terrò d’occhio il tuo post per vedere se ti aiutano a trovare una soluzione.

1 Mi Piace

Grazie Walter! Sono venuto qui per postare la stessa cosa solo per vedere che l’avevi già fatto.

@Discourse c’è qualche possibilità di integrare il contenuto del post di Walter nel post iniziale?

Posso caricare video su S3? Al momento, quando carico video, solo la copertina del video viene caricata su S3, ma il video non viene caricato.