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

<div data-theme-toc="true"

:information_source: В этой теме описывается настройка некоторых распространенных поставщиков объектного хранилища, совместимого с S3 (клоны S3). Более подробную информацию о настройке Amazon AWS S3, которая официально поддерживается и используется Discourse для наших хостинг-услуг, см. по адресу Set up file and image uploads to S3.

Поставщик Название сервиса Работает с Discourse?
Amazon AWS S3 Да
Digital Ocean Spaces Да
Linode Object Storage Да
Google Cloud Storage Да
Scaleway Object Storage Да
Vultr Object Storage Да
BackBlaze Cloud Storage Да*
Self-hosted MinIO Да
Azure Blob Storage Flexify.IO Да
Oracle Cloud Object Storage Нет [1]
Wasabi Object Storage Возможно
Cloudflare R2 Да
Contabo Object Storage Нет

Если у вас работает другой сервис, пожалуйста, добавьте его в эту вики.

Конфигурация

Чтобы хранить статические ресурсы Discourse в вашем объектном хранилище, добавьте следующую конфигурацию в файл app.yml в раздел hooks:

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

При использовании объектного хранилища вам также понадобится CDN для обслуживания файлов, хранящихся в бакете. В своих тестах я использовал StackPath CDN, и, за исключением необходимости установить Dynamic Caching By Header: Accept-Encoding в его конфигурации, он работает нормально.

DISCOURSE_CDN_URL — это CDN, указывающий на ваше доменное имя Discourse и кэширующий запросы. Он будет использоваться в основном для извлекаемых ресурсов: CSS и других ресурсов тем.

DISCOURSE_S3_CDN_URL — это CDN, указывающий на ваш бакет объектного хранилища и кэширующий запросы. Он будет использоваться в основном для загружаемых ресурсов: JS, изображений и пользовательских загрузок.

Мы рекомендуем, чтобы они были разными, и советуем администраторам настроить оба.

Отсутствие CDN (или указание URL бакета в качестве URL CDN), скорее всего, вызовет проблемы и не поддерживается.

В приведенных ниже примерах https://falcoland-files-cdn.falco.dev — это CDN, настроенный для обслуживания файлов в бакете. Имя бакета в моих примерах было установлено как falcoland-files.

Настройка этих параметров в переменных окружения в вашем app.yml рекомендуется, так как именно так CDCK делает это в своей инфраструктуре, поэтому это хорошо протестировано. Кроме того, задача загрузки ресурсов выполняется после компиляции ресурсов, что происходит при пересборке. Если вы хотите развернуть Discourse, который будет корректно работать с объектным хранилищем с самого начала, вам нужно установить переменные окружения, чтобы ресурсы загружались до запуска сайта.

Выберите своего поставщика из списка ниже и добавьте эти настройки в раздел env вашего файла app.yml, соответствующим образом изменив значения:

AWS S3

То, что мы официально поддерживаем и используем внутренне. Их предложение CDN Cloudfront также работает для обслуживания файлов бакета. О том, как правильно настроить разрешения, см. Set up file and image uploads to S3.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-west-1
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
  DISCOURSE_BACKUP_LOCATION: s3

Digital Ocean Spaces

Предложение DO хорошее и работает из коробки. Можно включить ограничение перечисления файлов. Единственная проблема заключается в том, что их предложение CDN ужасно сломано, поэтому вам нужно использовать другой CDN для файлов. Кроме того, вам не нужно устанавливать правило CORS, так как оно переустанавливается при каждой пересборке.

Пример конфигурации:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: whatever
  DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_INSTALL_CORS_RULE: false 

Linode Object Storage

Для Linode требуется дополнительный параметр конфигурации HTTP_CONTINUE_TIMEOUT.

Пример конфигурации:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-east-1
  DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT: 0
  DISCOURSE_S3_ENDPOINT: https://us-east-1.linodeobjects.com
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
  DISCOURSE_BACKUP_LOCATION: s3

Google Cloud Platform Storage

Перечисление файлов не работает, поэтому вам нужна дополнительная переменная окружения, чтобы пропустить это, чтобы ресурсы могли работать. Также пропустите CORS и настройте его вручную.

:warning: Поскольку вы не можете перечислять файлы, вы не сможете перечислять резервные копии, и автоматические резервные копии не будут работать, поэтому мы не рекомендуем использовать его для резервного копирования. Однако некоторые утверждают, что если вы измените роль с Storage Legacy Object Owner на Storage Legacy Bucket Owner, резервное копирование будет работать корректно. Обсуждение, специфичное для Google Cloud, см. в этой теме.

Существует сторонний плагин для улучшения интеграции по адресу Discourse GCS Helper.

Пример конфигурации:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-east1
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  FORCE_S3_UPLOADS: 1
  DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  #DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
  #DISCOURSE_BACKUP_LOCATION: s3

Scaleway Object Storage

Предложение Scaleway также очень хорошее, и в большинстве случаев все работает нормально.

:warning: Мultipart-загрузки Scaleway поддерживают только максимум 1000 частей. Это не соответствует Amazon S3, который поддерживает максимум 10 000 частей. Для больших экземпляров это приведет к сбоям резервного копирования Discourse, и незавершенную загрузку может потребоваться удалить вручную перед новыми попытками. Для небольших экземпляров это не проблема. Scaleway довольно открыты для обратной связи, поэтому, если вы хотите изменить это ограничение, вам следует связаться с ними.

Обратите внимание, что для параметра DISCOURSE_S3_ENDPOINT Discourse использует конечную точку всего региона: https://s3.{region}.scw.cloud. «Конечная точка бакета», найденная в вашей панели управления Scaleway, имеет вид https://{bucketName}.s3.{region}.scw.cloud. Оmitите поддомен имени бакета, чтобы избежать ошибок подключения.

Пример конфигурации:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: fr-par
  DISCOURSE_S3_ENDPOINT: https://s3.fr-par.scw.cloud
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
  DISCOURSE_BACKUP_LOCATION: s3

Vultr Object Storage

Для Vultr требуется дополнительный параметр конфигурации HTTP_CONTINUE_TIMEOUT.

Пример конфигурации:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: whatever
  DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT: 0
  DISCOURSE_S3_ENDPOINT: https://ewr1.vultrobjects.com
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
  DISCOURSE_BACKUP_LOCATION: s3

Backblaze B2 Cloud Storage

Вам нужно пропустить CORS и настроить его вручную.

Есть отчеты о том, что «очистка сиротских загрузок» не работает корректно с BackBlaze. Вам необходимо изменить правила жизненного цикла для вашего бакета, чтобы очистка сиротских загрузок работала.

Пример конфигурации:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-west-002"
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  DISCOURSE_S3_ENDPOINT: https://s3.us-west-002.backblazeb2.com
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
  DISCOURSE_S3_BUCKET: falcoland-files
  DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
  DISCOURSE_BACKUP_LOCATION: s3

Примечание: Во время первоначальной миграции в B2 вы можете столкнуться с лимитом в 2500 бесплатных ежедневных транзакций класса C. Вам нужно будет добавить способ оплаты, чтобы снять ограничения.

MinIO Storage Server

Существует несколько условий и требований, которые необходимо выполнить, прежде чем вы сможете использовать сервер хранения MinIO в качестве альтернативы S3:

  1. У вас есть полностью настроенный экземпляр сервера MinIO
  2. В конфигурации MinIO включена поддержка доменов для URL-адресов бакетов, управляемых доменами. Это обязательное требование для настройки MinIO и Discourse, поскольку MinIO по-прежнему поддерживает устаревшие «путевые» стили S3, которые больше не поддерживаются в Discourse.
  3. У вас правильно настроена конфигурация DNS для MinIO, чтобы поддомены бакетов корректно резолвились на сервер MinIO, и сервер MinIO настроен с базовым доменом (в данном случае minio.example.com)
  4. Бакет discourse-data существует на сервере MinIO и имеет установленную «публичную» политику
  5. Ваш URL S3 CDN указывает на правильно настроенный CDN, указывающий на бакет и кэширующий запросы, как указано ранее в этом документе.
  6. Ваши CDN настроены на фактическое использование заголовка «Host» основного URL S3 — например, discourse-data.minio.example.com при получении данных — в противном случае это может вызвать проблемы CORB.

При условии выполнения вышеуказанных условий и предварительных требований пример конфигурации будет выглядеть следующим образом:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: anything
  DISCOURSE_S3_ENDPOINT: https://minio.example.com
  DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
  DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
  DISCOURSE_S3_CDN_URL: https://discourse-data-cdn.example.com
  DISCOURSE_S3_BUCKET: discourse-data
  DISCOURSE_S3_BACKUP_BUCKET: discourse-backups
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_INSTALL_CORS_RULE: false

CORS все равно будет включен в MinIO, даже если правило не установлено перекомпилятором приложения — по умолчанию, кажется, в MinIO CORS включен для всех HTTP-глаголов, и MinIO не поддерживает BucketCORS (S3 API) в результате.

Azure Blob Storage с Flexify.IO

Azure Blob Storage не является сервисом, совместимым с S3, поэтому его нельзя использовать с Discourse. Существует плагин, но он сломан.

Самый простой способ предоставить интерфейс, совместимый с S3, для Azure Blob Storage, — это добавить сервер Flexify.IO, который переводит протокол Azure Storage в S3.

На момент написания этой статьи сервис бесплатен в Azure, и вам нужен только очень базовый (дешевый) уровень ВМ, чтобы начать его запуск. Однако это требует некоторой настройки.

  1. В портале Azure создайте новый ресурс Flexify.IO - Amazon S3 API for Azure Blob Storage.
  2. Для легкой нагрузки минимальная конфигурация ВМ, кажется, работает вполне нормально. Вы можете принять большинство настроек по умолчанию. Не забудьте сохранить файл ключа PEM при создании ВМ.
  3. Перейдите по ссылке на ВМ Flexify.IO и войдите в систему. Следуйте инструкциям по настройке поставщика данных Azure Blob Storage и сгенерированному конечному пункту S3. Убедитесь, что параметр конфигурации конечного пункта Public read access to all objects in virtual buckets имеет значение true. Скопируйте URL конечного пункта S3 и ключи.
  4. Нажмите Новый виртуальный бакет и создайте виртуальный бакет. Он может иметь то же имя, что и контейнер Azure Blob Storage, или другое имя. Свяжите любой контейнер(ы) для объединения в этот виртуальный бакет. Этот виртуальный бакет используется для предоставления общедоступного для чтения бакета через S3.
  5. По умолчанию Flexify.IO устанавливает самоподписанный SSL-сертификат, в то время как конечный пункт S3 требует HTTPS. Подключитесь к ВМ по SSH, используя файл ключа (имя пользователя по умолчанию azureuser), и замените следующие файлы на правильные:
  • /etc/flexify/ssl/cert.pem — замените на файл сертификата (кодирование PEM)

  • /etc/flexify/ssl/key.pem — замените на файл закрытого ключа (кодирование PKCS#8 PEM, это тот, который начинается с BEGIN PRIVATE KEY, а не BEGIN RSA PRIVATE KEY, который является PKCS#1)

    Эти файлы принадлежат root, поэтому вам придется использовать sudo для их замены. Лучше всего убедиться, что заменяемые файлы имеют те же владельца и разрешения, что и оригинальные, то есть root:root и разрешения 600.

  1. По умолчанию Flexify.IO создает корневой сервис S3 с несколькими бакетами. Discourse требует поддержки поддоменов для бакетов. Перейдите по адресу: <IP-адрес вашей ВМ Flexify.IO>/flexify-io/manage/admin/engines/configs/1, который откроет скрытую страницу конфигурации!
  2. Укажите базовый домен S3 (допустим, это s3.mydomain.com) в поле Endpoint hostname, которое по умолчанию должно быть пустым. Нажмите Сохранить, чтобы сохранить настройку.
  3. Перезапустите ВМ Flexify.IO в портале Azure.
  4. В вашем DNS сопоставьте s3.mydomain.com и *.s3.mydomain.com с IP-адресом ВМ Flexify.IO.
  5. В Discourse установите следующие значения на странице администратора (да, нет необходимости, чтобы настройки находились в app.yml):
use s3: true
s3 region: anything
s3 endpoint: https://s3.mydomain.com
s3 access key: myaccesskey
s3 secret assess key: mysecret key
s3 cdn url: https://<azure-blob-account>.blob.core.windows.net/<container>
s3 bucket: <virtual bucket>
s3 backup bucket: <backup bucket>  (подойдет любой контейнер, так как он не требует публичного доступа на чтение, и Flexify.IO автоматически предоставит их)
backup location: s3

Не рекомендуется использовать один и тот же бакет для production и staging. Если вы все же это сделаете, примите меры, чтобы ваш staging-сайт не удалял ваши production-ресурсы (установите s3 disable cleanup как минимум, и следите за тем, чтобы он не удалял резервные копии production).

Wasabi

@pfaffman попробовал wasabi для резервных копий, но, казалось, он периодически и бесшумно не работал, оставляя резервные копии на жестком диске и в конечном итоге заполняя его. Ни wasabi, ни meta не имели никаких подсказок, поэтому я не рекомендую его, хотя ваш опыт может отличаться. @pfaffman теперь довольно уверен, что эта проблема была вызвана тем, что резервное копирование и автоматическая перезагрузка как-то были запланированы одновременно; он использовался только для резервных копий, но, казалось, работал нормально. Если кто-то хочет попробовать и сообщить здесь, это должно работать, по крайней мере, для резервных копий.

Oracle Cloud

Oracle Cloud не поддерживает доступ к бакетам в стиле виртуального хоста и не будет работать

Cloudflare R2

Cloudflare R2 совместим с объектным хранилищем S3 при использовании CDN Cloudflare. Бесплатный план Cloudflare предлагает 10 ГБ хранилища, чего должно быть более чем достаточно для нужд большинства форумов.

Чтобы настроить Cloudflare R2, вам нужно будет настроить соответствующие параметры в панели управления Cloudflare в разделе R2 Object Storage.

В зависимости от ваших потребностей (загрузки или резервные копии или оба), вот соответствующие параметры, которые нужно вставить в ваш файл app.yml или в поиск Admin-All site settings по запросу S3:

  DISCOURSE_ENABLE_S3_UPLOADS: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ENDPOINT: https://<your-account-id>.r2.cloudflarestorage.com
  DISCOURSE_S3_ACCESS_KEY_ID: "xxx"
  DISCOURSE_S3_SECRET_ACCESS_KEY: "xxx"
  DISCOURSE_S3_UPLOAD_BUCKET: your-upload-bucket-name
  DISCOURSE_S3_CDN_URL: https://uploads.yourdomain.com
# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true

  DISCOURSE_ENABLE_DIRECT_S3_UPLOADS: true
  DISCOURSE_S3_USE_ACLS: false
  
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BACKUP_BUCKET: your-backup-bucket-name

Если вы не хотите редактировать свой app.yml, вы можете сделать это в интерфейсе администратора:

«Admin → All site settings» (поиск по S3):

  • Enable S3 uploads = true
  • Enable direct S3 uploads = true
  • S3 access key ID = "xxx"
  • S3 secret access key = "xxx"
  • S3 region = any
  • S3 upload bucket = your upload bucket name
  • S3 endpoint = https://<your-account-id>.r2.cloudflarestorage.com
  • S3 CDN URL = https://uploads.yourdomain.com
  • S3 use ACLs = false (отключите это!)
  • S3 backup bucket = your backup bucket name
  • Backup location = S3

Важные примечания по настройке Cloudflare R2:

  1. При настройке вашего app.yml или web_only.yml для Cloudflare R2 только установите DISCOURSE_S3_CDN_URL. НЕ устанавливайте DISCOURSE_CDN_URL. Если вы проксируете свой основной домен через Cloudflare, он уже кэширует и обслуживает ресурсы вашего приложения автоматически. Если вы попытаетесь настроить отдельный DISCOURSE_CDN_URL с использованием DNS Cloudflare, строгая маршрутизация хостов NGINX в Discourse отклонит запросы, что приведет к бесконечным циклам перенаправления 301, блокировкам политики CORS и неработоспособности сайта.
  • Оставьте DISCOURSE_CDN_URL закомментированным.
  • Установите DISCOURSE_S3_CDN_URL: https://your-r2-custom-domain.com
  1. Разрешения токена API: Поскольку в Discourse есть только один набор полей учетных данных, токен API, который вы генерируете в Cloudflare, должен иметь разрешение на доступ как к вашему бакету загрузок, так и к вашему бакету резервных копий. При создании токена выберите либо «Применить ко всем бакетам», либо используйте «Применить к определенным бакетам» и убедитесь, что оба отмечены. Также обязательно отметьте Object Read & Write при создании ключа API (по умолчанию только Object Read only).

  2. При копировании URL конечного пункта из Cloudflare он может добавлять имя бакета к URL — вы должны удалить имя бакета из конца строки в вашем файле .yml (или настройках администратора), если оно будет вставлено.

  3. Раскомментируйте # DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true, если вы хотите использовать свой бакет загрузок R2 для всех загрузок, включая файлы PDF и ZIP. (Обратите внимание, что это сделает все загруженные файлы общедоступными по прямой ссылке)

  4. Если вы включаете DISCOURSE_ENABLE_DIRECT_S3_UPLOADS (true), то вы должны отключить DISCOURSE_S3_USE_ACLS (false). Это связано с тем, что Cloudflare R2 использует разрешения на уровне бакета; ваш бакет загрузок должен быть публичным, а бакет резервных копий — частным. Для загрузок Cloudflare R2 вам НЕ нужно настраивать задачи rake правил CORS или писать IAM json, поскольку вы настроите это в панели управления Cloudflare при настройке разрешений вашего бакета. Токен Cloudflare «Object Read & Write» автоматически предоставляет разрешения на multipart-загрузку, и вставка следующего правила CORS непосредственно в настройки бакета загрузок R2 в панели управления Cloudflare в разделе CORS Policy заменяет необходимость выполнения задачи rake.

[
  {
    "AllowedOrigins": [
      "https://forum.yourdomain.com"
    ],
    "AllowedMethods": [
      "GET",
      "PUT",
      "POST",
      "DELETE",
      "HEAD"
    ],
    "AllowedHeaders": [
      "*"
    ],
    "ExposeHeaders": [
      "ETag"
    ],
    "MaxAgeSeconds": 3000
  }
]

См. также эту тему для получения дополнительной информации о настройке Cloudflare: Using Discourse with Cloudflare: Best Practices

Contabo

@tuxed пытался заставить Contabo Object Storage работать для загрузок, совместимых с S3. Кажется, что при загрузке он добавляет имя репозитория в начало URL, и он не смог заставить это работать.

Безопасные загрузки

Безопасные загрузки поддерживаются только для AWS S3. Если ваша команда rake uploads:migrate_to_s3 не выполняется, вы должны ввести эти команды, чтобы сначала подсчитать, а затем пометить как небезопасные эти загрузки, учитывая, что вы знаете, что они не должны быть безопасными, в противном случае вам нужно будет использовать AWS S3.

./launcher enter app
rails c
Upload.where(secure: true).count
Upload.where(secure: true).update_all(secure:false)

  1. Oracle Cloud не поддерживает доступ к бакетам в стиле виртуального хоста и не будет работать ↩︎

69 лайков
Defining DISCOURSE_S3_CDN_URL links to assets in S3 CDN URL
Backblaze S3 issue: duplicated uploads after delete
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Using Scaleway s3-compatible object storage
Extend S3 configuration for other s3 API compatible cloud storage solutions
Setting up backup and image uploads to Backblaze B2
What are the right settings to use S3 bucket (with non-Amazon URL)?
Upload assets to S3 after in-browser upgrade
Using multiple containers - what needs to be shared?
Virus scanning of uploaded files
Imgur images broken
Admin role conflates server admin and board admin
Error in rebuilding using minio as object store
Use WebTorrent to load media objects
Issues with changing File/Image upload location to S3 Server from local storage
Hosting Optimization with Digital Ocean
Hosting Optimization with Digital Ocean
Theme modifiers: A brief introduction
Configure automatic backups for Discourse
Problem with Backblaze for backup- Failed to list backups from S3: Signature validation failed
Move from BackBlaze B2 to Digital Ocean Spaces
Which free storage for many images? also to be used for thumbnails etc
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Restore Failure - S3 (compatible) backup
Restore Failure - S3 (compatible) backup
Digitalocean block storage VS amazon S3
Digitalocean block storage VS amazon S3
Admin upgrade page doesn't load with a CDN
Install Discourse for Production Environment on Windows Server
Running Discourse on Azure Web Sites vs. Azure VM?
How to turn off S3 storage?
Access Denied error message when trying to upload images
What are the right settings to use S3 bucket (with non-Amazon URL)?
REQ: Support S3 backup to a service like Backblaze
REQ: Support S3 backup to a service like Backblaze
Using Scaleway s3-compatible object storage
Overwrite meta og:image image source to use externally public loaded images on topics?
How to store uploads with multiple web_only servers?
Can not edit topics with picture with S3 backend
Finding UI generated backup and restoring site
Looking for doc to connect discourse with digital ocean spaces
Looking for doc to connect discourse with digital ocean spaces
Looking for doc to connect discourse with digital ocean spaces
403 Error with digital ocean cdn
Link to headers (anchor links)
NoMethodError downcase s3_bucket_name absolute_base_url
What should I enter in the S3 CDN settings if I don't have a CDN?
Backing up files in Object Storage
Minio: A header you provided implies S3 functionality that is not implemented
Configure automatic backups for Discourse
S3 OVH Object Storage
File directory system
Unable to backup or navigate to backups
Uploads to AWS S3 and Configured CDN
Migration to a Self-Hosted solution from Kubernetes
How to develop discourse in a team?
Images didn't load after configuring S3 uploads
Need Azure blob storage
Use Google Cloud Storage Instead of S3
Move discourse uploads to free space on server
Strange behavior with Digital Ocean Spaces/S3 and lots of duplicated CORS rules for `example.com`
Can't upload PDF to S3
"canned acl" error when uploading images
AWS S3 Object Ownership
What’s your server configurations?
How to debug S3 uploads
Problems with Patreon Login, Force HTTPS, and S3 CDN (three) Issues
Cron task to sync local backups to DigitalOcean Spaces
Cron task to sync local backups to DigitalOcean Spaces
Problems with Patreon Login, Force HTTPS, and S3 CDN (three) Issues
Help restoring - system hung at midnight
Help restoring - system hung at midnight
Image upload error: The bucket does not allow ACL's
Make s3_region a string value
How can I set s3_force_path to true?
S3 assets folder, is a cleanup needed?
BunnyCDN storage for automatic backups
BunnyCDN storage for automatic backups
Move Uploads and Backups to DigitalOcean Block Storage
Required local storage for URL referenced images vs. uploaded images?
Colored loading dots because assets not uploaded
Is DO Spaces CDN still broken? Any workarounds?
Is DO Spaces CDN still broken? Any workarounds?
Is DO Spaces CDN still broken? Any workarounds?
Basic How-To for Using MinIO storage server run by you for your Discourse Instance
Minio instead of S3?
Configure automatic backups for Discourse
S3 image bandwidth costs are getting annoying
S3 image bandwidth costs are getting annoying
Support for ImgBB image upload service
Install Discourse on Amazon Web Services (AWS)
Account creation not working with discourse_encrypt
Cannot load any images “Uncaught (in promise) no-response: no-response”
Tips on Google Cloud S3
Enable a CDN for your Discourse
Invalid URL for markdown-it-bundle
Not using volumes (or automatically using S3) when hosting with Docker
Configuring automatic backups
I have a problem with my proxy status
Inline PDF Previews
My images are not working
Getting error 422 invalid argument when configure S3 upload with GCS
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Strange behavior with Digital Ocean Spaces/S3 and lots of duplicated CORS rules for `example.com`
My install broke after updating, how can I fix it?
Uploads Subdomain For Cloudflare
Hetzner deleted my account, my server and I was left with nothing. What to do?
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Understanding Uploads, Images, and Attachments
S3, Assets & CDN Error
Capacity planning / Resource requirements
Migrate assets to s3 rake tasks
Best option for DB and file Storage
S3 error, when updating to 2.9.0.beta1
Forum rendered unusable
Forum rendered unusable
Configure automatic backups for Discourse
Migrate Discourse broke S3 images
Configure automatic backups for Discourse
Cloud storage and cdn
Migrating uploads from S3 to local
Another discourse offline "bootstrap failed with exit code 5"
Another discourse offline "bootstrap failed with exit code 5"
AI Plugin Build Error - 'bundle exec rake db:migrate' failed
Your Docker installation is not working correctly - no space left on device - safe to use ./launcher cleanup?
Uncaught SyntaxError: forum spins nonstop and never loads
Why is my upload limit 100mb?It's set to 500mb
Trouble with Google Bucket for backup
Did I overwrite my site settings with a cross-instance backup/restore?
Need tips on making my forum faster
What should be the server requirements
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Set up BackBlaze S3 with BunnyCDN
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Make s3_region a string value
Imgur upload built into the post buttons
Decoupled Discourse Application - Managed Redis, Managed Postgres, and DIgital Ocean Volume with Discourse
S3 and Cloudfront - Setup Not Working
Cannot upload images in mobile discourse
Cloudflare R2: Navigating Setup and Handling Configuration Errors
Cloudflare R2: Navigating Setup and Handling Configuration Errors
Cloudflare R2: Navigating Setup and Handling Configuration Errors
S3 assets broken after moving forum
Backup request via FTP
Error when doing "bundle exec rake s3:upload_assets" - Could not locate Gemfile or .bundle/ directory
Separate S3 access keys for backups and uploads?
Topic List Previews (legacy)
Disk usage spike during backup, Discourse crashed hard :-(
Make s3_region a string value
Favicon setup: "To work correctly over a CDN it must be a png"
Change image folder to symlinked folder
Migrating uploads from S3 to local
S3 Upload Confusion: Dashboard vs. app.yml
Old installation failing upgrade
Where are Images and uploads stored?
Rebuild issue: [Cannot set dual-stack in combination with a custom endpoint.]
Problem updating data in the separate database
Resizing images off server
Unable to setup S3 bucket
Discourse Stuck on Loading (Logs)
Discourse Stuck on Loading (Logs)
Unable to setup S3 bucket
How to add AWS Cloudfront as a Discourse CDN
Unable to setup S3 bucket
Configured s3, but i want asset to serve locally
Configured s3, but i want asset to serve locally
Set up BackBlaze S3 with BunnyCDN
Discourse s3 backup folder
SSO broken after rebuild with stable v3.3.3
How to Configure Cloudflare R2 for your Discourse Community
如何批量修改文件链接地址
Can't migrate uploads to S3
Backup discourse from the command line
Stuck and lost updating forum, problems with PG migration
Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections
Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections
S3 (not AWS) backups stopped working, presumably since an update
Troubleshooting S3 Uploads: Site hangs after rebuild, JS assets fail to load with net::ERR_... on both R2 and GCS
Inquiry About Discourse’s Support for Amazon S3 Storage
Backup discourse from the command line
Inquiry About Discourse’s Support for Amazon S3 Storage
Inquiry About Discourse’s Support for Amazon S3 Storage
Cloudflare R2 Storage Issues
Hetzner S3 support
Can the /var/discourse and /var/lib/docker folders be on different volumes?
Setting up backup and image uploads to Backblaze B2
Issues with AWS CDN and S3
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Issues with AWS CDN and S3
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
为啥我的七牛云s3附件上传成功后,论坛中无法加载出来?
Install Discourse on a residential internet with Cloudflare Tunnel
Custom emoji don't use CDN for S3 stored assets in a few pages
S3 and Cloudfront - Setup Not Working
Secure Uploads
Make s3_region a string value
Backup Files Not Showing in Discourse Backend After Uploading to Cloudflare R2
Images after a restore don't have S3 bucket URL
Can't upload to S3 (Cloudflare R2)
Daily Summary (9pm UTC)
Custom Emojis loaded from S3/R2 bypass CDN routing
An AWS S3 Integration with Discourse Tutorial would be nice
Is Scaleway a good option for object storage?
Blackblaze&Cloudflare: image uploading works, but not showing in post
SMF2 Conversion and Rake to S3 Help
Backing up your forum
What causes rake uploads:fix_relative_upload_links
Running 2 hosts behind haproxy fails with random 404s
Site Blank After Rebuild
Rebuild goes into a loop
Custom Emojis loaded from S3/R2 bypass CDN routing
Backblaze S3 issue: duplicated uploads after delete
Migrate_to_S3 Fails on Rebake
Downloads coming from S3 even with DISCOURSE_S3_CDN_URL set
Errors trying to use custom S3 storage
Moving from one S3 bucket to another
S3 image bandwidth costs are getting annoying
Basic How-To for Using MinIO storage server run by you for your Discourse Instance
SSL error - can't upload images
Digital Ocean Spaces don’t implement the AWS S3 API for the CORS rule
Extend S3 configuration for other S3 API compatible services
How to separate uploaded files to another server
Storing Images in the cloud
S3 and Cloudfront - Setup Not Working
Migrate_to_S3 Fails on Rebake
Can not access backup page and related error when restoring using GCP Object Storage
Cannot rebake after setting up CDN
Rebuild failure - skipping "after_assets_precompile" section of app.yml
High Availability 3 Server setup
Enable hidden setting to include S3 uploads in the backups
Run Discourse as docker swarm service
Azure Blob Storage Plugin
How might we better structure #howto?
Migrating uploaded files from DO to S3
Discourse as a closed wiki