このトピックでは、一般的な S3 互換のオブジェクトストレージプロバイダー(S3 クローン)の設定方法について説明します。Discourse のホスティングサービスで公式にサポートされ、内部で使用されている Amazon AWS S3 の設定の詳細については、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 | はい* |
| 自前ホスティング | MinIO | はい |
| Azure Blob Storage | Flexify.IO | はい |
| Oracle Cloud | Object Storage | いいえ [1] |
| Wasabi | Object Storage | 場合による |
| Cloudflare | R2 | はい |
| Contabo | Object Storage | いいえ |
他のサービスで動作を確認できた場合は、この Wiki に追加してください。
設定
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 は、Discourse のホスト名を指し、リクエストをキャッシュする CDN です。主に CSS やその他のテーマアセットなど、プル型(取得型)のアセットに使用されます。
DISCOURSE_S3_CDN_URL は、オブジェクトストレージのバケットを指し、リクエストをキャッシュする CDN です。主に JS、画像、ユーザーアップロードなど、プッシュ型(送信型)のアセットに使用されます。
これらは異なる値に設定し、管理者が両方を設定することをお勧めします。
CDN を使用しない(またはバケット URL を CDN URL として入力する)と、問題が発生する可能性があり、サポートされていません。
以下の例では、https://falcoland-files-cdn.falco.dev はバケット内のファイルを配信するように設定された CDN です。例ではバケット名を falcoland-files に設定しました。
app.yml の環境変数にこれらの設定を記述することをお勧めします。これは CDCK がインフラストラクチャで採用している方法であり、十分にテストされているためです。また、アセットのアップロードタスクはアセットのコンパイル後、つまり再ビルド時に実行されます。オブジェクトストレージを最初から正しく動作させる Discourse を構築したい場合は、サイト起動前にアセットがアップロードされるように環境変数を設定する必要があります。
以下のリストからプロバイダーを選択し、app.yml ファイルの env セクションにこれらの設定を追加し、値を適切に調整してください:
AWS S3
公式にサポートし、内部で使用しているサービスです。Cloudfront という CDN オファリングもバケットのファイルをフロントエンドとして配信するために使用できます。権限の正しい設定方法については、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
ファイルのリスト機能が壊れているため、アセットを動作させるためにそれをスキップするための追加の ENV 変数が必要です。また、CORS もスキップし、手動で設定してください。
ファイルをリストできないため、バックアップのリスト表示ができず、自動バックアップが失敗するため、バックアップに使用することはお勧めしません。ただし、ロールを 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 のオファリングも非常に優れており、大部分が問題なく動作します。
Scaleway のマルチパートアップロードは、最大 1,000 パーツ までしかサポートしていません。これは最大 10,000 パーツをサポートする Amazon S3 とは一致しません。大規模なインスタンスの場合、これにより Discourse の バックアップが失敗 し、不完全なアップロードを次の試行の前に 手動で削除 する必要がある場合があります。小規模なインスタンスでは問題ありません。Scaleway はフィードバックに前向きな姿勢を示しているので、この制限の変更を希望する場合は、彼らに連絡してください。
DISCOURSE_S3_ENDPOINT パラメータについて、Discourse はリージョン全体のエンドポイント https://s3.{region}.scw.cloud を使用します。Scaleway ダッシュボードにある「バケットエンドポイント」は https://{bucketName}.s3.{region}.scw.cloud の形式です。接続エラーを防ぐために、バケット名のサブドメインを省略してください。
設定例:
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 で clean up orphan uploads(孤立アップロードのクリーンアップ)が正しく動作しないという 報告 があります。孤立アップロードのクリーンアップを有効にするには、バケットの ライフサイクルルールを変更 する必要があります。
設定例:
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 への初期移行中は、1日2,500件の無料クラスCトランザクション制限 に達する可能性があります。制限を解除するには、支払い方法を追加する必要があります。
MinIO Storage Server
MinIO ストレージサーバーを S3 の代替として使用する前に、満たす必要があるいくつかの注意事項と要件があります:
- 完全に設定された MinIO サーバーインスタンスがあること
- MinIO の設定でドメインサポートが有効になっており、ドメイン駆動型のバケット URL が使用できること。これは MinIO と Discourse のための必須設定要件です。MinIO はまだ Discourse でサポートされていないレガシーな S3「パス」スタイルをサポートしているためです。
- MinIO の DNS 設定が正しく設定されており、バケットのサブドメインが MinIO サーバーに正しく解決され、MinIO サーバーが基本ドメイン(この場合は
minio.example.com)で設定されていること - MinIO サーバー上に
discourse-dataバケットが存在し、それに「公開」ポリシーが設定されていること - このドキュメントの前述の通り、S3 CDN URL がバケットを指し、リクエストをキャッシュするように正しく設定された CDN を指していること
- CDN が実際にコア S3 URL の「Host」ヘッダーを使用するように設定されていること - データを取得する際に
discourse-data.minio.example.comのように - そうでないと CORB(Cross-Origin Resource Blocking)の問題を引き起こす可能性があります。
上記の注意事項と前提条件が満たされていると仮定すると、設定例は以下のようになります:
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
アプリの再ビルダーによってルールがインストールされなくても、MinIO では CORS が有効になります。デフォルトでは、MinIO ではすべての HTTP 動詞に対して CORS が有効になっており、その結果、MinIO は BucketCORS(S3 API)をサポートしていません。
Azure Blob Storage with Flexify.IO
Azure Blob Storage は S3 互換のサービスではないため、Discourse と一緒に使用することはできません。プラグインは存在しますが、壊れています。
Azure Blob Storage に対して S3 互換のインターフェースを公開する最も簡単な方法は、Azure Storage プロトコルを S3 に 変換 する Flexify.IO サーバーを追加することです。
現在、このサービスは Azure で無料で提供されており、実行を開始するには非常に基本的な(安価な)VM ティアだけで十分です。ただし、いくつかの設定が必要です。
- Azure ポータルで、
Flexify.IO - Amazon S3 API for Azure Blob Storageの新しいリソースを作成します。 - 軽量な使用の場合、最小限の VM 構成で問題なく動作します。デフォルトの構成のほとんどを受け入れます。VM を作成する際に PEM キーファイルを保存することを忘れないでください。
- Flexify.IO VM リンクにアクセスし、システムに入ります。Azure Blob Storage データプロバイダーと生成された S3 エンドポイントを設定する手順に従ってください。エンドポイントの設定
Public read access to all objects in virtual buckets(仮想バケット内のすべてのオブジェクトへの公開読み取りアクセス)が true になっていることを確認します。S3 エンドポイント URL とキーをコピーします。 - New Virtual Bucket を押し、仮想バケットを作成します。名前は Azure Blob Storage コンテナと同じでも、異なる名前にしても構いません。この仮想バケットにマージするコンテナをリンクします。この仮想バケットは、S3 を介して公開読み取り可能なバケットを公開するために使用されます。
- デフォルトでは、Flexify.IO は自己署名 SSL 証明書をインストールしますが、S3 エンドポイントには HTTPS が必要です。キーファイルを使用して VM に SSH 接続し(ユーザー名はデフォルトで
azureuser)、以下のファイルを正しいファイルに置き換えます:
-
/etc/flexify/ssl/cert.pem- 証明書ファイル(PEM エンコーディング)に置き換えます -
/etc/flexify/ssl/key.pem- 秘密鍵ファイル(PKCS#8 PEM エンコーディング、BEGIN PRIVATE KEYで始まり、PKCS#1 のBEGIN RSA PRIVATE KEYではないもの)に置き換えますこれらのファイルはルート所有権のため、置き換えるには
sudoが必要です。置き換えたファイルが元のファイルと同じ所有権と権限を持っていることを確認するのが最善です。つまり、root:root所有権と600権限です。
- デフォルトでは、Flexify.IO は複数のバケットを持つルートレベルの S3 サービスを作成します。Discourse はバケットの サブドメイン サポートを必要とします。
<your Flexify.IO VM IP>/flexify-io/manage/admin/engines/configs/1に移動し、隠し 設定ページを開きます! Endpoint hostnameフィールドに S3 の基本ドメイン(例:s3.mydomain.com)を指定します。デフォルトでは空白です。Save を押して設定を保存します。- Azure ポータルで Flexify.IO VM を再起動します。
- DNS で
s3.mydomain.comと*.s3.mydomain.comを Flexify.IO VM IP にマッピングします。 - 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
本番環境とステージング環境で同じバケットを使用することは推奨されません。それでも行う場合は、ステージングサイトが本番環境のアセットを削除しないようにする対策を講じてください(少なくとも s3 disable cleanup を設定し、本番環境のバックアップが削除されないように注意してください)。
Wasabi
@pfaffman が Wasabi をバックアップ用に試しましたが、間歇的に静かに失敗し、バックアップがハードドライブに残り、最終的にディスクが埋め尽くされるようでした。Wasabi でも meta でも手がかりがなかったため、お勧めしませんが、個人差があるかもしれません。 @pfaffman は現在、この問題はバックアップと自動再起動が何らかの理由で同時にスケジュールされたことが原因であったと確信しています。バックアップ専用で使用されていましたが、問題なく動作したようです。誰かが試してここに報告してくださると、少なくともバックアップについては動作するはずです。
Oracle Cloud
Oracle Cloud は バケットへの仮想ホスト形式のアクセスをサポートしていません ため、動作しません
Cloudflare R2
Cloudflare R2 は Cloudflare CDN を使用する場合、S3 オブジェクトストレージと互換性があります。Cloudflare の 無料プランは 10GB のストレージを提供 しており、ほとんどのフォーラムのニーズに十分すぎるでしょう。
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 を編集したくない場合は、管理者 UI でこれを行うことができます:
「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 設定に関する重要な注意点:
- Cloudflare R2 の
app.ymlまたはweb_only.ymlを設定する際、DISCOURSE_S3_CDN_URLのみを設定してください。DISCOURSE_CDN_URLは設定しないでください。 メインドメインを Cloudflare を介してプロキシしている場合、すでにアプリアセットを自動的にキャッシュして配信しています。Cloudflare DNS を使用して別のDISCOURSE_CDN_URLを設定しようとすると、Discourse の厳格な NGINX ホストルーティングがリクエストを拒否し、無限の 301 リダイレクトループ、CORS ポリシーのブロック、サイトの破損を引き起こします。
DISCOURSE_CDN_URLをコメントアウトしたままにします。DISCOURSE_S3_CDN_URL: https://your-r2-custom-domain.comを設定します
-
API トークンの権限:Discourse には資格情報のフィールドが1セットしかないため、Cloudflare で生成する API トークンは、アップロードバケットとバックアップバケットの両方にアクセスする権限が必要です。トークンを作成する際、「すべてのバケットに適用」を選択するか、「特定のバケットに適用」を使用して両方にチェックを入れる必要があります。また、API キーを作成する際に
Object Read & Writeにチェックを入れることを忘れないでください(デフォルトはObject Read onlyのみです)。 -
Cloudflare からエンドポイント URL をコピーする場合、バケット名が URL に追加されることがあります。
.ymlファイル(または管理者設定)に貼り付けられた場合、文字列の末尾からバケット名を削除してください。 -
PDFやZIPファイルを含むすべてのアップロードに R2 アップロードバケットを使用したい場合は、# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: trueのコメントを解除します。(これにより、すべてのアップロードされたファイルが直接リンクを介して公開されます) -
DISCOURSE_ENABLE_DIRECT_S3_UPLOADSを有効にする(true)場合、DISCOURSE_S3_USE_ACLSを無効に(false)する必要があります。これは、Cloudflare R2 がバケットレベルの権限を使用するためです。アップロードバケットは公開、バックアップバケットは非公開にする必要があります。 Cloudflare R2 アップロードの場合、CORS ルールの rake タスクを設定したり IAM json を書いたりする必要はありません。バケット権限を設定する際に Cloudflare ダッシュボードで設定するためです。Cloudflare の「Object Read & Write」トークンは自動的にマルチパートアップロードの権限を付与し、以下の CORS ルールを Cloudflare ダッシュボードの R2 アップロードバケット設定の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)
Oracle Cloud は バケットへの仮想ホスト形式のアクセスをサポートしていません ため、動作しません ↩︎