Ошибки при попытке использовать пользовательское хранилище 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 — это IP-адрес шлюза S3, а support — имя бакета…

Странно то, что я протестировал конечную точку с помощью S3 Browser, и всё работает.

Так что, может быть, кто-нибудь подскажет, что я сделал не так?

Я могу предположить, что проблема, возможно, в регионе, так как регион, предоставляемый конечной точкой, — eastasia (допустимый регион Azure), но в списке я могу выбрать только стандартные регионы AWS. Тем не менее, это всё равно странно, поскольку ошибка указывает на сбой подключения к самой конечной точке, а не на несоответствие региона.

У меня есть ощущение, что я неправильно настроил параметр s3_bucket, поскольку он добавляет имя бакета к самому URL-адресу конечной точки.

Стоит ли мне использовать формат bucket/folder? Что именно нужно указывать в каждом из случаев?

РЕДАКТИРОВАНИЕ: Судя по исходному коду, это прописано жестко. А что делать, если мой провайдер хранилища не использует имя бакета в качестве префикса?

Вам стоит попробовать следовать документации по использованию объектного хранилища для загрузки файлов (S3 и клоны) для вашего случая. Это гораздо более гибкий подход. Когда вы настроите его работу, вы можете добавить информацию в вики!

Учитывая это:

Тогда это точно неверно:

Сообщение об ошибке говорит об этом. 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

О, извините. 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:

Обновлю вики!