Configurar un proveedor de almacenamiento de objetos compatible con S3 para cargas

¿Está funcionando ahora?

1 me gusta

Perfecto. Me llevó mucho tiempo, pero además de que está funcionando, ¡también aprendí mucho sobre la configuración de Discourse!

¡Gracias!

2 Me gusta

OK. Decidí publicar la guía paso a paso que creé cuando estaba realizando esta configuración.

Cómo configurar la copia de seguridad S3 y la CDN S3 del foro de Discourse (Itechguides.com)

Los pasos de esta guía son para usar DigitalOcean Space y StackPack CDN.

3 Me gusta

@pfaffman Me preguntaba si podrías ayudarme con este problema adicional de copia de seguridad:

Después de completar la configuración de copia de seguridad y clonación de S3, mi copia de seguridad automática no se está ejecutando. La captura de pantalla a continuación muestra mi configuración.

Puedo ejecutar copias de seguridad manualmente. El problema son las copias de seguridad automáticas programadas: no se ejecutan.

1 me gusta

No lo sé. Puedes ver los trabajos de Sidekiq y asegurarte de que se estén ejecutando. Debería funcionar.

1 me gusta

4 publicaciones se dividieron en un nuevo tema: Consejos sobre Google Cloud S3

Hola,

Gracias por corregir mi publicación. Pero no puedo editar mi publicación para evitar información engañosa.

Hola,

Estoy un poco atascado y confundido y espero que alguien pueda ayudarme.
Primero tuve una instalación de Bitnami y me di cuenta de cuántos problemas me daría a lo largo del camino, así que reinstalé usando la instalación estándar.
Pude restaurar mi copia de seguridad y todo salió bien, a pesar de que pasé de la versión 2.8 a la beta 2.9.

Volví a probar mi copia de seguridad en mi bucket de Google y todavía funcionó a la perfección.

Tenga en cuenta que toda la configuración de S3 se realizó a través de la interfaz web y no a través de variables de entorno.

Por motivos de GDPR, creé un nuevo bucket de copia de seguridad en Europa (llamémoslo discourse-backup-eu), y ahora que pude cambiar la variable de entorno, establecí DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com, reconstruí la aplicación, cambié el nombre del bucket de copia de seguridad en la interfaz web, volví a ejecutar la copia de seguridad y me complació mucho ver que los archivos de copia de seguridad aparecían en mi nuevo bucket de copia de seguridad en Europa.

Ahora quería que las cargas fueran a otro bucket y evitar llenar el espacio en disco de mi VM.

Así que configuré un nuevo bucket (llamémoslo discourse-uploads), lo hice público, agregué el rol Storage Legacy Bucket Owner a mi cuenta de servicio en ese nuevo bucket.
Luego agregué una regla a mi balanceador de carga existente (llamémoslo https://www.example.com) para usar un bucket de backend con Cloud CDN habilitado como se indica aquí. La regla /discourse-uploads/* apunta al bucket discourse-uploads.

Probé mi CDN con un test.jpg en la raíz del bucket pero no pude acceder a él a través de https://www.example.com/discourse-uploads/test.jpg y tuve que crear una subcarpeta llamada discourse-uploads dentro del bucket, moví el test.jpg dentro y ahora puedo ver mi imagen de prueba a través de https://www.example.com/discourse-uploads/test.jpg.

En la interfaz web, cambié el nombre del bucket ficticio en “s3 upload bucket” (me vi obligado a establecerlo previamente mientras configuraba la copia de seguridad) a discourse-uploads, completé la URL de CDN con https://www.example.com/discourse-uploads y marqué “enable s3 uploads”.

A partir de ahí, si intentara cargar una imagen, recibiría una ventana emergente que decía “Argumento no válido” en la ventana del navegador (proveniente de un error 422 con un contenido JSON que dice básicamente lo mismo).

Intenté volver a procesar todas las publicaciones, pero no tuvo ningún efecto, todavía tenía el error.

Así que pensé que debería intentar usar las variables de entorno en lugar de la interfaz web.

y usé la siguiente configuración:

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_INSTALL_CORS_RULE: false
FORCE_S3_UPLOADS: 1
DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com
DISCOURSE_S3_ACCESS_KEY_ID: MY_KEY_ID
DISCOURSE_S3_SECRET_ACCESS_KEY: MY_ACCESS_KEY
DISCOURSE_S3_CDN_URL: https://www.example.com/discourse-uploads
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads
DISCOURSE_S3_BACKUP_BUCKET: discourse-backup-eu
DISCOURSE_BACKUP_LOCATION: s3

Reconstruí la aplicación.
Luego no puedo abrir discourse porque ninguno de los activos se cargó en el bucket y obtengo un 404
https://www.example.com/discourse-uploads/assets/admin-31467dc73634cbfb81799737c43df0e2939307d893ef32713f1d0770bcb3532c.br.js

Pensé que intentar cargar directamente en una subcarpeta del bucket directamente era un poco exagerado, aunque el OP sugiere que funciona (al menos para el bucket de copia de seguridad)

cambié la variable de entorno a
DISCOURSE_S3_BUCKET: discourse-uploads
(Pensando que más tarde podría jugar con la regla del host en lugar de tener que cargar en una subcarpeta)

y reconstruí para ver si algo se cargaba, pero nada se carga en el bucket y discourse todavía falla al abrir debido a 404.

Entonces, mis preguntas son:

  • ¿Chocan la interfaz web y la variable de entorno?
  • ¿Cuándo se supone que se cargarán los activos en el bucket?
  • ¿Cómo puedo depurar esto? No veo ningún error en los registros.
  • ¿Es posible configurar una subcarpeta de un bucket en la configuración?
  • Una vez que esto funcione, ¿se transferirán las imágenes cargadas previamente al bucket? Si vuelvo a procesar, ¿cómo se verán las URL de las imágenes cargadas previamente?

¡Gracias!

1 me gusta

¿Incluiste esto?

Envié una PR con una plantilla para hacer eso hace un tiempo, pero creo que nunca recibió atención.

Además, cambiar los buckets es difícil. No solo necesitas copiar todos los activos del antiguo al nuevo, sino también actualizar la base de datos para que use el nuevo bucket. Creo que hay un tema sobre eso.

Si usas las variables de entorno (que deberías), esas configuraciones ya no son visibles en la interfaz web.

1 me gusta

Se fusionó una publicación en un tema existente: Consejos sobre Google Cloud S3

Sí. Si mi memoria no me falla, hay una discusión arriba sobre que Google no permite algo (¿acceso a listas, tal vez?), pero había una solución sobre el uso de algún “legado” o algo así. Eso es lo que recuerdo. Tendrás que desplazarte por los más de 100 mensajes anteriores para encontrarlo. Si funciona, sería genial si pudieras actualizar el OP para decir cómo lo hiciste funcionar, de modo que la próxima persona que necesite saberlo pueda encontrarlo más fácilmente.

1 me gusta

¡Gracias de nuevo por tu respuesta!
La advertencia sobre el bucket de Google se refería a su uso para copias de seguridad porque no podía enumerar los archivos.
Ya publiqué cómo solucionar esto.

¿Sugieres que actualice el OP con esa información? No creo que pueda.

Nuevamente, la copia de seguridad funciona, pero la carga de los activos no, según el OP, esto se suponía que funcionaría incluso sin los derechos de Propietario del bucket heredado de almacenamiento.

Creo que puede haber una regresión aquí, ¿qué opinas @Falco?

1 me gusta

Puede haber una regresión. ¿Está seguro de que agregó la personalización

que solo Google necesita?

2 Me gusta

Oh. Bueno, pensé que alguien lo había hecho. :person_shrugging:

Eso era lo que estaba sugiriendo. Es un wiki, así que estoy bastante seguro de que puedes, aunque no estoy 100% seguro de qué niveles de confianza están involucrados.

1 me gusta

Gracias por tu respuesta, sí, lo incluí:

Ten en cuenta que probé con y sin la subcarpeta
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads
y
DISCOURSE_S3_BUCKET: discourse-uploads

Gracias de nuevo

2 Me gusta

@tuanpembual lo hizo inicialmente, pero se refirió al Propietario del Objeto Heredado de Almacenamiento en lugar del Propietario del Contenedor Heredado de Almacenamiento

Soy solo un “usuario básico”, esa debe ser la razón por la que no puedo editarlo.

3 Me gusta

Intentaré resumir las respuestas a mis preguntas:

  • ¿Chocan la interfaz de usuario web y la variable de entorno?
  • ¿Cuándo se supone que los activos se subirán al bucket?
    Al agregar este fragmento a app.yml en la sección hook, se cargará después de after_assets_precompile (durante la reconstrucción de la aplicación).
  • ¿Cómo puedo depurar esto? No veo ningún error en los registros.
    Ejecutando:
cd /var/discourse
sudo ./launcher enter app
sudo -E -u discourse bundle exec rake s3:upload_assets --trace
  • ¿Es posible configurar una subcarpeta de un bucket en la configuración?

quote="Puedes usar prefijos para organizar los datos que almacenas en los buckets de Amazon S3. Un prefijo es una cadena de caracteres al principio del nombre de la clave del objeto. Un prefijo puede tener cualquier longitud, sujeta a la longitud máxima del nombre de la clave del objeto (1024 bytes). Puedes pensar en los prefijos como una forma de organizar tus datos de manera similar a los directorios. Sin embargo, los prefijos no son directorios.

  • Una vez que esto funcione, ¿se transferirán las imágenes cargadas previamente al bucket? Si vuelvo a procesar, ¿cómo se verán las URL de las imágenes cargadas previamente?
3 Me gusta

Hola, he estado buscando proveedores de almacenamiento de objetos y vi en la publicación que para algunos de ellos, necesitarás “omitir CORS y configurarlo manualmente”. No estoy familiarizado con CORS ni con su configuración, así que, ¿debería evitar los que requieren esta configuración o es fácil de configurar?

1 me gusta

Si necesitas preguntar (como yo lo haría), entonces elegiría otro.

1 me gusta

Solo confirma, una vez que haya hecho los pasos

rake uploads:migrate_to_s3
rake posts:rebake

puedo eliminar la carpeta de subidas local en su totalidad, ¿verdad?

1 me gusta