Sí, parece que estoy usando un proveedor S3 no compatible (OVH Object Storage)
Con una URL de punto final de https://s3.de.ovh.cloud.net y una s3 cdn_url configurada en https://storage.de.ovh.cloud.net/v1/<algun-id-de-usuario-unico>/<el-nombre-del-bucket>
Cuando se resuelven las URL cortas, Discourse utiliza la URL del punto final para construir la URL resultante (lo que falla ya que no incluye el ID de usuario de OVH correcto, la parte de la s3 cdn_url).
Sin embargo, forzar que las URL cortas tengan dl=1 construiría una presigned_url funcional que estaría bien para mí.
Configuré estas variables de entorno (específicas de S3) dentro del YAML del contenedor:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: DE
DISCOURSE_S3_ENDPOINT: https://s3.de.cloud.ovh.net
DISCOURSE_S3_ACCESS_KEY_ID: ...
DISCOURSE_S3_SECRET_ACCESS_KEY: ...
DISCOURSE_S3_CDN_URL: https://storage.de.ovh.cloud.net/v1/<algun-id-de-usuario-unico>/<el-nombre-del-bucket>
DISCOURSE_S3_UPLOAD_BUCKET: <el-nombre-del-bucket>
DISCOURSE_S3_INSTALL_CORS_RULE: false