アップロードのためのS3互換のオブジェクトストレージプロバイダーを設定する

ウィキの編集権限がないようですが、別のプロバイダーを正常に使用できました。

OVHcloud

サービス名: オブジェクトストレージ

リージョンはデータセンターに対応しており、3文字のコードで識別されます。バケットをどこで作成したかわからない場合は、カスタマーポータルのオブジェクトストレージタブを確認してください。

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: [データセンターコード]
DISCOURSE_S3_ENDPOINT: https://s3.[データセンターコード].io.cloud.ovh.net/
DISCOURSE_S3_ACCESS_KEY_ID: [キー]
DISCOURSE_S3_SECRET_ACCESS_KEY: [キー]
DISCOURSE_S3_BUCKET: [バケット名]
DISCOURSE_S3_BACKUP_BUCKET: [バケット名]
DISCOURSE_BACKUP_LOCATION: s3
「いいね!」 1

アップロード用にOVHcloud S3を動作させましたか、それともバックアップだけですか?

最初はテストバージョンだけで、その後本番環境にはバックアップのみを使用しました。なぜなら、本番のマシンにはとにかくたくさんのスペースがあるからです。

S3と非常に互換性がありますが、ライフサイクルルールによる古いファイルの削除やコールドストレージへの移動など、一部不足している点もあり、これらはOVHによって積極的に開発されています。ただし、ファイルの配信には問題なく動作します。

バックアップについては、単にDiscourseの古いバックアップを自動的に削除するオプションを利用しました。

「いいね!」 1

これは本当に残念で、まったく役に立たない返信です。具体的に何が問題なのですか?変更されるサポートドキュメントへのリンクは、誰もこのスレッドで言及されている「ひどい壊れ方」を実際に知ることができないことを意味します。

「メタデータ」とCDNが「それについて知らない」と述べています。どのようなメタデータですか?何が機能していないのかを知ることができれば役立ちます。

この投稿に、iDrive E2の使用方法に関する手順を追加したいと思います。

iDriveが最近有効にした機能により、バケット認証チェックをバイパスしない限り、1つのバケットにのみ割り当てられたアクセスキーが失敗するようです。

rclone.confファイルでno_check_bucket = trueを使用してrcloneを使用する場合、これをバイパスできますが、Discourseのビルド用のENV設定が存在するかどうかはわかりません。

その結果、iDrive E2では、現在、1つのバケットだけでなく、すべてのバケットへの書き込みアクセス権を持つキーを使用する必要があります。

「いいね!」 1

自分で使用していないプロバイダーの問題を、なぜ他の誰かが正確に知ることができるのでしょうか?

ところで、Cloudflare R2でほぼ完了したようです。参照:

Web UIにすべての情報を入力したところ、新しいアップロードは正しくS3ストレージに保存され、バックアップも正しくS3に保存されています。現在のアップロードは明らかに移動していません。
その後、app.ymlに移動して、この情報を入力しました。

## この一連の行により、R2 S3ホストファイルがアップロードおよびダウンロードできるようになります。
  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_ENDPOINT: https://randomnumber.r2.cloudflarestorage.com
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: randomnumbers
  DISCOURSE_S3_SECRET_ACCESS_KEY: randomnumbers
  DISCOURSE_S3_INSTALL_CORS_RULE: false

## Dockerコンテナはステートレスです。すべてのデータは/sharedに保存されます
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## プラグインはここに配置します
## 詳細については、https://meta.discourse.org/t/19157 を参照してください
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
#         - git clone https://github.com/discourse/discourse-subscriptions.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/communiteq/discourse-private-topics.git
#         - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/tknospdr/discourse-auto-remove-group.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-livestream.git
#         - git clone https://github.com/discourse/discourse-calendar.git
          - git clone https://github.com/jannolii/discourse-topic-trade-buttons.git
##        - git clone https://github.com/tknospdr/force-tag-group-order.git

## S3のフック
  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

再構築後、多くのファイルが失われたためサイトが破損しました。そのため、サーバーにファイルを転送しようとしましたが、各ファイルでこのエラーが発生しました。

root@talk-app:/var/www/discourse# rake uploads:migrate_to_s3
S3への移行は現在元に戻せないことに注意してください!
[CTRL+c] でキャンセル、[ENTER] で続行

'default' のアップロードをS3に移行しています...
ファイルをS3にアップロードしています...
 - ローカルファイルのリスト
 => 31 ファイル
 - S3ファイルのリスト
. => 4 ファイル
 - ファイルをS3に同期
#<Thread:0x00007ff89dcbcb20 /var/www/discourse/lib/file_store/to_s3_migration.rb:212 run> が例外で終了しました (report_on_exception は true):
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call': You can only specify one non-default checksum at a time. (Aws::S3::Errors::InvalidRequest)
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/checksum_algorithm.rb:169:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/invocation_id.rb:16:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `block in call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/telemetry/no_op.rb:29:in `in_span'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:53:in `span_wrapper'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.226.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `call'
    from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/client.rb:17315:in `put_object'
    from /var/www/discourse/lib/file_store/to_s3_migration.rb:215:in `block (2 levels) in migrate_to_s3'

これを何らかの方法で完了させるためのアドバイスをいただけると幸いです。

不足しているファイルはアセットである可能性が高いので、それらをs3にプッシュするrakeタスク(s3:upload_assets – 上の方にあります)が必要です。

しかし、エラーは新しいaws s3ライブラリが多くのサービスを壊したことが原因である可能性が高いです。そのため、aws gemをダウングレードするか、別のサービスを使用する必要があります。

その方法についてのトピックがあるかもしれません。私はいくつかのサイトでそれを実行しましたが、どのように、またはどこで文書化されているかは定かではありません。

このトピックかもしれません

「いいね!」 1

app.ymlファイルに含めた変更の一部ですが、それでも実行する必要があるということですか?再構築中にファイルを自動的にプッシュするためにそこにあると思っていました。

試してみました。出力は次のとおりです。


root@talk-app:/var/www/discourse# rake s3:upload_assets
CORSルールをインストール中...
スキップ
スキップ: assets/logo-single-3f9a3693.png
スキップ: assets/favicon-7e45025e.ico
スキップ: assets/logo-single-dev-0d38377d.png
スキップ: assets/push-notifications/posted-e02e1c60.png
スキップ: assets/push-notifications/watching_first_post-e02e1c60.png
スキップ: assets/push-notifications/README-d49cc975.md
(長いリスト...)
スキップ: assets/plugins/footnote_extra-95ffab71.gz.js

実行すべきではありませんが、それらはサイトが「壊れている」状態になる原因となります(あるいは、「壊れている」とは「画像が missing」という意味ですか?) migrate_to_s3 で画像をアップロードすることは、画像にのみ影響します。

アセットがすべてアップロードされた経緯を説明することはできません(サイトの何が壊れていましたか? S3の設定が壊れているのに、それらがどのようにアップロードされたのですか?)

サイトに画像をアップロードできますか?

現在、サイトでは何もできません。

自由に見てみてください。

バケットにはすべて揃っているように見えるので、すべてを正しく機能させるために更新する必要がある環境変数がある可能性があります。
これを解決できれば、R2は本番稼働の準備ができたと言えます。

これ(と他の多くのファイル)が https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com で見つかりません。

これはあなたのCDNまたはバケットですか?そのファイルはあなたのバケットに存在しますか?おそらくバケットにはありますが、CDNが壊れているのではないでしょうか?

以前R2を設定した方法と、それが機能したと思われる方法を以下に示します。

            - "DISCOURSE_S3_REGION: 'auto'"
            - "DISCOURSE_S3_ENDPOINT: https://some-number.r2.cloudflarestorage.com"
            - "DISCOURSE_S3_ACCESS_KEY_ID: 'keyid'"
            - "DISCOURSE_S3_SECRET_ACCESS_KEY: 'secret'"
            - "DISCOURSE_S3_CDN_URL: 'https://r2.myforum.us/xyz'"
            - "DISCOURSE_CDN_URL: 'https://r2.literatecomputing.com'"
            - "DISCOURSE_S3_BUCKET: 'myforum/xyz'"
            - "DISCOURSE_S3_BACKUP_BUCKET: 'myforum/xyz/backups'"

では、これは機能しなかったということですか?

「いいね!」 1

「extra-locales」はどこにあるべきですか?コンテナ内でも、「public」や「assets」の下に見当たりません。どこを見ればよいでしょうか?

くだらない質問ですみませんが、これは私にとって全く新しい経験です。
「それは」とは、私のCDNですか、それとも私のバケットですか?

先頭のダッシュ、およびすべてのシングルクォートとダブルクォートは?私のアプリにはそれらのどれもありません。テストのためにそれらを追加して再構築すべきでしょうか?
私のファイルは正確にはこのように見えます。各行は2スペースでインデントされています。

## This set of lines allows R2 S3 hosted files to be uploaded and downloaded..
  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_ENDPOINT: https://randomnumber.r2.cloudflarestorage.com
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: randomnumbers
  DISCOURSE_S3_SECRET_ACCESS_KEY: randomnumbers
  DISCOURSE_S3_INSTALL_CORS_RULE: false

Web UI経由で設定を入力していたときは機能しましたが、すべてをapp.ymlファイルに入力したところ、サイトにアクセスしたときに表示されたものと同じになりました。

アセットにアクセスした際に表示される内容は以下の通りです。\n\nこのオブジェクトは存在しないか、このURLでは公開されていません。探しているオブジェクトのURLを確認するか、所有者に連絡して公開アクセスを有効にしてください。\n\nホスト名をクラウドフレアのエンドポイントに変更して、https://eufiles.technospider.com/extra-locales/ca382c69f8e6b85162b2ba58f2ce100bfe741966/en/mf.js?__ws=eu.technospider.com が機能するかどうか確認できます。\n\nバケット内でそのファイルを見つけることはできますか?アクセスできますか?\n\n[quote="tknospdr, post:488, topic:148916"]\n「extra-locales」はどこにあるべきですか?\n[/quote]\n\nわかりませんが、ブラウザの開発者ツールからコピーしたURLです。\n\nまずバケット内でそのファイルを見つけて、存在するかどうかを確認してから、CDNが見つけられない理由を解明してください。\n\n\n[quote="tknospdr, post:488, topic:148916"]\n先頭のダッシュ、およびすべてのシングルクォートとダブルクォートを含めてですか?\n[/quote]\nいいえ。設定には別のツールを使用していますが、これらは以前は機能していたと確信している環境変数設定です。\n\n[quote="tknospdr, post:488, topic:148916"]\nWeb UI経由で設定を入力したときは機能しましたが、app.ymlファイルにすべて入力したときに、サイトにアクセスしたときに見たものになりました。\n[/quote]\n\nなるほど。それはイライラしますね。頑張ってください。

以下が表示されます。

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>InvalidArgument</Code>
<Message>Authorization</Message>
</Error>

私のエンドポイントは次のとおりです。
https://7100e60b936991e069a3230dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/

DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com

DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com/exotics-unlimited

に変更したところ、ローディングインジケーターが消えなくなりました。
進歩?誰が言えるでしょうか。 :slight_smile:

バケットURLでアクセスできるアセットを見つけ、次にCDN経由で同じアセットにアクセスする方法を見つけてください。

すみません、わかりません。しかし、バケットとCDNの違いは何ですか?

バケットとは、作成された「メインディレクトリ」であり、すべてのファイルが格納される場所です。CDNは世界中に多数のサーバーがあり、それらがバケットのコピーを取得します。バケットは、接続が作成されたときに指定したURL、たとえばcdn.example.comを使用して識別されます。

R2では、バケットにカスタムドメインを割り当てるとCDNが自動的に作成されるようです。CDNについては何もする必要がなかったので、少し混乱しました。

何かわかるか見てみます。

R2 エンドポイント URL からオブジェクトにアクセスしようとしても、うまくいかないようです。

https://7100***********dc05d4976.r2.cloudflarestorage.com/exotics-unlimited/assets/logo-815195ae.png

および

https://exotics-unlimited.7100***********dc05d4976.r2.cloudflarestorage.com/assets/logo-815195ae.png

これらは以下を返します。

この XML ファイルには、スタイル情報が関連付けられていないようです。ドキュメント ツリーを以下に示します。
<Error>
<Code>InvalidArgument</Code>
<Message>Authorization</Message>
</Error>

しかし、CDN 経由では:

![discourse](upload://4axzzMIqD328iAou0u6qv18Avo8.png)

以下を返します。
discourse
エラーが認証について言及しているため、これについて少し調べたところ、この情報を見つけました。

注意

デフォルトでは、一部のファイルタイプのみがキャッシュされます。バケット内のすべてのファイルをキャッシュするには、Cache Everything ページルールを設定する必要があります。

デフォルトのキャッシュ動作とカスタマイズ方法の詳細については、デフォルトのキャッシュ動作を参照してください。

このページから:

「キャッシュすべて」ルールを作成しましたが、変更はありませんでした。