このトピックでは、一般的な 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 では 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 日あたりのクラス 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
アプリのリビルダーによってルールがインストールされなくても、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 ストレージプロトコルを 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 ではないもの)に置き換えますこれらのファイルは root 権限であるため、置き換えるには
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
Cloudflare のオファリングは互換性がありません。テスト中、@fearlessfrog が Cloudflare にチケットを提出し、2022 年 12 月に以下のように回答しました。
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 はバケットへの仮想ホスト型アクセス をサポートしていません、そのため 動作しません ↩︎