アップロード用のS3互換オブジェクトストレージプロバイダーの設定

: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 はい*
セルフホスト MinIO はい
Azure Blob Storage Flexify.IO はい
Oracle Cloud Object Storage いいえ [1]
Wasabi Object Storage 不明
Cloudflare R2 はい
Contabo Object Storage いいえ

他のサービスが動作することを確認した場合は、このウィキに追加してください。

設定

Discourse の静的アセットをオブジェクトストレージに保存するには、app.ymlhooks セクションに以下の設定を追加してください。

  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 もスキップして手動で設定してください。

: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: 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 の代替として使用するには、いくつかの注意点と要件を満たす必要があります。

  1. 完全に設定された MinIO サーバーインスタンスを持っていること
  2. MinIO 設定でドメインサポートが有効になっていること(ドメイン駆動型のバケット URL のため)。 これは MinIO と Discourse の必須セットアップ要件です。MinIO はまだ Discourse でサポートされなくなったレガシーな S3「パス」スタイルをサポートしているためです。
  3. MinIO の DNS 設定が正しく行われており、バケットのサブドメインが MinIO サーバーに正しく解決され、MinIO サーバーが基本ドメイン(この場合は minio.example.com)で設定されていること
  4. MinIO サーバーに discourse-data というバケットが存在し、「public」ポリシーが設定されていること
  5. 前述の通り、S3 CDN URL がバケットを指し、リクエストをキャッシュするように正しく設定された CDN を指していること
  6. 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 で起動できます。ただし、セットアップには少し手間がかかります。

  1. Azure ポータルで、Flexify.IO - Amazon S3 API for Azure Blob Storage という新しいリソースを作成します。
  2. 軽度の使用の場合は、最小 VM 設定で問題なく動作するようです。ほとんどのデフォルト設定を受け入れます。VM を作成する際に PEM キーファイルを保存することを忘れないでください。
  3. Flexify.IO の VM リンクにアクセスしてシステムに入り、指示に従って Azure Blob Storage データプロバイダーと生成された S3 エンドポイントをセットアップします。エンドポイント設定 Public read access to all objects in virtual buckets が true になっていることを確認してください。S3 エンドポイント URL とキーをコピーします。
  4. New Virtual Bucket を押し、仮想バケットを作成します。Azure Blob Storage コンテナと同じ名前でも、異なる名前でも構いません。この仮想バケットにマージするコンテナをリンクします。この仮想バケットは、S3 経由で公開読み取り可能なバケットを公開するために使用されます。
  5. デフォルトでは、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.comFlexify.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

注記:

  1. API トークンの権限:Discourse には 1 組の認証情報フィールドしかないため、Cloudflare で生成する API トークンには、アップロードバケットとバックアップバケットの両方にアクセスする権限が必要です。トークンを作成する際は、「すべてのバケットに適用」を選択するか、「特定のバケットに適用」を選択して両方にチェックが入っていることを確認してください。また、API キーを作成する際に Object Read & Write にチェックを入れることを忘れないでください(デフォルトは Object Read only のみです)。

  2. Cloudflare からエンドポイント URL をコピーする際、URL の末尾にバケット名が付加されることがあります。.yml ファイルに貼り付けた場合は、末尾のバケット名を削除してください。

  3. R2 アップロードバケットを PDFZIP ファイルを含むすべてのアップロードに使用したい場合は、# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true のコメントアウトを外してください。(これにより、アップロードされたすべてのファイルが直接リンクを介して公開可能になります)

  4. 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)

  1. Oracle Cloud は、バケットへの仮想ホストスタイルアクセスをサポートしておらず lacks support for virtual-host style access to buckets、動作しません will not work ↩︎

「いいね!」 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
Set up BackBlaze S3 with BunnyCDN
Can not access backup page and related error when restoring using GCP Object Storage
Setting up backup and image uploads to Backblaze B2
Upload assets to S3 after in-browser upgrade
What are the right settings to use S3 bucket (with non-Amazon URL)?
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
Custom emoji don't use CDN for S3 stored assets in a few pages
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
Run Discourse as docker swarm service
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?
Install Discourse on a residential internet with Cloudflare Tunnel
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?
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
[PAID] Configure an S3 compatible object storage provider for uploads
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
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?
S3 and Cloudfront - Setup Not Working
S3 and Cloudfront - Setup Not Working
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)
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Make s3_region a string value
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
Colored loading dots because assets not uploaded
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?
Secure 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
Backup Files Not Showing in Discourse Backend After Uploading to Cloudflare R2
Resizing images off server
Unable to setup S3 bucket
Discourse Stuck on Loading (Logs)
Discourse Stuck on Loading (Logs)
Unable to setup S3 bucket
Rebuild failure - skipping "after_assets_precompile" section of app.yml
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
Setting up backup and image uploads to Backblaze B2
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?
An AWS S3 Integration with Discourse Tutorial would be nice
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附件上传成功后,论坛中无法加载出来?
Imgur upload built into the post buttons
Backup discourse from the command line
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
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
Migrate_to_S3 Fails on Rebake
Cannot rebake after setting up CDN
High Availability 3 Server setup
Enable hidden setting to include S3 uploads in the backups
S3 error, when updating to 2.9.0.beta1
Azure Blob Storage Plugin
How might we better structure #howto?
Migrating uploaded files from DO to S3
Discourse as a closed wiki
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

こんにちは、皆さん。

私はこれまで数年間、CDN なしで S3 ストレージを使用してきました。

別のスレッド でいただいたアドバイスに従い、本日 CloudFront CDN を設定しました。

CDN URL をコントロールパネルに追加し、23 万件以上の投稿を再構築(rebake)した後に、CloudFront の設定を間違えてすべてが壊れてしまうという事態を避けるため、この挙動が期待通りであることを確認していただけますでしょうか?:bowing_man:t2:

現在、ユーザーがアップロードした画像の例 URL は以下の通りです。

https://greyarrows.s3.dualstack.eu-west-2.amazonaws.com/original/3X/8/3/8335cab232f512f4a979c7f0c8562e149c01b212.png

表示結果:

私の CloudFront の「ドメイン名」は d1q8cepst0v8xp.cloudfront.net です。

上記の例 URL を手動で編集し、既存のドメイン名内の S3 部分を CloudFront のドメイン名に置き換えると、以下のようになります。

https://d1q8cepst0v8xp.cloudfront.net/original/3X/8/3/8335cab232f512f4a979c7f0c8562e149c01b212.png

確かに、画像は正常に読み込まれます。

したがって、Discourse のコントロールパネルに S3 CDN URL として d1q8cepst0v8xp.cloudfront.net を追加し、すべての投稿を再構築して、あとは魔法が起きるのを待つだけでよい、という理解で正しいでしょうか?

よろしくお願いいたします。CDN はすべて初めてのことですので、安全にテストできる開発環境も持っておりません :grimacing:

「いいね!」 4

S3 設定のトマストーンポリシーも有効にしています:

Screen Shot 2021-02-14 at 21.08.39

これは問題になりますか?現在は CDN を使用しているためです。それとも、バックグラウンドでは CDN URL ではなく、元の S3 バケットがまだチェックされているのでしょうか?

当然ながら後者だと思っていますが、何十万ものユーザーの写真アップロードを止めるわけにはいきません:scream

:blush:

「いいね!」 2

はい、その通りです。

この理論を検証するために、数十万件の投稿を再ビルドする前に、以下の健全性チェックを行いました。

  • 画像をアップロード
  • S3 CDN URL 設定を変更
  • テスト投稿の HTML を再構築(UI を通じて)
  • ブラウザでページをリフレッシュ
  • ブラウザコンソールのネットワークタブを確認し、画像が CloudFront 経由で取得されていることを確認
  • 新しい投稿に新しいテスト画像をアップロード
  • ブラウザコンソールのネットワークタブを確認し、画像が CloudFront 経由で取得されていることを確認

現在、すべての投稿を再ビルド中です :+1:t2:

「いいね!」 14

Richie、ご報告ありがとうございます。私も数年間 AWS S3 の画像ストレージを使用しており、コンソールのメッセージを通じてこのスレッドにたどり着きました。ただし、冒頭の説明には「すでに S3 を利用しており、CDN が必要だけ」というケースについては触れられていません。

参考までに、私が行った手順を記載します。

  1. AWS コンソールにアクセスし、「Network and Content Delivery」から CloudFront を選択
  2. 「Create distribution」ボタンをクリック
  3. 比較的わかりやすいフォームに入力。実際に行う必要があるのは、ドロップダウンメニューから画像が保存されている AWS S3 バケットを選択することのみ
  4. CloudFront の設定完了まで少し待つ
  5. CloudFront Distributions リストの「Domain Name」列に <gibberish>.cloudfront.net というドメインが表示された
  6. そのドメインをコピーし、サイト管理の File 設定にある s3 cdn url フィールドに貼り付け
  7. いくつかのテストを実施:
    a. 新しい投稿を作成して画像をアップロードすると、実際に CloudFront 経由で表示された
    b. 既存の画像を含むいくつかのランダムな投稿で「Rebuild HTML」を実行すると、画像が cloudfront.net 経由で再構築されていることが確認できた
  8. すべて問題なさそうだったため、再ビルド(rebake)を実行。現在投稿数が約 50 万件あるため、数時間かかった:
./launcher enter app
# rake posts:rebake
  1. 現在はすべて正常に動作しているようです。Sidekiq キューには投稿数分のジョブが大量に追加されており、数日かけて処理が進む見込みですが、現在順次処理が進んでいます。
「いいね!」 18

本当にそうでしょうか?こちらのサイトは CDN からアセットを読み込んでいますが、キャッシュのクリアは不要でした。また、これは Ember CLI の変更であり、本番環境には影響しないはずです :thinking:

「いいね!」 5

ああ、あの厄介な最適化ツールね。可能なら無効にすることをお勧めするよ。Discourse はすでに各アセットに対して最適な設定を標準で提供しているから。これらの最適化ツールは、2000 年代のブラックボックス型の Web ソフトをホストしている場合には役立ったりするけど、現代の技術には全く通用しないんだ。それに、Cloudflare の有名な最適化ツールさえも Discourse を壊すことがよくあるから、他のツールに期待するのは無理だと思うよ。ある日は動作しても、次の日には壊れて、すべての訪問者が空白のページを見るはめになるかもしれない。それなのに得られるメリットはゼロなのにね。

「いいね!」 6

サイト設定で secure_uploads を有効にしましたか?

また、Discourse との互換性の問題として本日報告され、修正されたようです:

「いいね!」 6

この警告が管理ダッシュボードに表示されないようにする方法はありますか?

サーバーは S3 へのファイルアップロード用に設定されていますが、S3 CDN が設定されていません。

S3 CDN の設定で問題が発生しましたが、費用はさほどかからないため、S3 を直接利用することに問題ありません。ただし、この通知が消えることを望んでいます。その結果については十分に理解しているためです。

「いいね!」 2

こんにちは。

アップデートのお知らせです。GCS を使用したバックアップ設定が可能になりました。これは 別のスレッド にも投稿しました。この解決策を求めて苦労している他の人々の助けになれば幸いです。

やり方は以下の通りです。
デフォルト設定をバックアップ用に有効にしてください(または、管理ダッシュボードから設定することも可能です)。

DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3

次に、バケットの権限を Storage Legacy Object Owner に設定します。

  1. Google Cloud Console でプロジェクトに移動します
  2. Storage を選択します
  3. バケットを選択します
  4. 権限タブに移動します
  5. 新しい権限を追加し、サービスアカウントのメールアドレスを入力します。ロールには Storage Legacy Object Owner を選択してください
  6. 保存して完了です。

二重投稿になってしまい申し訳ありませんが、この素晴らしいアップデートを共有したかっただけです。
ありがとうございます。

「いいね!」 5

Wasabiも追加していただけると嬉しいです。

「いいね!」 1

しばらくWasabiをバックアップに使用していました。設定に関しては「特に問題なく動作した」ので、もしよろしければ試してみてください。

しかし、頻繁にバックアップが静かに失敗し、バックアップデータがローカルマシンに残り続け、ディスク容量を圧迫することがありました。WasabiとDiscourseのエラーログを確認しましたが、どちらの側でも何かを「修正」できるような明確な説明は見つかりませんでした。

「優れている」とは言い切れないため、お勧めはしません。

「いいね!」 2

ありがとうございます!
今回はどのように進むか確認します。
デフォルトのバックアップ頻度は、バックアップ間隔が7日間で、最大5回のバックアップです。
結果をお知らせします。

「いいね!」 1

毎日バックアップを取っていましたが、何個保存しようとしていたかは覚えていません。ただ、ローカルハードディスクには数個分しか空きがありませんでした。

「いいね!」 2

どのストレージを個人的に推奨しますか?
AWS と Azure は個人プロジェクトには手が出しにくいと思います。
Azure については確信がありませんが、AWS は複雑で予測が難しいように見えます。

「いいね!」 1

ワサビが少なくともバックアップには有用だと期待していました。Backblaze S3 は手頃な価格です。アップロードに使ったことは記憶にありませんが、バックアップには機能していると思います(たぶん)。Backblaze の唯一の問題は(最後にテストした時点では)、グローバルキーを使用する必要があり、そのためキーを閲覧できるクライアントには使えなかったことです。最近、その問題を解決する方法(「レガシー」に関する何か、どこかで)を投稿した人がいたと思います。個人的なプロジェクトであれば、次に試すのはそれだと思います。(Digital Ocean を利用しているなら、Spaces もまあまあだと思います。)

「いいね!」 3

私はDOを利用していますが、コスト面ではBlackblaze/Wasabiの方が安いです。
アップロードには何を使いましたか?

「いいね!」 1

申し訳ありませんが、理解できませんでした。
なぜ app.yml で設定を指定する必要があるのでしょうか?Discourse → 設定からこの情報を入力できるはずです。

「いいね!」 1

コンテナ構築時にアセットをビルドする方法によるものだと思います。環境変数とデータベースに設定がある場合の動作が異なるのはかなり混乱を招きますが、これが実際の動作です。また、コマンドラインから新しいサイトをビルドして復元できるため、管理方法としてもより優れています。

「いいね!」 4

これをどこに設定すればよいのでしょうか?Discourse の管理設定には見当たりません。

「いいね!」 1