Imagens quebradas e seus URLs S3

@schleifer Ei, podemos ter um guia após isso, por favor?

OK, isso é algo com o que podemos trabalhar. Primeiro, mova todos os arquivos de /default/* para /original/1X/*.

Isso é conhecido por nós, mas não pelo banco de dados. A próxima etapa ajustará o caminho para todos os uploads no banco de dados. Antes de alterarmos qualquer outra coisa, vamos fazer uma verificação de sanidade.

Inicie um console do banco de dados:

cd /var/discourse
./launcher enter
rails db

Execute esta consulta para analisar o resultado:

select id,url from uploads where id > 0 and url not like '//PREFIX/original/%'

Você precisará substituir PREFIX por BUCKET + ‘.s3.dualstack.’ + REGION + ‘.amazonaws.com’, o que resultaria em algo como //pesioforum.s3.dualstack.us-west-2.amazonaws.com/original/%.

Isso deveria retornar (0 rows). Se não retornar, teremos etapas extras.

Há 7 uploads para sua consulta e nenhum deles é do S3.
Então, todos os links do S3 apontam apenas para o original, certo? Os 7 uploads são de antes de começarmos a usar o S3 para uploads (outubro de 2018).

Dos links do S3 (2614),
2368 usam //pesioforum.s3.dualstack.ap-south-1.amazonaws.com
246 usam //pesioforum.s3.ap-south-1.amazonaws.com

Ambos os links funcionam, apenas mencionando isso aqui, pois pode afetar qualquer expressão regular que possamos usar.

@schleifer Por favor, ajude-nos a terminar isso. :smiling_face:

OK, então você deve estar liberado para mover arquivos de /default/ para /original/1X.

Você pode migrar esses arquivos para o S3 executando rake s3:upload_assets

O endpoint dualstack funciona para IPv6 e IPv4. O outro é apenas para IPv4.

Há um script na imagem para remapear strings no banco de dados. Antes de executá-lo, SEMPRE FAÇA UM BACKUP via /admin/backups (Menu hambúrguer → Admin → Backups).

Isso deve corrigir os 246:

discourse remap '//pesioforum.s3.ap-south-1.amazonaws.com/original/' '//pesioforum.s3.dualstack.ap-south-1.amazonaws.com/original/'

Após mover tudo de /default/ para /original/1X/, podemos remapear esses arquivos no banco de dados. Mas antes disso, devemos garantir que tudo em /original/2X esteja realmente lá.

Essa consulta retorna o mesmo número de linhas que a contagem de objetos reais sob esse caminho no bucket?:
select url from uploads where url like '//pesioforum.s3.dualstack.us-west-2.amazonaws.com/original/2X/%'

Olá @schleifer

Você pode migrar esses arquivos para o S3 executando rake s3:upload_assets

Executei isso e os ativos (js, css, etc.) do site foram carregados. Os 7 arquivos não foram carregados.
Encontrei rake uploads:migrate_to_s3, mas gostaria de confirmar se essa é a tarefa correta para isso.

Existe um script na imagem para remapear strings no banco de dados

Isso funcionou bem e não há mais links antigos não dualstack na tabela uploads.

Mas, antes disso, devemos garantir que tudo em /original/2X esteja realmente lá.

Infelizmente, não é esse o caso. Há 521 arquivos no bucket S3, mas 2186 registros na tabela uploads.
Testei alguns arquivos que não estão em /original/2X/ como necessário e todos estão em /default/.

Exemplo: Da tabela uploads,
https://pesioforum.s3.dualstack.ap-south-1.amazonaws.com/original/2X/8/806a660beb158e9f06d07ffcd2370b389bbd250b.jpeg não existe, mas o mesmo arquivo está em
https://pesioforum.s3.dualstack.ap-south-1.amazonaws.com/default/806a660beb158e9f06d07ffcd2370b389bbd250b.jpeg

Neste ponto, como uma solução única, estamos confortáveis em apenas mover todos os arquivos de /original/2X/{}/ para /original/1X/ e atualizar os posts, etc., com os novos links.
Novos uploads estão sendo colocados corretamente em 2X de qualquer forma.

Aha, sim, essa foi a que eu realmente pretendia. Ela deve enviar esses últimos sete.

De fato, essa é a melhor opção neste momento. Copie todos os arquivos do subprefixo /2X/ e mova tudo para /1X/.

Depois que tudo estiver no lugar, aqui está um comando que deve atualizar todas as entradas do banco de dados:

discourse remap --regex "//pesioforum\.doublestack\.s3\.ap-south-1\.amazonaws\.com/original/[1234]X/([0-9a-f]/){0,}" "//pesioforum.doublestack.s3.ap-south-1.amazonaws.com/original/1X/"

(Lembre-se do aviso anterior sobre fazer um backup.)

Depois disso, alguns posts podem precisar que a versão HTML seja reconstruída pelo menu da chave inglesa. Se houver mais do que alguns, você pode reconstruir tudo com rake posts:rebake.

@schleifer funcionou! Com uma regex modificada e um rebake de todas as postagens, a maioria das imagens e uploads está funcionando bem.
Há algumas imagens (que não são postagens) que ainda linkam para /optimized/, mas podemos corrigir isso manualmente. Ex: logotipos em diferentes temas, etc.

Muito obrigado pela sua ajuda!

Olá, também enfrentamos um problema semelhante ao seu em nosso ambiente e gostaríamos de contar com ajuda para resolvê-lo.

Nosso problema é semelhante ao seu em vários aspectos:

  1. Temos o mesmo valor listado em s3 upload bucket e s3 backup bucket.
  2. Encontramos esse problema ao atualizar o Discourse:
Versão antiga: v2.3.0.beta3
Nova versão: v2.5.0.beta6
  1. Acessei o contêiner do Discourse e consultei o banco de dados:
SELECT id,url FROM uploads where id > 0 and url not like '//acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/%';
 id |                                                url
----+----------------------------------------------------------------------------------------------------
  1 | /uploads/default/original/1X/eb17xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc33.png
  2 | /uploads/default/original/1X/b87fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv21.png
 78 | //acme-forum.s3-us-west-2.amazonaws.com/original/1X/1205xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv045.png
(3 linhas)
  1. Acessei novamente o contêiner do Discourse e consultei o banco de dados:
select url from uploads where url like '//acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/3X/%';
 //acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/3X/6/2/6267xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf607c.jpeg
(7953 linhas)
  1. Verifiquei quantos itens existem em ./original/3X/; a resposta foi 251 itens.

Perguntas:

  1. Estamos usando dualstack e não quero remapear nossas URLs para não usá-lo.
  2. Nossa estrutura de pastas é diferente; temos coisas como 3X/X/Y (por exemplo: 3X/7/a). Então, como posso mover tudo de default para 3X/* se ainda assim não mapeará corretamente?

Minha ideia atual é escrever um script que use a saída do Passo 4 para descobrir onde mover o arquivo de volta para a pasta ./original/3X/X/Y.

O único problema é que, quando fiz isso, o dualstack ainda não havia hospedado esse arquivo. O que quero dizer é que, ao substituir o arquivo em original/3X/X/Y, consigo vê-lo ao acessar:
Quebrado https://acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/3X/6/b/6b6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa001.png

Funciona https://acme-forum.s3-us-west-2.amazonaws.com/original/3X/6/b/6b6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa001.png

Atualização: descobri que o endpoint dualstack nunca esteve quebrado como eu pensei; cometi um erro ao copiar originalmente o arquivo de imagem para ./original/3X/6/b, onde esqueci de permitir a leitura pública.

Portanto, minha pergunta é:
Seria uma opção viável para mim mover os arquivos de imagem de ./default de volta para ./original/3X/x/y e, em seguida, não modificar o banco de dados de forma alguma?

Ok, então tenho uma atualização.
Parece que consigo prever onde as imagens ./original devem ser colocadas, mas não sei como corrigir as imagens ./optimized.

No nosso fórum, se você navegar até uma das nossas postagens, ele tenta exibir a imagem ./optimized.

Existe alguma maneira de saber qual é uma imagem optimized?

Minha ideia é que as imagens otimizadas terminam com _2_10x10.png. Seria essa uma suposição razoável? Se for o caso, seria uma solução viável usar um script para copiar qualquer coisa que contenha algo como _2_10x10.png para a pasta optimized e tudo o que não tiver, direto para a pasta ./original?

exemplo:

GET https://acme-forum.s3.dualstack.us-west-2.amazonaws.com/optimized/3X/c/c/ccaxxxxxxxxxxxxxxxxxxxxxxxxxxxx85_2_690x268.png
[HTTP/1.1 403 Forbidden 0ms]

Obrigado!

@41821 Se as URLs na tabela uploads estiverem corretas e funcionando, mas as postagens ainda tentarem carregar as imagens otimizadas, limpar a tabela optimized_images e refazer todas as postagens deve resolver: discourse=> delete from optimized_images;

Muito obrigado pelo feedback! Na verdade, acabei resolvendo (se é que se pode chamar assim) escrevendo um script para mover a imagem do diretório /default de volta para /optimized com base no nome do arquivo. Isso parece ter funcionado e não tenho mais nenhum problema.

Se isso acontecer novamente no futuro, farei o que você sugeriu: excluirei tudo de optimized_images e refarei o bake.

Obrigado!