Usando almacenamiento de objetos compatible con S3 de Scaleway

Hola,

Estoy intentando configurar Discourse para usar el almacenamiento de objetos compatible con S3 de Scaleway, pero no logro que funcione y no sé dónde está el problema.

He verificado que ambos buckets funcionan con aws-cli y que la configuración de CORS está correctamente establecida siguiendo la documentación oficial de Scaleway, así que creo que el problema no son los buckets en sí.

Estas son mis configuraciones de S3 en Discourse (parte del nombre del bucket censurada):

Cuando abro la pestaña de copias de seguridad, obtengo el mensaje: «Failed to list backups from S3: Aws::S3::Errors::BadRequest».
Y cuando intento subir una imagen, veo esto en el registro: «Job exception: Failed to open TCP connection to [redacted]-discourse-files.s3.fr-par.amazonaws.com:443 (getaddrinfo: Name or service not known)».

Estoy ejecutando la última versión de Discourse: 2.4.0.beta10 (14ae574bc5).

Mi suposición es que son menos compatibles con S3 de lo que creen.

La configuración de región de S3 también parece estar influyendo en esto.

Eso es posible, pero la URL no debería incluir amazonaws.com si ingresé el endpoint, ¿verdad?

Exacto, esto es raro. Quizás sea por el TLD de hipster. Déjame echar un vistazo.

@dino, intenta quitar https:// del endpoint de S3.

La validación no me permite hacer eso: ‘s3_endpoint: El valor no coincide con el formato requerido.’

Sí, fue una mala suposición.

No puedo encontrar una forma de terminar con una URL como la tuya leyendo el código responsable de ello:

¿Esto solo afecta a las copias de seguridad? ¿Funcionan las cargas?

Bueno, eso es diferente del problema que tuve con los buckets de GCP, pero podrías echar un vistazo a Trouble with Google Bucket for backup - #4 by pfaffman.

Pude determinar qué actualización del gem aws-sdk-s3 provocó que los buckets de GCP dejaran de funcionar, aunque la solución que eligió mi cliente fue cambiar a un bucket de AWS.

@Falco sí, yo también estoy atascado.
El error con la URL que contiene amazonaws es específicamente para la carga de archivos, no para las copias de seguridad. Para las copias de seguridad solo obtengo el error genérico, así que supongo que ambas están rotas debido al problema de la URL.

¿Se te ocurre algo más?

@pfaffman gracias por el consejo; veré si cambiar la versión de la gem ayuda.

¡Hola @dino! ¿Al final sirvió de ayuda? Yo tengo el mismo problema aquí y estoy a punto de rendirme y cambiarme a Amazon S3.

Hola @FroggyC,
En realidad me quedé sin tiempo para depurar esto, así que al final no experimenté con cambiar las versiones de las gemas. Cambié a usar Amazon S3 siguiendo la documentación oficial y todo funcionó de inmediato.
Lo siento, no son mejores noticias…

Gracias. Supongo que tendremos que hacer lo mismo. ¡Gracias!

El mismo problema aquí. ¿Hay algo que podamos hacer para ayudar a depurar esto?

Por ejemplo, ¿acceder al bucket mediante la CLI y enviar archivos de registro?

¿Se ignora s3_region, verdad? Porque Scaleway utiliza valores diferentes que AWS.

Podrías intentar preguntar a Scaleway: la responsabilidad de la compatibilidad recae sobre ellos. Si no son totalmente compatibles con AWS S3, deberían solucionarlo.

Estás insinuando que es culpa de ellos, pero hasta ahora has ignorado el comentario de @dino:

Mientras la URL de s3_endpoint (sin modificaciones) no se utilice tal cual, será difícil convencer a Scaleway de que el error está de su lado. Especialmente porque otros clientes S3 pueden conectarse sin problemas.

De acuerdo, demuéstralo. Muéstrame la documentación y los registros de trazas que demuestren que este es el caso. Si puedes proporcionar evidencia real del problema de nuestro lado, lo revisaré.

Claro, eso es lo que quise decir con

Entonces, ¿cómo puedo indicarle a Discourse que registre sus intentos de conexión con S3? Una vez que tengamos la certeza de la URL a la que desea conectarse, podré interceptar el tráfico y compartir los resultados.

El motivo por el que la carga/respaldo de S3 no funciona es que la región debe configurarse en fr-par (o nl-ams), lo cual solo puede hacerse evitando la validación de SiteSetting de Discourse:

(vía ./launcher enter app y luego rails c)

SiteSetting.find_by(name: 's3_region').update_attribute(:value, 'fr-par')

Después de este cambio, las cargas y respaldos funcionan correctamente con el almacenamiento de objetos de Scaleway.

Documentación de Scaleway sobre Almacenamiento de Objetos

Por supuesto, esto es una solución temporal; si restableces o modificas esta configuración del sitio a través del Administrador Web, no podrás volver a un estado funcional (a menos que uses nuevamente la consola de Rails).

Supongo que el cliente de AWS/S3 permite establecer explícitamente una cadena de región (a diferencia del estado actual del administrador web).

También es algo engañoso en el caso del valor desplegable “EU (París)” en Discourse, ya que este se refiere al esquema de nombres de AWS eu-west-3 (o algo similar) y no al valor esperado para Scaleway.

Ajá. ¿Necesitamos un campo especial de configuración del sitio “región compatible con S3” @falco? Eso permitiría a los usuarios ingresar regiones completamente arbitrarias (y por tanto, ‘inventadas’ desde la perspectiva de Amazon).

No es necesario.

Las personas que usan clones de S3 deben establecer la variable de entorno S3 Endpoint, lo que sobrescribe la región de S3.

Tengo una guía completa explicando esto con el clon de S3 de Digital Ocean, pero estoy esperando a que Digital Ocean corrija un error en su CDN de S3 antes de publicarla.

Si Scaleway está en mejor estado que Digital Ocean, creo que lo probaré y trataré de basar mi guía en él.

Correcto, pero ¿cómo saben que deben hacer eso? ¿La descripción del ajuste de sitio existente menciona esto? Creo que debería. ¿Puedes hacerlo?