このトピックでは、一般的な 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 | はい* |
| セルフホスト | 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 は、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 では「孤児アップロードのクリーンアップ」が正しく機能しないという 報告 があります。孤児のクリーンアップを機能させるには、バケットの ライフサイクルルールを変更 する必要があります。
設定例:
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 日あたりの無料クラス C トランザクション制限 2500 に達する可能性があります。制限を解除するには、支払い方法を追加する必要があります。
MinIO Storage Server
MinIO ストレージサーバーを S3 の代替として使用するには、いくつかの注意点と要件を満たす必要があります。
- 完全に設定された MinIO サーバーインスタンスを持っていること
- MinIO 設定でドメインサポートが有効になっていること(ドメイン駆動型のバケット URL のため)。 これは MinIO と Discourse の必須セットアップ要件です。MinIO はまだ Discourse でサポートされなくなったレガシーな S3「パス」スタイルをサポートしているためです。
- MinIO の DNS 設定が正しく行われており、バケットのサブドメインが MinIO サーバーに正しく解決され、MinIO サーバーが基本ドメイン(この場合は
minio.example.com)で設定されていること - MinIO サーバーに
discourse-dataというバケットが存在し、「public」ポリシーが設定されていること - 前述の通り、S3 CDN URL がバケットを指し、リクエストをキャッシュするように正しく設定された CDN を指していること
- CDN が、データを取得する際にコア S3 URL の「Host」ヘッダー(例:
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 ではすべての HTTP 動詞で CORS が有効になっているようです。その結果、MinIO は BucketCORS(S3 API)をサポートしていません。
Azure Blob Storage with Flexify.IO
Azure Blob Storage は S3 互換サービスではないため、Discourse では使用できません。プラグインはありますが、壊れています。
Azure Blob Storage に S3 互換インターフェースを公開する最も簡単な方法は、Azure ストレージプロトコルを S3 に変換する Flexify.IO サーバーを追加することです。
執筆時点では、このサービスは Azure で無料で、非常に基本的(安価)な VM タIER で起動できます。ただし、セットアップには少し手間がかかります。
- 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で始まりBEGIN RSA PRIVATE KEYで始まる PKCS#1 ではないもの)に置き換えます
これらのファイルはルート権限が必要なため、置き換えるには sudo が必要です。置換ファイルが元のファイルと同じ所有者と権限(root:root および 600 権限)を持っていることを確認するのが最善です。
6. デフォルトでは、Flexify.IO は複数のバケットを持つルートレベルの S3 サービスを作成します。Discourse はバケットの サブドメイン サポートを必要とします。<your Flexify.IO VM IP>/flexify-io/manage/admin/engines/configs/1 にアクセスすると、非表示 の設定ページが開きます。
7. Endpoint hostname フィールドに S3 の基本ドメイン(例:s3.mydomain.com)を指定します。デフォルトでは空白になっています。Save を押して設定を保存します。
8. Azure ポータルで Flexify.IO VM を再起動します。
9. DNS で、s3.mydomain.com と *.s3.mydomain.com を Flexify.IO VM の IP にマップします。
10. 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 は、バケットへの仮想ホストスタイルアクセスをサポートしておらず lacks support for virtual-host style access to buckets、動作しません will not work
Cloudflare R2
Cloudflare R2 を設定するには、Cloudflare ダッシュボードの R2 オブジェクトストレージで関連設定を構成する必要があります。
要件(アップロード、バックアップ、またはその両方)に応じて、app.yml ファイルまたは「Admin - 全てのサイト設定」で 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 → 全てのサイト設定」(S3 を検索):
- S3 アップロードを有効にする =
true - 直接 S3 アップロードを有効にする =
true - S3 アクセスキー ID =
"xxx" - S3 秘密アクセスキー =
"xxx" - S3 リージョン =
any - S3 アップロードバケット =
your upload bucket name - S3 エンドポイント =
https://<your-account-id>.r2.cloudflarestorage.com - S3 CDN URL =
https://uploads.yourdomain.com - S3 ACL を使用する =
false(これを無効にしてください!) - S3 バックアップバケット =
your backup bucket name - バックアップ場所 =
S3
注記:
-
API トークンの権限:Discourse には 1 組の認証情報フィールドしかないため、Cloudflare で生成する API トークンには、アップロードバケットとバックアップバケットの両方にアクセスする権限が必要です。トークンを作成する際は、「すべてのバケットに適用」を選択するか、「特定のバケットに適用」を選択して両方にチェックが入っていることを確認してください。また、API キーを作成する際に
Object Read & Writeにチェックを入れることを忘れないでください(デフォルトはObject Read onlyのみです)。 -
Cloudflare からエンドポイント URL をコピーする際、URL の末尾にバケット名が付加されることがあります。
.ymlファイルに貼り付けた場合は、末尾のバケット名を削除してください。 -
R2 アップロードバケットを
PDFやZIPファイルを含むすべてのアップロードに使用したい場合は、# 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
}
]
Contabo
@tuxed は Contabo オブジェクトストレージを 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 は、バケットへの仮想ホストスタイルアクセスをサポートしておらず lacks support for virtual-host style access to buckets、動作しません will not work ↩︎