Использование сервера MinIO для объектного хранилища, совместимого с S3
MinIO — это решение для объектного хранилища, совместимое с S3, которое по умолчанию является облачно-ориентированным, но при этом легко разворачивается на локальных серверах, VPS или в облачных средах. Оно может служить альтернативой Amazon AWS S3 и другим системам и полностью совместимо с Discourse при правильной настройке.
В данном разделе предполагается, что в вашей среде выполнены следующие условия:
У вас есть полностью настроенный экземпляр сервера MinIO.
В конфигурации MinIO включена поддержка доменов.
Настройка DNS для MinIO выполнена корректно, чтобы поддомены бакетов правильно резолвились на сервер MinIO.
На сервере MinIO существует бакет discourse-data с политикой доступа «public».
На сервере MinIO существует бакет discourse-backups, предназначенный для загрузки файлов и имеющий приватный доступ (не публичный; это политика по умолчанию для новых бакетов).
Ваш URL S3 CDN правильно настроен и указывает на бакет, кэшируя запросы, как упоминалось ранее в этом документе.
Если все вышеуказанные требования выполнены, вы готовы к работе.
Пример конфигурации может выглядеть следующим образом:
Это уже какое-то время работает как с бакетами в поддомене, так и с бакетами в пути. Однако компонент настройки DNS является самым болезненным — для его работы требуются специальные правила DNS с подстановочными знаками или кастомный DNS-сервер, который активно знает обо всех существующих бакетах (или не знает). Я реализовал это в bind9 с помощью зон с подстановочными знаками, но при попытке сделать то же самое в Cloudflare или других сервисах части, связанные с поддоменом, вызывают серьёзные сбои.
Если вы считаете, что вышеизложенное подходит для этого раздела, я с радостью добавлю его. Однако это потребует включения раздела «ограничения», и я буду признателен, если вы дадите мне возможность внести правки по формулировкам и т. п. до публикации. (Обратите внимание, что я не указал URL CDN, так как в моём развёртывании нет CDN, потому что деньги — это не то, с чем я могу экспериментировать).
Пользователи, которые запускают MinIO исключительно для Discourse, также могут вручную создать записи DNS для двух бакетов Discourse, верно?
Предупреждение в этой теме должно быть достаточным. Настройка MinIO полностью выходит за рамки данного форума, но при наличии рабочего MinIO интеграция с Discourse является обоснованным сценарием использования.
Верно, но, как вы и сказали, конфигурация выходит за рамки обсуждения, поэтому я просто укажу, что пути поддоменов бакетов должны разрешаться (а настройку DNS оставлю на усмотрение ${ADMINS} экземпляра).
Да, и я соответствующим образом отредактировал вики. Однако, насколько мне известно, MinIO не предоставляет облачные услуги, поэтому я оставил поле «Название службы» в оглавлении вики в начале пустым. При необходимости внесите соответствующие изменения.
Я также внес правки: провайдер теперь Self-hosted, но раздел MinIO всё ещё связан. Это должно решить проблему отсутствия облачного решения, которое я пока смог найти. (Вы можете закрыть эту ветку, если хотите, так как она уже интегрирована в пост вики).
Также обнаружил (спасибо открытому коду и хорошей документации MinIO!), что CORS по умолчанию включен для всех HTTP-методов MinIO — поэтому устанавливать правила CORS не нужно, они уже присутствуют. Также обновил раздел о самостоятельной установке MinIO, а также внес несколько правок в грамматику.
Спасибо @Falco за помощь в поиске проблемы, которую я заметил во время сборки/пересборки приложения, и за базовые рекомендации по настройке CDN со StackPath (поскольку мне нужен был полностью функциональный тест, и у меня уже есть CDN StackPath для других задач, поэтому использование CDN-стека подтвердило, что всё работает!).
Я не понимаю, как включить режим force path style. Когда я настраиваю версию 2.6.8 с MinIO через параметры S3, имя бакета всегда добавляется в начало конечной точки S3, тогда как оно должно добавляться в конец как путь после конечной точки S3.
Также, судя по образцу конфигурации на GitHub, опция s3_force_path_style была удалена. Не упустил ли я что-то? Спасибо.
Discourse использует режим DNS, а не режим пути, для S3. Так было уже ДОВОЛЬНО долго, поэтому я не упоминаю ничего о режиме пути ни в руководстве, ни на странице руководства по хранению в S3. Тебе также стоит научиться создавать новые темы, а не воскрешать старую тему для чего-то нерелевантного.
@teward Спасибо за обратную связь. Извините за оживление мертвых — я привык к стилю написания в GitHub issues Я создам новую тему о том, как мы можем использовать режим пути в S3 для Discourse.
В конфигурации MinIO должна быть включена поддержка доменов для URL-адресов бакетов, управляемых доменом. Это обязательно и не является опциональным: в Discourse нет поддержки путей к бакетам.
Давным-давно, когда я только начал работать с Discourse, у них была такая опция, но затем её убрали, и мне пришлось отказаться от использования MinIO в качестве бэкенда. СЕЙЧАС, поскольку в документации MinIO есть инструкции по настройке работы в режиме DNS (то есть пути вида бакет[.]сервер[.]com, как это работает в S3), всё работает при правильной настройке MinIO. (Спасибо сотрудникам/модераторам/системе за повышение моего уровня доверия, что теперь я могу редактировать саму вики).