Erreur lors de la reconstruction avec minio comme magasin d'objets

Reconstruire l’affichage lors de l’utilisation de minio comme magasin d’objets

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: Une erreur s'est produite lors de l'analyse de la requête HTTP PUT à '/'.

J’ai configuré plusieurs domaines pour minio

minio.example.com (comme console d’accès minio)
s3.example.com (comme API de minio)

J’ai également ajouté le nom du bucket
bucket.s3.example.com (comme API de minio)

Tous les domaines sont correctement authentifiés et j’essaie de me connecter au compte en utilisant Cyberduck avec s3.example.com ou bucket.s3.example.com est disponible pour le téléchargement et le téléversement de fichiers.

Mes paramètres s3 pour app.yml

  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

J’ai recherché les problèmes connexes et je n’ai pas résolu le problème, cela fonctionne bien si j’utilise le stockage d’objets vultr. Alors, est-ce que minio et discourse ne fonctionnent pas bien ensemble, mais j’ai vu des gens utiliser minio avec succès. Je demande à tout le monde, je crois que ce problème sera bientôt résolu.

1 « J'aime »

Avez-vous suivi Utilisation du stockage d’objets pour les téléchargements (S3 et clones) ?

2 « J'aime »

Oui, je l’ai regardé plusieurs fois et j’ai aussi regardé Comment utiliser le serveur de stockage MinIO que vous gérez pour votre instance Discourse

Le problème n’a pas été résolu, ce qui me dérange, c’est que la connexion au compte minio en utilisant le protocole de transport amazon s3 de Cyberduck est disponible et je pense que mes paramètres minio semblent fonctionner correctement.

1 « J'aime »

Avez-vous confirmé que votre configuration MinIO fonctionne en général avec d’autres mécanismes tels que le client MinIO ou le ? Et que vous utilisez les bonnes URL et la bonne configuration pour MinIO ?

Ma suggestion est de vous assurer d’abord que tout est conforme aux clients en ligne de commande MinIO et s3cmd. Je n’ai jamais entendu parler de ce client “Cyberduck” (pour une bonne raison : il est pour Windows et Mac, je suis un utilisateur Linux), et je ne peux pas confirmer qu’il est conforme à MinIO et à d’autres choses car il indique “AWS S3” sur son interface et est probablement conçu pour l’API S3 complète d’Amazon, pas pour des éléments conformes/compatibles S3. Installez le client minio (mcli) en ligne de commande sur ou près de la machine avec laquelle vous essayez de travailler, puis essayez de pousser un fichier manuellement vers vos buckets.

De plus, gardez à l’esprit que DISCOURSE_S3_BACKUP_BUCKET avec MinIO est conçu pour être son propre bucket, pas un sous-chemin dans un bucket existant (à ma connaissance). Il est possible que cela pose également des problèmes dans la configuration actuelle, c’est pourquoi l’exemple que j’ai écrit et le lien vers mon “Comment faire” que vous avez fourni le présentent comme un bucket séparé.

Ce qui me manque ici, ce sont des informations sur la requête spécifique qui a été faite - le chemin de l’URL, etc. qui a été utilisé par le système lorsqu’il a fait cette demande avec le BadRequest. Il semble que ce soit parce que le journal est seulement au niveau INFO. Il n’y a aucun moyen d’obtenir un niveau de journalisation de débogage pendant le processus rake, n’est-ce pas @pfaffman (ou d’autres qui connaissent mieux le côté Discourse) ?

AUSSI, assurez-vous de passer également DISCOURSE_S3_INSTALL_CORS_RULE: false pour votre configuration Discourse - si le reconstructeur/baker d’applications essaie de pousser des règles CORS, cela entraînera un message d’erreur.

2 « J'aime »

J’ai créé un nouveau bucket en utilisant mcli et j’ai envoyé manuellement un fichier dans le bucket

Je vois le fichier envoyé dans le bucket, cela signifie-t-il que j’ai installé minio en suivant les bonnes étapes ? J’ai installé minio en utilisant docker compose et mon fichier docker-compose.yml


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:

Ensuite, allez dans la console web, créez deux nouveaux buckets et définissez la politique d’accès pour le magasin d’objets sur public

J’utilise Nginx proxy manager pour rediriger minio.example.com vers le port 9001 et s3.example.com ainsi que bucket-name.example.com vers le port 9000

DISCOURSE_S3_BACKUP_BUCKET : J’ai essayé d’utiliser un bucket séparé et configuré la redirection du nom de domaine vers le port 9000 pour le bucket, mais cela ne fonctionne pas

Rediriger quels ports ? 80/443 pour que http/https fonctionne ? C’est tout ce dont il a besoin, vous ne devriez JAMAIS avoir à configurer le port 9000 sur un port séparé. Le bucket séparé aura le même endpoint que s3.example.com - ce n’est pas quelque chose de séparé, donc vous configurez CELA mal. N’oubliez pas non plus que dans le langage MinIO, si vous utilisez l’authentification par chemin, vous obtiendrez s3.example.com/BUCKETNAME ou avec l’authentification DNS comme vous devriez l’utiliser BUCKET.s3.example.com pour les endpoints d’URL que vous devez accepter côté nginx et rediriger vers le port interne 9000. Vous n’avez pas besoin de configurer cela de votre côté, cela doit être configuré du côté de MinIO.

Le client MinIO prend en charge la configuration de style path et dns. À ma connaissance, Discourse utilise un mécanisme basé sur les URL pour l’identification des buckets, pas des configurations de style chemin (n’hésitez pas à me corriger, développeurs de Discourse). Par conséquent, le comportement ‘par défaut’ que vous configurez est incorrect.

Maintenant, mon MinIO n’est pas dockerisé, mais pour être conforme ici avec Discourse, vous devez utiliser le style de chemin DNS, c’est-à-dire que vous devez ajouter dans la variable d’environnement MINIO_DOMAIN=BASEDOMAINHERE afin que le style de chemin DNS que DIscourse veut utiliser fonctionne. Dans votre exemple, ce serait MINIO_DOMAIN=s3.example.com, puis votre NGINX devrait être configuré pour passer l’en-tête Host au backend sur le port 9000 ou là où les composants serveur de base non-console s’exécutent. Vous devez ensuite vous assurer que NGINX accepte pour *.s3.example.com et le redirige correctement vers le conteneur MinIO. Cela fait partie de la configuration de la fédération MinIO, mais pour les instances à nœud unique avec plusieurs noms de buckets sur une URL de base, vous devez vous assurer qu’elle est correctement configurée de toute façon si vous voulez qu’elle fonctionne avec Discourse.

Malheureusement, c’est là que vous devez commencer à plonger dans les configurations de MinIO. Et l’une des exigences que je spécifie dans le document est que vous avez une instance MinIO entièrement fonctionnelle et correctement configurée, ce qui est au-delà de la portée du site de Discourse. Je pense que votre MinIO n’est pas correctement configuré pour la résolution de buckets de style DNS comme le fait AWS S3 (bucket.s3.example.com par exemple) et qu’en tant que tel, il ne fonctionne pas.

Notez que j’exécute l’instance Discourse pour le projet Lubuntu (lubuntu.me) (une variante d’Ubuntu qui utilise LXQt) en utilisant un MinIO avec résolution d’URL de buckets de style DNS afin qu’il fonctionne correctement avec Discourse, sinon une requête pour BUCKET.basedomain.example.com échouerait.

Fait amusant, j’indique même que vous avez besoin que votre MinIO soit correctement configuré pour les chemins de style DNS. Si vous n’avez pas inclus MINIO_DOMAIN lors de la configuration de MinIO, il n’utilisera pas les chemins de style DNS. Ce dont il a besoin ici pour Discourse, conformément au point 3 de ma section d’avertissements que j’ai écrite :

2 « J'aime »

Salut frangin, configurer MINIO_DOMAIN fait disparaître les erreurs ci-dessus, mais de nouvelles apparaissent

Aws::S3::Errors::MalformedXML: Le XML que vous avez fourni n'était pas bien formé ou n'a pas été validé par rapport à notre schéma publié.

Je sens que je vais réussir, car discourse peut accéder correctement à mon minio, j’essaie de supprimer tous les buckets minio, de reconstruire discourse, il me demandera que le bucket spécifié n’existe pas

Via cet article Discover AWS Official Knowledge Center Articles | AWS re:Post Je pense que cette erreur est causée par les permissions du bucket ? Via le tutoriel Configuration des téléchargements de fichiers et d’images vers S3 J’ai vu qu’il semble que je doive ajouter une politique de bucket


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

Mais minio ne prend pas en charge Acl, il signale une action non prise en charge ‘s3:PutObjectAcl’.

Peut-être, je devrai utiliser une ancienne version de minio, ce qui pourrait faciliter les choses :sweat_smile:

1 « J'aime »

Le problème est résolu en n’ajoutant pas les variables de stockage d’objets via app.yml. Sinon, une erreur MalformedXML se produira, ajoutez simplement le paramètre s3 aux paramètres. La variable MINIO_DOMAIN doit être ajoutée lors de l’installation de minio (j’utilise un déploiement sur un seul nœud).

Merci @teward pour votre aide

maintenant, je peux télécharger des fichiers et sauvegarder en utilisant minio

1 « J'aime »

Non, MinIO ne prend pas en charge PutObjectAcl. Il prend en charge les autorisations au niveau du compartiment mais pas les ACL au niveau de l’objet sous cette forme de l’API.

MinIO ne prend PAS en charge l’intégralité de l’API AWS. Voir AIStor Object Store Documentation pour l’ensemble des API entièrement prises en charge.

MINIO_DOMAIN doit être ajouté pour que les compartiments de style DNS se produisent, c’est pourquoi le PUT invalide se produit. Une fois que nous avançons, nous constatons les échecs dans le XML par rapport à ce qui est autorisé dans les schémas. Assurez-vous de ne JAMAIS mettre en place de politique comportant des variables non prises en charge dans l’ensemble pris en charge que MinIO prend réellement en charge.

Rappelez-vous : S3-compatible ne signifie PAS qu’il s’agit d’une correspondance à 100 % pour toutes les variables/points de terminaison/valeurs de l’API AWS S3 pris en charge.

1 « J'aime »

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