Configurez la mise en ligne de fichiers et d'images vers S3

Le premier post ci-dessus
https://meta.discourse.org/t/set-up-file-and-image-uploads-to-s3
est-il toujours un guide valide qui permet aux administrateurs de le faire ? Sinon, existe-t-il un autre endroit où se trouve le guide S3 correct pour 2024 ? Il est dit que c’est officiel et supporté par l’équipe Discourse.

nous l’avons implémenté comme ci-dessus et les images sont cassées sur l’instance Discourse bien qu’elles soient téléchargées sur S3.

Notre flux

  1. Configuration du bucket S3 lui-même et de la politique dans S3 comme ci-dessus (toutes les étapes sont suivies avec précision)

  2. Configuration de l’environnement dans app.yml et dans l’administration (identique) comme ci-dessus

  3. reconstruction de l’application par le lanceur

  4. aucun CDN n’est utilisé car nous pensons qu’il est facultatif et qu’il devrait fonctionner sans CDN.

Résultat :

  1. Les images sont téléchargées dans le bucket par Discourse
  2. les liens dans les posts sont correctement remplacés par Discourse par des liens Amazon comme
    xxx-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/a1b21eb5de071799d4b5e5215619d11d28602dfe.jpeg
  3. les liens ne sont pas accessibles (supposé à cause de la politique S3 dans le guide officiel)

Changement supposé pour la politique S3 officielle dans le guide. Principal : Cette politique ne spécifie pas de Principal, ce qui signifie qu’elle s’applique à toute personne authentifiée avec les bonnes permissions. Si l’on veut autoriser l’accès anonyme (public), il faut spécifier \"Principal\": \"*\". Cela pourrait également ne pas être une bonne solution car cela rend le bucket public.
c’est une supposition car nous apprécierions si quelqu’un mettait à jour le guide pour le rendre correct en 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 « J'aime »

Je suppose que vous avez modifié quelque chose dans votre configuration s3 et que les images manquantes se trouvent dans un compartiment ou un chemin différent de celui des nouvelles.

Vous pouvez regarder

Upload.pluck(:url)

Pour voir ce qui ne va pas, peut-être

1 « J'aime »

J’ai récemment eu le même problème et j’ai pu résoudre le problème. Je l’ai fait en mettant à jour les autorisations IAM avec ce rôle

{
  "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": "*"
    }
  ]
}

J’ai également dû activer la propriété des objets ACL

Voici mes configurations complètes lorsque je recherche s3

4 « J'aime »

Configurer CORS sur le bucket avec les paramètres ci-dessus pour les téléchargements en plusieurs parties.

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

Est-il possible de changer de fournisseur de services S3 ?

J’aimerais savoir s’il y aura des problèmes si j’essaie de changer de fournisseur de services S3, en ignorant la question des images déjà téléchargées. Je n’ai pas vraiment de problèmes majeurs avec cela puisque le site n’est pas encore opérationnel ; je suis toujours en train de le développer.

Est-il possible de sauvegarder les images localement, puis d’activer S3 à nouveau avec le nouveau fournisseur de services ?

Vous pouvez définir siteSettings.include_s3_uploads_in_backups=true dans rails, puis effectuer une sauvegarde, modifier les paramètres S3 et restaurer la sauvegarde.

1 « J'aime »

D’accord, j’ai compris. Merci beaucoup !

1 « J'aime »

Le fil de discussion lié mentionne une PR pour supprimer une tâche migrate_from_s3, et je n’ai vu aucune raison de croire qu’elle ait été ajoutée ultérieurement, mais je voulais vérifier si c’était toujours le cas. J’envisage de migrer vers MinIO et je suis un peu préoccupé par le fait d’en faire une dépendance.

Je me demande si cela pourrait fournir une solution de contournement pour ce que j’ai mentionné ci-dessus. Inclure ce paramètre, faire une sauvegarde, désactiver les paramètres S3 et restaurer la sauvegarde.

Oui. Je le restaurerais sur un nouveau serveur, de sorte que si quelque chose se passe mal, vous ayez toujours un serveur opérationnel.

Depuis ce fil de discussion, il semble que ce paramètre télécharge les fichiers individuels de S3, mais je me demande s’il pourrait y avoir des problèmes avec les publications faisant référence à des URL S3 plutôt qu’à des fichiers locaux. Je ne suis pas sûr de la manière dont cela est géré dans la base de données. Je serais intéressé de savoir si votre migration vers un autre fournisseur a été couronnée de succès, @Rhod.

1 « J'aime »

J’ai effectué la transition en douceur. J’insiste sur le fait que je n’ai eu aucun problème majeur car le nombre d’images ou de sauvegardes était minime. Le forum était entièrement à des fins de test, pas encore en “production”. Enfin, après plusieurs essais et erreurs, j’ai réinstallé le forum sur un nouveau serveur (Hetzner) et configuré S3 (Cloudflare R2) pour les sauvegardes et les images avec le serveur qui m’a finalement convaincu.

Je suis désolé de ne pas pouvoir être d’une grande aide. Je verrai si je peux le tester sur un autre serveur à l’avenir.

Avec CF R2, vos miniatures de chat fonctionnent-elles correctement ?

1 « J'aime »

Je n’avais pas remarqué cette erreur ; la vérité est que j’ai le chat désactivé sur mon site.

Je ne pense pas que je vais l’utiliser, mais j’ai toujours la même erreur que vous avez mentionnée dans votre publication.

Cependant, je garderai un œil sur votre publication pour voir s’ils vous aident à trouver une solution.

1 « J'aime »

Merci Walter ! Je suis venu ici pour poster la même chose, seulement pour voir que vous l’aviez déjà fait.

@Discourse Y a-t-il une chance d’intégrer le contenu du message de Walter dans le message initial ?

Puis-je télécharger des vidéos sur S3 ? Actuellement, lorsque je télécharge des vidéos, seule la miniature de la vidéo est téléchargée sur S3, mais la vidéo elle-même ne l’est pas.