Erro na reconstrução usando minio como armazenamento de objetos

Reconstruir exibição ao usar minio como armazenamento de objetos

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: Ocorreu um erro ao analisar a solicitação HTTP PUT em '/'

Configurei vários domínios para minio

minio.example.com (como console de acesso minio)
s3.example.com (como API do minio)

Também adicionei o nome do bucket
bucket.s3.example.com (como API do minio)

Todos os domínios são devidamente credenciados e a tentativa de conectar à conta usando Cyberduck usando s3.example.com ou bucket.s3.example.com está disponível para upload e download de arquivos.

Minhas configurações s3 do 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

Pesquisei problemas relacionados e não os resolvi, funciona bem se usar o armazenamento de objetos vultr. Então, é que minio e discourse não funcionam bem juntos, mas já vi pessoas usando minio com sucesso. Pergunto a todos, acredito que este problema será resolvido em breve.

1 curtida

Você seguiu Usando Armazenamento de Objetos para Uploads (S3 e Clones)?

2 curtidas

Sim, assisti várias vezes e também assisti Guia básico para usar o servidor de armazenamento MinIO executado por você para sua instância do Discourse

O problema não foi resolvido, o que me incomoda é que a conexão com a conta minio usando o protocolo de transporte amazon s3 do Cyberduck está disponível e acho que minhas configurações do minio parecem estar funcionando bem.

1 curtida

Você confirmou que sua configuração do MinIO funciona em geral com outros mecanismos, como o cliente MinIO ou o ? E que você está usando os URLs e a configuração corretos contra o MinIO?

Minha sugestão é garantir que tudo esteja em conformidade com os clientes de linha de comando MinIO e s3cmd primeiro - eu nunca ouvi falar desse cliente “Cyberduck” (por um bom motivo: é Windows e Mac, eu sou um cara do Linux), e não posso confirmar que ele está em conformidade com o MinIO e outras coisas, pois diz “AWS S3” em seu item e provavelmente foi projetado para a API S3 completa da Amazon, não para itens compatíveis/conformes com S3. Configure o cliente minio (mcli) na linha de comando na caixa onde você está tentando trabalhar ou perto dela e, em seguida, tente enviar um arquivo manualmente para seus buckets.

Além disso, lembre-se de que DISCOURSE_S3_BACKUP_BUCKET com MinIO é projetado para ser seu próprio bucket, não um subcaminho dentro de um bucket existente (pelo que sei). É possível que isso também quebre coisas na configuração atual, é por isso que o exemplo que escrevi e o link para o meu “Como fazer” que você forneceu o têm como um bucket separado.

O que não tenho aqui são informações sobre a solicitação específica que foi feita - o caminho do URL, etc. que foi usado pelo sistema quando ele fez essa consulta com o BadRequest. Parece que é porque é apenas um log de nível INFO. Não há como obter um nível de depuração de log durante o processo rake, certo @pfaffman (ou outros que são mais familiarizados com o lado do Discourse)?

ALÉM DISSO, certifique-se de também passar DISCOURSE_S3_INSTALL_CORS_RULE: false para sua configuração do Discourse - se o reconstrutor/padeiro do aplicativo tentar enviar regras CORS, isso resultará em uma mensagem de erro.

2 curtidas

Criei um novo bucket usando mcli e enviei manualmente um arquivo para o bucket

Vejo o arquivo enviado no bucket, isso significa que instalei o minio com os passos corretos? Instalei o minio usando docker compose e meu arquivo 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:

Em seguida, acesse o console web, crie dois novos buckets e defina a política de acesso para o object store como pública

Uso o Nginx proxy manager para encaminhar minio.example.com para a porta 9001 e s3.example.com e bucket-name.example.com para a porta 9000

DISCOURSE_S3_BACKUP_BUCKET: Tentei usar um bucket separado e configurei o encaminhamento de nome de domínio para a porta 9000 para o bucket, mas não funciona

Encaminhar quais portas? 80/443 para que http/https funcionem? Isso é tudo que precisa, você NUNCA deve configurar a porta 9000 em uma porta separada. O bucket separado terá o mesmo endpoint que s3.example.com - não é algo separado, então você está configurando ISSO errado. Não se esqueça também que, no jargão do MinIO, se você estiver usando autenticação de caminho, você acabará com s3.example.com/NOME_DO_BUCKET ou com autenticação DNS como você deveria usar BUCKET.s3.example.com para os endpoints de URL que você precisa aceitar no lado do nginx e encaminhar para a porta interna 9000. Você não precisa configurar isso do seu lado, isso precisa ser configurado do lado do MinIO.

O cliente MinIO suporta configuração no estilo path e dns. Pelo que sei, o Discourse usa um mecanismo baseado em URL para identificação de bucket, não configurações de estilo de caminho (sinta-se à vontade para me corrigir, desenvolvedores do Discourse). Portanto, o comportamento ‘padrão’ que você está configurando está incorreto.

Agora, meu MinIO não está em docker, mas para estar em conformidade aqui com o Discourse, você precisa usar o roteamento no estilo DNS, ou seja, você precisa adicionar na variável de ambiente MINIO_DOMAIN=BASEDOMAINHERE para que o roteamento no estilo DNS que o Discourse quer usar funcione. No seu exemplo seria MINIO_DOMAIN=s3.example.com e então seu NGINX precisaria ser configurado para passar o cabeçalho Host para o backend na porta 9000 ou onde quer que os componentes base do servidor não-console sejam executados. Você então precisa garantir que o NGINX aceite para *.s3.example.com e o encaminhe corretamente para o contêiner MinIO. Isso faz parte da configuração de Federação do MinIO, mas para instâncias de nó único com vários nomes de bucket em uma URL base, você precisa garantir que esteja configurado corretamente de qualquer maneira se quiser que funcione com o Discourse.

Infelizmente, porém, é aqui que você tem que começar a se aprofundar nas configurações do MinIO. E um dos pré-requisitos que especifico no documento é que você tenha uma instância MinIO totalmente funcional e configurada corretamente, o que está além do escopo do site do Discourse. Acredito que seu MinIO não está configurado corretamente para resolução de bucket no estilo DNS como a AWS S3 faz (bucket.s3.example.com, por exemplo) e, como tal, não funciona.

Note que eu executo a instância do Discourse para o Lubuntu Project (lubuntu.me) (uma variante do Ubuntu que usa LXQt) usando um MinIO com resolução de URL de bucket no estilo DNS para que funcione corretamente com o Discourse, caso contrário, uma solicitação para BUCKET.basedomain.example.com falharia.

Curiosidade, eu até afirmo que você precisa que seu MinIO esteja configurado corretamente para caminhos no estilo DNS, se você não incluiu o MINIO_DOMAIN durante a configuração do MinIO, ele não fará caminhos no estilo DNS. O que ele precisa aqui para o Discourse, de acordo com o item 3 na seção de ressalvas que escrevi:

2 curtidas

Oi mano, configurar o MINIO_DOMAIN faz os erros acima desaparecerem, mas novos aparecem

Aws::S3::Errors::MalformedXML: O XML que você forneceu não estava bem formado ou não validou contra nosso esquema publicado.

Sinto que estou prestes a ter sucesso, porque o discourse pode acessar meu minio corretamente, tento excluir todos os buckets do minio, reconstruo o discourse, ele solicitará que o bucket especificado não existe

Através deste artigo Discover AWS Official Knowledge Center Articles | AWS re:Post Acho que este erro é causado por permissões de bucket? Através do tutorial Configurando uploads de arquivos e imagens para S3 vi que parece que preciso adicionar uma Política de Bucket


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

Mas o minio não suporta ACL, solicita ação não suportada ‘s3:PutObjectAcl’.

Talvez eu precise usar uma versão mais antiga do minio, o que pode facilitar as coisas :sweat_smile:

1 curtida

O problema é resolvido não adicionando variáveis de armazenamento de objetos via app.yml. Caso contrário, ocorrerá um erro MalformedXML, basta adicionar o parâmetro s3 às configurações. A variável MINIO_DOMAIN precisa ser adicionada ao instalar o minio (estou usando implantação de nó único).

Obrigado @teward pela sua ajuda

agora posso fazer upload de arquivos e backup usando minio

1 curtida

Não, o MinIO não suporta PutObjectAcl. Ele suporta permissões em nível de bucket, mas não ACLs em nível de objeto nessa forma da API.

O MinIO NÃO suporta a API completa da AWS. Veja AIStor Object Store Documentation para o conjunto completo de APIs suportadas.

MINIO_DOMAIN precisa ser adicionado para que buckets no estilo DNS ocorram, e é por isso que o PUT inválido acontece. Assim que avançarmos, veremos as falhas no XML em relação ao que é permitido nos esquemas. Certifique-se de NUNCA colocar qualquer política que tenha variáveis não suportadas no conjunto suportado que o MinIO realmente suporta.

Lembre-se: compatível com S3 NÃO significa que seja uma correspondência de 100% para todas as variáveis/endpoints/valores da API AWS S3 suportados.

1 curtida

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