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

Значит, теперь всё работает?

1 лайк

Отлично. Это заняло у меня так много времени, но, помимо того, что всё работает, я также узнал очень много о настройке Discourse!

Спасибо!

2 лайка

Хорошо. Я решил опубликовать пошаговое руководство, которое я составил при выполнении этой настройки.

Как настроить резервное копирование форума Discourse в S3 и CDN S3 (Itechguides.com)

Инструкция в этом руководстве предназначена для использования DigitalOcean Space и CDN StackPack.

3 лайка

@pfaffman Я хотел бы узнать, не могли бы вы помочь мне с этой дополнительной проблемой резервного копирования:

После завершения настройки резервного копирования в S3 и клонирования автоматическое резервное копирование не запускается. На скриншоте ниже показана моя конфигурация.

Я могу запускать резервное копирование вручную. Проблема заключается в запланированном автоматическом резервном копировании — оно не выполняется.

1 лайк

Не знаю. Вы можете проверить задания Sidekiq и убедиться, что они выполняются. Это должно сработать.

1 лайк

4 сообщения были перенесены в новую тему: Советы по Google Cloud S3

Привет,

Спасибо за исправление моего поста. Но я не могу отредактировать свой пост, чтобы избежать введения в заблуждение.

Привет,

Я немного застрял и растерян, надеюсь, кто-нибудь сможет помочь.
Сначала у меня была установка Bitnami, но я понял, сколько проблем это создаст в будущем, поэтому переустановил с помощью стандартной установки.
Мне удалось восстановить мою резервную копию, и всё работало отлично, даже несмотря на переход с версии 2.8 на бета-версию 2.9.

Я снова протестировал резервную копию в своём Google Bucket, и она работала как по маслу.

Обратите внимание: вся конфигурация S3 была выполнена через веб-интерфейс, а не через переменные окружения.

По причинам, связанным с GDPR, я создал новый бакет для резервных копий в Европе (назовём его discourse-backup-eu). Теперь, когда я смог изменить переменную окружения, установил DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com, пересобрал приложение, изменил имя бакета для резервных копий в веб-интерфейсе, снова запустил резервное копирование и с большим удовлетворением увидел, что файлы резервных копий появились в моём новом бакете в Европе.

Теперь я хотел, чтобы загрузки файлов перешли в другой бакет, чтобы не заполнять диск моей виртуальной машины.

Поэтому я создал новый бакет (назовём его discourse-uploads), сделал его публичным и добавил роль Storage Legacy Bucket Owner для моего сервисного аккаунта в этом новом бакете.
Затем добавил правило в мой существующий балансировщик нагрузки (назовём его https://www.example.com), чтобы использовать бэкенд-бакет с включённым Cloud CDN, как указано здесь. Правило: /discourse-uploads/* указывает на бакет discourse-uploads.

Я протестировал свой CDN с файлом test.jpg в корне бакета, но не смог получить к нему доступ по адресу https://www.example.com/discourse-uploads/test.jpg. Пришлось создать подпапку с именем discourse-uploads внутри бакета, переместить туда test.jpg, и теперь я вижу свою тестовую картинку по адресу https://www.example.com/discourse-uploads/test.jpg.

В веб-интерфейсе я изменил имя тестового бакета в разделе “s3 upload bucket” (ранее я был вынужден указать его при настройке резервного копирования) на discourse-uploads, заполнил URL CDN значением https://www.example.com/discourse-uploads и включил опцию “enable s3 uploads”.

С этого момента, если я пытался загрузить изображение, в окне браузера появлялось всплывающее сообщение “Invalid Argument” (ошибка 422 с JSON-содержимым, которое в целом говорило то же самое).

Я попробовал пересобрать все сообщения, но это не помогло — ошибка осталась.

Тогда я решил попробовать использовать переменные окружения вместо веб-интерфейса.

И использовал следующую конфигурацию:

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_INSTALL_CORS_RULE: false
FORCE_S3_UPLOADS: 1
DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com
DISCOURSE_S3_ACCESS_KEY_ID: MY_KEY_ID
DISCOURSE_S3_SECRET_ACCESS_KEY: MY_ACCESS_KEY
DISCOURSE_S3_CDN_URL: https://www.example.com/discourse-uploads
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads
DISCOURSE_S3_BACKUP_BUCKET: discourse-backup-eu
DISCOURSE_BACKUP_LOCATION: s3

Я пересобрал приложение.
Затем я больше не мог открыть Discourse, потому что ни один из ресурсов не был загружен в бакет, и получал ошибку 404:
https://www.example.com/discourse-uploads/assets/admin-31467dc73634cbfb81799737c43df0e2939307d893ef32713f1d0770bcb3532c.br.js

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

Изменил переменную окружения на:
DISCOURSE_S3_BUCKET: discourse-uploads
(Думая, что позже я смогу поиграть с правилом хоста, чтобы избежать загрузки в подпапку)

И пересобрал приложение, чтобы проверить, загружается ли что-нибудь, но ничего не попало в бакет, и Discourse по-прежнему не открывается из-за ошибок 404.

Так что мои вопросы следующие:

  • Конфликтуют ли веб-интерфейс и переменные окружения?
  • Когда должны загружаться ресурсы в бакет?
  • Как я могу отладить эту проблему? Я не вижу никаких ошибок в логах.
  • Возможно ли указать подпапку бакета в конфигурации?
  • Когда это заработает, будут ли перенесены ранее загруженные изображения в бакет? Если я пересоберу сообщения, как будут выглядеть URL ранее загруженных изображений?

Спасибо!

1 лайк

Вы включили этот фрагмент?

Некоторое время назад я отправил PR с шаблоном для этого, но, кажется, он так и не привлек внимания.

Кроме того, смена бакетов — задача непростая. Нужно не только скопировать все файлы со старого бакета на новый, но и обновить базу данных, чтобы она использовала новый бакет. На эту тему есть отдельная тема, если не ошибаюсь.

Если вы используете переменные окружения (а так и следует делать), эти настройки больше не будут видны в веб-интерфейсе.

1 лайк

Пост был объединен с существующей темой: Советы по Google Cloud S3

Да. Если память мне не изменяет, выше есть обсуждение о том, что Google не разрешает что-то (возможно, доступ к спискам?), но существовал обходной путь с использованием какого-то «устаревшего» компонента. Вот что я помню. Вам придётся пролистать выше 100 сообщений, чтобы найти это. Если это сработает, было бы здорово, если бы вы обновили исходный пост (OP), объяснив, как вам удалось заставить это работать, чтобы следующий человек, которому это нужно, мог найти информацию гораздо легче.

1 лайк

Спасибо ещё раз за ваш ответ!
Предупреждение о Google Bucket касалось использования для резервного копирования, так как не удавалось перечислить файлы.
Я уже опубликовал информацию о том, как это исправить

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

Опять же, резервное копирование работает, но загрузка активов — нет. Согласно оригинальному посту, это должно было работать даже без прав Владелец устаревшего ведра хранилища.

Кажется, здесь имеет место регрессия. Что вы думаете, @Falco?

1 лайк

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

которая нужна только Google?

2 лайка

О. Ну, я думал, что кто-то уже это сделал. :person_shrugging:

Именно это я и предлагал. Это вики, поэтому я почти уверен, что вы можете, хотя не на 100% уверен, какие уровни доверия для этого требуются.

1 лайк

Спасибо за ваш ответ, да, я включил это:

Обратите внимание, что я пробовал как с подпапкой, так и без неё:
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads
и
DISCOURSE_S3_BUCKET: discourse-uploads

Спасибо ещё раз.

2 лайка

@tuanpembual изначально да, но сослался на «Владелец устаревшего объекта хранилища» вместо «Владелец устаревшего бакета хранилища».

Я всего лишь «базовый пользователь», поэтому, вероятно, не могу её редактировать.

3 лайка

Я постараюсь обобщить ответы на свои вопросы:

  • Вступают ли Web UI и переменные окружения (ENV) в конфликт?
  • Когда файлы должны быть загружены в бакет?
    Добавив этот фрагмент в app.yml в секцию hooks, загрузка произойдет после этапа after_assets_precompile (во время пересборки приложения).
  • Как я могу это отладить? Я не вижу никаких ошибок в логах.
    Запустив следующую команду:
cd /var/discourse
sudo ./launcher enter app
sudo -E -u discourse bundle exec rake s3:upload_assets --trace
  • Можно ли указать подпапку бакета в конфигурации?

Вы можете использовать префиксы для организации данных, которые вы храните в бакетах Amazon S3. Префикс — это строка символов в начале имени ключа объекта. Префикс может быть любой длины, в пределах максимального размера имени ключа объекта (1024 байта). Префиксы можно рассматривать как способ организации данных, аналогичный директориям. Однако префиксы не являются директориями.

  • После того как это заработает, будут ли ранее загруженные изображения перенесены в бакет? Если я выполню пересборку (rebake), как будут выглядеть URL ранее загруженных изображений?
3 лайка

Привет! Я искал провайдеров объектного хранилища и увидел в оригинальном посте, что для некоторых из них нужно «отключить CORS и настроить его вручную». Я не знаком с CORS и не знаю, как его настраивать. Мне стоит избегать провайдеров, требующих этой настройки, или её несложно выполнить?

1 лайк

Если вам нужно спросить (как и мне), то я бы выбрал другой вариант.

1 лайк

Просто уточню: после выполнения

rake uploads:migrate_to_s3
rake posts:rebake

шагов я могу полностью удалить локальную папку с загрузками, верно?

1 лайк