Настройка провайдера объектного хранилища, совместимого с S3, для загрузки файлов

Кто-нибудь использовал SeaweedFS? В связи с неопределённостью вокруг MinIO я рассматриваю этот вариант и планирую протестировать его, чтобы проверить, нет ли проблем совместимости с Discourse.

Я смог правильно настроить R2, используя этот набор правил:

  ## Этот набор строк позволяет загружать и скачивать файлы, размещенные в R2 S3..
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: access-key-id
  DISCOURSE_S3_SECRET_ACCESS_KEY: access-key
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_BACKUP_LOCATION: s3
#  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_ENDPOINT: https://71*****5d4976.r2.cloudflarestorage.com
#  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_S3_INSTALL_CORS_RULE: false

Как только я закомментировал строку с CDN_URL, всё заработало. Думаю, из-за того, что R2 автоматически создаёт CDN, эта строка не нужна, и её добавление, наоборот, ломает работу.
Я закомментировал строку с включением изображений, чтобы уменьшить размер резервных копий. Я использую бесплатный тариф R2 и не хочу превышать свой лимит.

Верно. Вам действительно не следует использовать DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS, если только вы не планируете отказываться от S3. Нет смысла скачивать все изображения из S3, чтобы включить их в резервную копию, которая хранится… в S3. Я однажды оставил эту опцию включённой для бакета AWS и получил огромный счёт за загрузку каждого изображения каждый день.

Это должен быть отдельный CDN, указывающий на ваш сервер Discourse, а не на бакет S3. Некоторые данные, например аватары (и, возможно, что-то ещё), обслуживаются с вашего сервера. Причина, по которой это не сработало, в том, что вы указали CDN для S3, а не CDN для сайта.

Вы имеете в виду, если использовать две разные компании? Одну для бакета, а другую для CDN? Я не очень разбираюсь в этом, поэтому мне нужно объяснение так, будто я в третьем классе…
Я знаю, что при создании «пользовательского домена» в интерфейсе R2 он действует как CDN, поэтому я изначально добавил эту строку.

В любом случае, у меня на тестовом сайте всё работает идеально, и если нет ничего ещё, что должно работать, но не работает, я бы рекомендовал обновить исходный пост, указав, что Cloudflare теперь работает с Discourse.

Нет, так нельзя. Существует только один ключ и секрет S3. Я пытался придумать повод для использования include s3 uploads, но такого повода нет.

Это относится к S3 Bucket, а не к вашему сайту. Существуют две разные переменные: DISCOURSE_S3_CDN_URL и DISCOURSE_CDN_URL. Вы обращаетесь с ними так, будто они одинаковы. Вы не можете использовать CDN для сайта, но причина, по которой это не сработало, когда вы установили эту переменную, заключается в том, что вы указали неверный CDN.

Хорошо, я думал, что немного разбираюсь в том, что делаю, но теперь чувствую себя совершенно потерянным.

Так в чём же разница между S3 CDN и CDN?

Продолжит ли это работать, если я поменяю местами эти два элемента, которые сейчас закомментированы?

Я также заметил странную проблему с фоновым изображением моего баннера приветствия. Есть ли какая-то связь с этим?

14 сообщений были перенесены в новую тему: Проблемы с AWS CDN и S3

Всем привет — просто хотел сообщить, что объектное хранилище Hetzner работает довольно хорошо. Вот настройки, которые я добавил в свой app.yaml:

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_INSTALL_CORS_RULE: false
DISCOURSE_S3_ENDPOINT: https://nbg1.your-objectstorage.com
DISCOURSE_S3_ACCESS_KEY_ID: xxxx
DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
DISCOURSE_S3_CDN_URL: xxxx
DISCOURSE_S3_BUCKET: discourseuploads
DISCOURSE_S3_BACKUP_BUCKET: discoursebackups
DISCOURSE_BACKUP_LOCATION: s3

Очевидно, замените следующие параметры на свои собственные:

DISCOURSE_S3_ENDPOINT: (используйте URL из панели управления Hetzner для региона, в котором вы создали бакет объектного хранилища)
DISCOURSE_S3_ACCESS_KEY_ID: (говорит само за себя)
DISCOURSE_S3_SECRET_ACCESS_KEY: (говорит само за себя)
DISCOURSE_S3_CDN_URL: (используйте URL CDN, который подтягивает данные из URL вашего бакета Hetzner)

Буду следить за работой в течение следующих нескольких недель/месяцев на моём тестовом сервере, но пока всё отлично.

4 лайка

Просто хочу отметить, что это уже не так — Cloudflare исправила эту проблему, и теперь бакеты R2 совместимы с S3. У меня есть внешние резервные копии в Cloudflare R2, и я только что успешно выполнил полное восстановление на другой сервер. (К тому же это бесплатно до 10 ГБ в месяц).

Вам понадобятся имя бакета (для s3 backup bucket), access key ID, secret access key и конечная точка, специфичная для юрисдикции из объектного хранилища Cloudflare R2, чтобы ввести их в настройках S3 для Discourse или в файлах app.yml/web_only.yml и т. д.

1 лайк

Это отличные новости! Кто-нибудь должен отредактировать исходный пост соответствующим образом.

я не знаю, как работает обновление документации (новенькой или нет) — вроде бы она где-то здесь хранится? discourse/docs at main · discourse/discourse · GitHub, но я не вижу документации по самостоятельному размещению. :woman_shrugging: всё равно, я вижу ссылку на предлагаемые правки на странице редактирования вики. я предложу обновление.

редактирование: обновление для объектного хранилища Cloudflare R2 отправлено