Configurar cargas de archivos e imágenes a S3

¿Sigue siendo válida la primera publicación en la siguiente guía para que los administradores la utilicen: https://meta.discourse.org/t/set-up-file-and-image-uploads-to-s3? Si no, ¿hay algún otro lugar donde se encuentre la guía correcta para S3 en 2024? Se dice que esta es oficial y compatible con el equipo de Discourse.

Lo implementamos como en la guía anterior y las imágenes están rotas en la instancia de Discourse, aunque se están subiendo a S3.

Nuestro flujo

  1. Configurar el bucket de S3 en sí y la política en S3 como en la guía anterior (todos los pasos se siguen con precisión)

  2. Configurar el entorno en app.yml y en el administrador (idéntico) como en la guía anterior

  3. reconstruir la aplicación con launcher

  4. NO se utiliza ninguna CDN, ya que entendemos que es opcional y debería funcionar sin CDN.

Resultado:

  1. Las imágenes se están subiendo al bucket a través de Discourse
  2. Discourse reemplaza correctamente los enlaces en las publicaciones por enlaces de Amazon como
    xxx-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/a1b21eb5de071799d4b5e5215619d11d28602dfe.jpeg
  3. los enlaces no son accesibles (se asume debido a la política de S3 en la guía oficial)

Cambio asumido para la política oficial de S3 en la guía. Principal: Esta política no especifica un Principal, lo que significa que se aplica a quien haya sido autenticado con los permisos correctos. Si se desea permitir el acceso anónimo (público), necesitamos especificar \"Principal\": \"*\". Eso tampoco podría ser una buena solución, ya que hace que el bucket sea público.
esto es una suposición, ya que agradeceríamos si alguien actualizara la guía para que sea correcta 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 me gusta

Mi suposición es que cambiaste algo en tu configuración de s3 y las imágenes que faltan están en un bucket o ruta diferente a las nuevas.

Puedes mirar

Upload.pluck(:url)

Para ver qué está mal, tal vez

1 me gusta

Recientemente tuve este mismo problema y pude resolverlo. Lo hice actualizando los permisos de IAM con este rol

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

También tuve que habilitar la propiedad de objetos ACL

Aquí están mis configuraciones completas cuando busco s3

4 Me gusta

Configura CORS en el bucket junto con la configuración anterior para cargas multiparte.

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

¿Es posible cambiar de proveedores de servicios S3?

Me gustaría saber si habrá algún problema si intento cambiar de proveedores de servicios S3, ignorando el problema de las imágenes ya subidas. Realmente no tengo mayores problemas con esto ya que el sitio aún no está en funcionamiento; todavía lo estoy desarrollando.

¿Es posible guardar las imágenes localmente y luego activar S3 de nuevo con el nuevo proveedor de servicios?

Puedes configurar siteSettings.include_s3_uploads_in_backups=true en rails y luego hacer una copia de seguridad, cambiar la configuración de S3 y restaurar la copia de seguridad.

1 me gusta

Entendido. ¡Muchas gracias!

1 me gusta

El hilo enlazado menciona una PR para eliminar una tarea migrate_from_s3, y no he visto ninguna razón para creer que se haya agregado nuevamente más tarde, pero quería verificar si este seguía siendo el caso. Estoy considerando migrar a MinIO y me preocupa un poco convertirlo en una dependencia.

Me pregunto si esto podría proporcionar una solución alternativa para lo que mencioné anteriormente. Incluir esa configuración, hacer una copia de seguridad, deshabilitar la configuración de S3 y restaurar la copia de seguridad.

Sí. Lo restauraría a un servidor nuevo para que si algo sale mal, aún tengas un servidor funcional.

Desde este hilo, parece que esta configuración descarga los archivos individuales de S3, pero me pregunto si podría haber problemas con las publicaciones que hacen referencia a URL de S3 en lugar de archivos locales. No estoy seguro de cómo se maneja eso en la base de datos. Me interesaría saber si tu migración a otro proveedor fue exitosa, @Rhod.

1 me gusta

Hice la transición sin problemas. Enfatizo que no tuve ningún problema importante porque el número de imágenes o copias de seguridad era mínimo. El foro era completamente para fines de prueba, aún no estaba en “producción”. Finalmente, después de varios intentos y errores, reinstalé el foro en un nuevo servidor (Hetzner) y configuré S3 (Cloudflare R2) para copias de seguridad e imágenes con el servidor que finalmente me convenció.

Lamento no poder ser de gran ayuda. Veré si puedo probarlo en otro servidor en el futuro.

Con CF R2, ¿funcionan bien las miniaturas de tu chat?

1 me gusta

No había notado ese error; la verdad es que tengo el chat desactivado en mi sitio.

No creo que lo vaya a usar, pero sigo teniendo el mismo error que mencionaste en tu publicación.

Sin embargo, estaré atento a tu publicación para ver si te ayudan a encontrar una solución.

1 me gusta

¡Gracias Walter! Vine aquí para publicar lo mismo solo para ver que ya lo habías hecho.

@Discourse ¿hay alguna posibilidad de integrar el contenido de la publicación de Walter en la publicación inicial?

¿Puedo subir videos a S3? Actualmente, solo la imagen de portada del video se sube a S3, pero el video no se puede subir.