Estou executando a versão beta mais recente e ativei o S3 para gerenciar arquivos enviados.
Os uploads em postagens funcionam bem (o arquivo é enviado para o S3 e exibido na postagem), mas agora, ao tentar fazer upload de fotos de perfil, aparecem erros de “Acesso Negado” na interface. Não há nada no log de erros do administrador.
Alguns dos meus usuários iniciais realmente conseguiram fazer upload de imagens de avatar, mas elas estão armazenadas localmente. Por exemplo, ao examinar o código-fonte:
<img alt="" width="45" height="45" src="/user_avatar/example.com/jackie/90/29_2.png" class="avatar" title="título da imagem" aria-label="Imagery/FIT">
Existe alguma maneira de migrar as imagens de perfil para o S3 e garantir que novas imagens possam ser enviadas para lá?
EDIT: Deveria ter mencionado que tenho o upload de mídia segura ativado.
Você por acaso está usando o Cloudflare? Acredito que as imagens de perfil estejam realmente armazenadas no S3, mas sejam proxyadas através do seu servidor. Eu resolvi um problema semelhante a este (todos os avatares carregados aparecendo em branco) e precisei adicionar o endereço IP do servidor à lista de permissões no Cloudflare para corrigi-lo.
Obrigado, mas não, não estou usando um CDN — estou apenas usando o S3 puro, mas com mídia segura. Não tenho certeza de como verificar se as solicitações estão sendo proxy, mas veja a saída do cabeçalho do curl abaixo:
Isso sugere para mim que não está sendo proxy, mas não sei o suficiente para ter certeza…
Essa estrutura de URL é consistente com um avatar proxy, o que é confuso (a implementação das URLs de avatar aqui no Meta é diferente das instâncias padrão do Discourse). Não consigo saber apenas pela saída do curl se há alguma informação que descarte o proxy de avatares pelo Discourse (não sou especialista).
Pela minha experiência anterior com isso, se as imagens dos posts estão sendo enviadas para o S3, então os avatares também estão, a menos que se esteja fazendo algo bastante personalizado. Ainda não tentei uploads de mídia segura nem o uso do S3 sem uma CDN, então essas configurações podem fazer uma diferença significativa.
Seria bom tentar fazer o upload de um novo avatar e confirmar se você consegue encontrar o arquivo no seu armazenamento local ou no bucket do S3.
Minha suposição é que algo como o IP do servidor precisar ser incluído na lista de permissões do S3. Não sou especialista, então espero que alguém mais possa contribuir.
O problema é que os uploads para o S3 funcionam para posts, mas não para uploads de imagens de avatar. Minha suspeita é de que os únicos usuários que possuem avatares são aqueles que fizeram upload de imagens antes da configuração do S3, mas não consigo confirmar isso.
Tive um problema semelhante: as imagens das postagens funcionavam, mas as imagens de perfil não eram exibidas. Os uploads para o S3 foram bem-sucedidos em ambos os casos, mas houve um problema na exibição (o IP do servidor foi limitado/bloqueado).
Posso confirmar que, ao tentar fazer upload de um avatar, a barra de progresso atualiza e chega a 100%, mas só então exibe “Erro: Acesso Negado”.
Ao verificar o console do JS, recebo o erro:
https://discourse.psy.plymouth.ac.uk/uploads.json?client_id=0a2569993a6b43d6b5f8c60fdd2c913e
Falha ao carregar recurso: o servidor respondeu com status 422 ()
E, se eu acessar essa URL:
{"errors":["A URL ou recurso solicitado não pôde ser encontrado."],"error_type":"not_found"}
Ao verificar o bucket S3, nada foi salvo na pasta ‘Originals’.
Isso contrasta com a situação em que faço upload de uma imagem em uma postagem: nesse caso, tudo funciona corretamente, a imagem aparece no bucket S3 e também é gerada como miniatura/otimizada.
O status HTTP 422 é, aparentemente, ‘unprocessable entity’. Isso sugere que o Discourse não está gostando do upload por algum motivo, mas pode ser outra coisa — acho que o 422 basicamente significa apenas ‘a requisição foi formada corretamente, mas algo nela está errado’.
A imagem que você está tentando fazer o upload é um tipo incomum ou talvez seja uma imagem gigantesca?
Você já tentou incluir esse arquivo de imagem exato em uma postagem?
O avatar (por padrão) é redimensionado para vários tamanhos diferentes, então isso pode ser onde está falhando por algum motivo, por exemplo, atingindo um limite de memória se a imagem for gigantesca. Isso é apenas especulação, porém.
Não acho que esperaria ver um 422 vindo do S3, e ele não está listado nas respostas de erro na referência da API deles, então acredito que o problema está ocorrendo no Discourse antes de chegar ao ponto de tentar fazer o upload para o S3.
Com certeza tem a ver com o tratamento de imagens de avatar. Acabei de tentar novamente com a mesma imagem (usando o cliente móvel iOS desta vez) e ela carrega sem problemas dentro de uma postagem, mas apresenta o mesmo erro de acesso negado ao usar a mesma imagem como avatar.
Alguém mais que usa S3 com mídia segura consegue replicar o erro? Poderia ser algo relacionado às permissões do bucket, já que o upload para uma postagem funciona?