オブジェクトストアとしてminioを使用した再構築のエラー

オブジェクトストアとしてMinioを使用する際の表示の再構築

I, [2022-09-01T00:37:48.192311 #1]  INFO -- : cd /var/www/discourse & sudo -E -u discourse bundle exec rake s3:upload_assets
rake aborted!
Aws::S3::Errors::BadRequest: '/' への HTTP リクエスト PUT の解析中にエラーが発生しました

Minioに複数のドメインを設定しました

minio.example.com (Minioアクセスコンソールとして)
s3.example.com (MinioのAPIとして)

バケット名も追加しました
bucket.s3.example.com (MinioのAPIとして)

すべてのドメインは適切に認証されており、Cyberduckを使用してs3.example.comまたはbucket.s3.example.comでアカウントに接続しようとすると、ファイルのアップロードとダウンロードが可能です。

私のapp.ymlのS3設定

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: anything
  discourse_s3_endpoint: https://s3.example.com
  DISCOURSE_S3_ACCESS_KEY_ID: *****
  DISCOURSE_S3_SECRET_ACCESS_KEY: ********
  #Discourse_s3_cdn_url: 
  DISCOURSE_S3_BUCKET: bucket
  DISCOURSE_S3_BACKUP_BUCKET: bucket/backups
  DISCOURSE_BACKUP_LOCATION: S3

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

関連する問題を検索しましたが、解決していません。Vultrオブジェクトストレージを使用する場合は正常に動作します。では、MinioとDiscourseはうまく連携しないのでしょうか。しかし、Minioを正常に使用している人も見かけました。皆さん、この問題はすぐに解決されると信じています。

「いいね!」 1

Using Object Storage for Uploads (S3 & Clones) を使用しましたか?

「いいね!」 2

はい、何度も見ましたし、Basic How-To for Using MinIO storage server run by you for your Discourse Instanceも視聴しました。

問題は解決していません。気になるのは、CyberduckのアマゾンS3転送プロトコルを使用してMinIOアカウントに接続できることで、私のMinIOの設定は問題なく機能しているように思えることです。

「いいね!」 1

MinIO クライアントやその他のメカニズムで MinIO の設定が一般的に機能することを確認しましたか?また、MinIO に対して適切な URL と設定を使用していますか?

私の提案は、まずすべてが MinIO および s3cmd コマンドラインクライアントと互換性があることを確認することです。私はこの「Cyberduck」クライアントについては聞いたことがありません(当然です。Windows と Mac 用であり、私は Linux ユーザーです)。また、それが MinIO やその他のものと互換性があることを確認できません。なぜなら、それは「AWS S3」と表示されており、Amazon の完全な S3 API 用に設計されている可能性が高く、S3 互換/適合アイテム用ではないからです。コマンドラインで、作業しようとしているボックス上またはその近くで MinIO クライアント (mcli) をセットアップし、その後、手動でバケットにファイルをプッシュしてみてください。

さらに、MinIO の DISCOURSE_S3_BACKUP_BUCKET は、既存のバケット内のサブパスではなく、独自のバケットとして設計されていることを覚えておいてください(私の知る限り)。これも現在の設定で問題を引き起こす可能性があります。そのため、私が書いた例と、あなたが提供した「ハウツー」へのリンクでは、別個のバケットとしています。

ここで不足しているのは、実際に実行された特定の要求に関する情報です。つまり、システムが BadRequest でその問い合わせを行ったときの URL パスなどです。これは、INFO レベルのログしか記録されていないためだと思われます。rake プロセス中にデバッグレベルのログを取得する方法はありますか? @pfaffman(または Discourse 側により詳しい方)

また、Discourse の設定で DISCOURSE_S3_INSTALL_CORS_RULE: false も渡すようにしてください。アプリのリビルダー/ベーカーが CORS ルールをプッシュしようとすると、エラーメッセージが表示されます。

「いいね!」 2

mcli を使用して新しいバケットを作成し、手動でファイルをバケットに送信しました。

バケットに送信されたファイルが表示されます。これは、MinIO を正しい手順でインストールしたことを意味しますか? Docker Compose と私の docker-compose.yml ファイルを使用して MinIO をインストールしました。


version: '3'

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    
    volumes:
      - ./:/data

    environment:
      MINIO_ROOT_USER: ***** 
      MINIO_ROOT_PASSWORD: *****
      MINIO_SERVER_URL: https://s3.example.com
      MINIO_BROWSER_REDIRECT_URL: https://minio.example.com/

    command: server --console-address ":9001" /data

volumes:
  minio:

次に、Web コンソールに移動し、2 つの新しいバケットを作成し、オブジェクト ストアのアクセス ポリシーをパブリックに設定します。

Nginx プロキシ マネージャーを使用して、minio.example.com をポート 9001 に、s3.example.com および bucket-name.example.com をポート 9000 に転送します。

DISCOURSE_S3_BACKUP_BUCKET:別のバケットを使用し、バケットへのドメイン名転送をポート 9000 に構成してみましたが、機能しませんでした。

どのポートを転送しますか? 80/443 で http/https が機能するようにしますか? それだけで十分です。ポート 9000 を別のポートで構成する必要は決してありません。別のバケットは s3.example.com と同じエンドポイントを持つことになります。それは別の何かではありませんので、その構成は間違っています。MinIO の用語では、パス認証を使用している場合は s3.example.com/BUCKETNAME となり、使用すべき DNS 認証の場合は、nginx 側で受け入れて内部ポート 9000 に転送する必要がある URL エンドポイントに対して BUCKET.s3.example.com となります。ただし、これは nginx 側で構成する必要はなく、MinIO 側で構成する必要があります。

MinIO クライアントは pathdns の両方のスタイル設定をサポートしています。私の知る限り、Discourse はパススタイル設定ではなく、URL ベースのメカニズムを使用しています(Discourse 開発者の方、訂正があればお願いします)。したがって、あなたが構成している「デフォルト」の動作は正しくありません。

私の MinIO は Docker 化されていませんが、Discourse に準拠するためには DNS スタイルのパスを使用する必要があります。つまり、環境変数 MINIO_DOMAIN=BASEDOMAINHERE を設定して、Discourse が使用したい DNS スタイルのパスを機能させる必要があります。あなたの例では MINIO_DOMAIN=s3.example.com となり、その後 NGINX はホストヘッダーをポート 9000 またはベースの非コンソールサーバーコンポーネントが実行されている場所にバックエンドに渡すように構成する必要があります。その後、NGINX が *.s3.example.com を受け入れて MinIO コンテナに正しく転送されるようにする必要があります。これは MinIO Federation セットアップの一部ですが、単一ノードインスタンスでベース URL に複数のバケット名がある場合でも、Discourse で機能させたい場合は適切に構成する必要があります。

残念ながら、ここで MinIO の構成を詳しく調べる必要があります。そして、私がドキュメントで指定している要件の 1 つは、完全に機能し、適切に構成された MinIO インスタンスがあることですが、これは Discourse のサイトの範囲外です。あなたの MinIO は、AWS S3 のように(たとえば bucket.s3.example.com)DNS スタイルのバケット解決用に適切に構成されておらず、そのため機能していないと考えています。

注意点として、私は Lubuntu Project (lubuntu.me)(LXQt を使用する Ubuntu のバリアント)の Discourse インスタンスを、Discourse で正しく機能させるために DNS スタイルのバケット URL 解像度 を使用する MinIO で実行しています。そうしないと、BUCKET.basedomain.example.com へのリクエストは失敗します。

面白いことに、MinIO が DNS スタイルのパス用に適切に構成されている必要があるとさえ述べています。MinIO のセットアップ中に MINIO_DOMAIN を含めなかった場合、DNS スタイルのパスは機能しません。Discourse にはこれが必要であり、私が書いた注意セクションの項目 3 に従います。

「いいね!」 2

こんにちは、兄弟。MINIO_DOMAIN を設定すると上記のエラーは解消されますが、新しいエラーが発生します。

Aws::S3::Errors::MalformedXML: 指定されたXMLは正しくフォーマットされていないか、公開されているスキーマに対して検証されませんでした。

ディスコースが私のミニオに正しくアクセスできるので、成功に近づいていると感じています。すべてのミニオバケットを削除してディスコースを再構築しようとすると、指定されたバケットが存在しないというプロンプトが表示されます。

この記事 Discover AWS Official Knowledge Center Articles | AWS re:Post を通じて、このエラーはバケットの権限によって引き起こされているのではないかと考えていますか?チュートリアル Setting up file and image uploads to S3 を通じて、バケットポリシーを追加する必要があるように見えます。


               "s3:PutObject",
               "s3:PutObjectAcl",
               "s3:PutObjectVersionAcl",
               ....

しかし、ミニオはACLをサポートしておらず、「s3:PutObjectAcl」というサポートされていないアクションをプロンプト表示します。

おそらく、物事を簡単にするために、ミニオの古いバージョンを使用する必要があるかもしれません :sweat_smile:

「いいね!」 1

問題は、app.yml を介してオブジェクトストレージ変数を追加しないことで解決します。そうしないと、MalformedXML エラーが発生します。設定に s3 パラメータを追加するだけで済みます。minio をインストールするときに MINIO_DOMAIN 変数を追加する必要があります (シングルノードデプロイメントを使用しています)。

ご協力いただいた @teward さん、ありがとうございます。

これで、ファイルをアップロードしたり、minio を使用してバックアップしたりできます。

「いいね!」 1

いいえ、MinIO は PutObjectAcl をサポートしていません。バケットレベルの権限はサポートしていますが、その形式の API では オブジェクト レベルの ACL はサポートしていません。

MinIO は完全な AWS API をサポートしていません。サポートされている API セットの完全なリストについては、AIStor Object Store Documentation を参照してください。

DNS スタイルのバケットを有効にするには MINIO_DOMAIN を追加する必要があります。これが、無効な PUT が発生する理由です。さらに進むと、スキーマで許可されているものと、XML での失敗を確認できます。MinIO が実際にサポートしているサポートされているセットでサポートされていない変数を含むポリシーを配置することは絶対に避けてください。

注意: S3 互換であるということは、サポートされているすべての AWS S3 API 変数/エンドポイント/値と 100% 一致することを意味するわけではありません。

「いいね!」 1

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.