尝试使用自定义 S3 存储时出错

由于 Azure Blob Storage 插件频繁出错,我感到十分沮丧,因此我搭建了一台 Flexify.IO 服务器,用于将 Azure 协议转换为 S3 协议。

然而,在将其配置到 Discourse 后,它无法正常工作。报错信息如下:

Failed to open TCP connection to support.xxx.xxx.xxx.xxx:443 (getaddrinfo: Name or service not known)

其中 xx.xx.xx.xx 是 S3 网关的 IP 地址,而 support 是存储桶名称……

奇怪的是……我用 S3 Browser 测试过该端点,一切正常。

所以,有没有好心人能告诉我,我哪里做错了?

我怀疑问题可能出在区域上,因为该端点暴露的区域是 eastasia(一个有效的 Azure 区域),但在列表中我只能选择标准的 AWS 区域。不过,这仍然很奇怪,因为错误信息似乎表明无法连接到端点本身,而不是区域不匹配的问题。

我总觉得我的 s3_bucket 设置有问题,因为它把存储桶名称直接附加到了端点 URL 上。

我是否应该改用 bucket/folder 格式?这两个字段分别应该填什么?

编辑:从源代码来看,这似乎是硬编码的。如果我的存储提供商不使用存储桶名称作为前缀怎么办?

对于您的使用场景,建议您参考 使用对象存储进行上传(S3 及克隆) 的文档。这种方式更加灵活。一旦配置成功,您也欢迎将其添加到 Wiki 中!

2 个赞

鉴于此:

那么以下内容绝对是错误的:

错误信息已经说明了这一点。getaddrinfo: Name or service not known 表示 DNS 查找失败;根本不可能存在像 “support.303.303.303.303” 这样的主机名。

你从哪里得到的 “support” 部分?

flexify 文档 指出:

将应用程序使用的 S3 端点更改为 s3.flexify.io(或设置中显示的其他主机名)。

因此,你无法通过管理控制台来更改它,而是应该阅读 @falco 提到的主题 :arrow_double_up:,并从以下内容开始:

  DISCOURSE_S3_ENDPOINT: https://s3.flexify.io
2 个赞

哦,抱歉。support 是存储桶名称。我可以看到 S3 只是将存储桶名称添加到域名前面,而 Discourse 正是基于这一假设工作的。

是的,我已经想到这一点了。所以我必须在 app.yaml 中硬编码端点,对吗?

@Falco @schleifer 好的,我试过了,但不幸的是,它仍然报出完全相同的错误。

因此,我认为即使将其硬编码到 app.yaml 中也无法正常工作。它们似乎进入了同一个代码流。

这是我的 app.yaml 设置:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: eastasia
  DISCOURSE_S3_ENDPOINT: https://??.??.??.??
  DISCOURSE_S3_ACCESS_KEY_ID: ???
  DISCOURSE_S3_SECRET_ACCESS_KEY: ???
  DISCOURSE_S3_BUCKET: support

它仍然试图访问 support.??.??.??.??:443

所以,我猜想 Discourse 中的存储桶 必须 构成一个子域名?

编辑 1

好的,我已经废弃了 app.yaml 设置,并创建了一个带有 support 的子域名,指向 xx.xx.xx.xx。现在,当我上传时,它会长时间旋转,然后返回一个通用错误:

Aws::S3::Errors::BadRequest

有没有办法获取确切的错误消息?

你试过查看 /logs 页面吗?

是的,但那里什么都没有……

您为 endpoint 环境变量使用的确切值是什么?

好的,我在 Flexify.IO 中找到了一个设置子域名模式的选项。现在它已经可以正常工作了。:champagne:

我会更新 Wiki!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.