Reassarar posts antigos não obtém nova URL do CDN S3 após renomear bucket S3

Após instalar o Discourse (2.7.0.beta1) e importar posts antigos do Google Groups, adicionei a configuração de bucket/chave do S3 (mas sem URL de CDN) e executei

rake uploads:migrate_to_s3

que parecia estar funcionando muito bem. Todas as imagens foram enviadas para o S3 e o Discourse tentava acessá-las por meio de uma URL do S3 gerada automaticamente — algo como

https://ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

Depois, renomeei o bucket (para ortus-discourse-uploads) e configurei uma distribuição do Cloudfront na frente dele, com um CNAME configurado no Cloudflare chamado

https://communitycdn.ortussolutions.com/

O CNAME, o Cloudfront e o S3 estão todos funcionando perfeitamente. URLs como esta servem corretamente uma das imagens do bucket:

https://communitycdn.ortussolutions.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

No entanto, o problema é que o Discourse está completamente travado no antigo domínio ortus-discourse.s3.dualstack.us-west-2.amazonaws.com (que não funciona devido à renomeação do bucket) e, não importa quantas vezes eu reconstrua o contêiner ou reasse os posts antigos, não consigo, de forma alguma, fazer o Discourse usar a nova URL de CDN. Pesquisei no Google por um dia sobre isso e reassei provavelmente uma dúzia de vezes (dentro do contêiner app) com várias configurações. Cada tópico do fórum dá o mesmo conselho — reconstruir e reassar —, mas não está funcionando.

Não são apenas as imagens nos posts que estão quebradas; até mesmo o <link rel="icon" type="image/png" href=""> e o logotipo do site estão presos ao domínio antigo e não estão usando a URL de CDN do S3.

Aqui estão minhas configurações atuais do S3.

  DISCOURSE_S3_ACCESS_KEY_ID: '********'
  DISCOURSE_S3_SECRET_ACCESS_KEY: '******'
  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_ENABLE_S3_UPLOADS: true
  DISCOURSE_S3_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_UPLOAD_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_BACKUP_BUCKET: 'ortus-discourse-backups'
  DISCOURSE_S3_REGION: 'us-west-2'
  DISCOURSE_S3_CDN_URL: https://communitycdn.ortussolutions.com

  DISCOURSE_CDN_URL: https://community.ortussolutions.com

Até tentei remapear a URL antiga para a nova nos posts, assim:

rake posts:remap["ortus-discourse.s3.dualstack.us-west-2.amazonaws.com","communitycdn.ortussolutions.com"]

mas o comando informou que 0 posts foram afetados.

Em lugar nenhum das minhas variáveis de ambiente ou configurações do banco de dados há qualquer referência ao nome antigo do bucket ortus-discourse, então não consigo entender de onde o Discourse está obtendo essa informação. Sou novo no Discourse e não sou desenvolvedor Ruby, então não investiguei além do que consigo ver no meu app.yml, na interface administrativa e na saída dos comandos rake que encontrei nos fóruns.

Qual é o valor dessas uploads na tabela Uploads?

./launcher enter app
rails c
Upload.all.sample(10).pluck(:url)

@Falco Obrigado pela resposta. Aqui está a saída desse comando.

root@discourse-app:/var/www/discourse# rails c
Upload.all.sample(10).pluck(:url)
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/52b3aff4e63a7e38bef42d469bafd1ed7c1cc1a2.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f90374a280a4681332bcd2191b8de43462f8776.png",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/29691fba566fc998a966aa93859753e3cf0b8528.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6ae912ced40d60adc1356c1d7acf144b0fa0985a.jpeg",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/4dfe5b48fc8cb5d79880d70355c34d7ed02be812.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/897c4b4e755c1c8e93224a27187dc631a02e4388.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/59886f322e6834b567d473138108fab6e0f33764.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/e3e3429d63155cf0d850e161846d187bc6f273ea.jpeg",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/1b701869b4b235daa8d6a9a7728766f3b4e69814.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/c83aaee941462d47ef91f0c6448257d07487b231.png"]
[2] pry(main)>

Então, há realmente vários arquivos com o antigo bucket.

O remapeamento que você precisa deve ser:

./launcher enter app
rails c
DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")

Faça um backup antes, pois não há como desfazer essa operação.

@Falco Obrigado novamente. Executei dois remaps:

DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")
DbHelper.remap("ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")

Reconstruí a imagem e isso corrigiu itens como o logotipo do cabeçalho do site. Estou rebaking todas as postagens novamente para ver se isso corrige as imagens das postagens, mas isso levará algum tempo.


Então, enquanto aguardamos o rebake, o que deu errado aqui? Isso é um bug no Discourse em que meus uploads ficaram presos na URL antiga e não mudaram para usar a nova?

Li postagens como esta que falavam sobre alterar uma URL de CDN, mas elas apenas mencionavam substituir strings nas postagens (o que não funcionou) e não mencionavam o remap do DBUtil. How do I change the legacy CDN URLs of images in posts?

Até tentei executar novamente o script rake de importação para o S3, mas recebi um erro (desculpe, não anotei no momento).

Até encontrei um script rake migrate_from_s3 que quase executei para ver se poderia começar do zero, mas então encontrei uma postagem no fórum aqui indicando que isso arruinaria meu banco de dados se eu o executasse, então deixei de lado.

Estou sem saber o que deveria ter feito de diferente ou qual postagem no fórum teria respondido isso para mim. (Eu realmente tentei muito resolver isso por conta própria antes de postar aqui!)

Infelizmente, o rebake não parece ter corrigido as imagens incorporadas nas postagens. O interessante é que, ao selecionar uma postagem antiga e editá-la, vejo a imagem representada mais ou menos assim:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

mas ao visualizar a postagem, há apenas um grande espaço vazio que aponta para

https://community.ortussolutions.com/images/transparent.png

Essa é uma mudança relativamente recente. Na maior parte de ontem, essas imagens apontavam simplesmente para o antigo URL incorreto do S3, mas em algum momento ontem à noite ou hoje, o PNG transparente começou a aparecer.

Hmmmm, isso não é o que eu disse para você fazer na minha resposta :face_with_raised_eyebrow:

Na tabela de uploads, esperamos o local do S3, e ele só é substituído pelo CDN durante o processo de “cozimento” (cook process) do Markdown.

Você colocou o CDN na tabela de Uploads, e não é assim que o software normalmente funciona.

Desculpe por isso. Eu assumi que você apenas não leu o OP com atenção suficiente para ver que eu mencionei a distribuição do Cloudflare e que precisava ajustá-la para usar minha URL real. Não percebi que a URL indesejada estava, na verdade, armazenada em algum lugar no banco de dados. Quase respondi e perguntei se era isso que você queria dizer, mas parecia óbvio o que eu precisava fazer.

Sem problemas, posso facilmente remapeá-las de volta para a URL do S3. Esta é uma instalação nova do Discourse e todo o conteúdo carregado está no mesmo lugar, então é fácil de trocar.

Minhas perguntas sobre o que deu errado na minha postagem anterior ainda se mantêm.

Acredito que seja tão simples quanto o fato de não suportarmos a alteração do bucket do Object Storage.

“Suportar” aqui significa que você não pode alterá-lo e esperar que funcione, e não há um guia escrito nem uma tarefa rake pré-empacotada para isso. Portanto, se você acabar precisando alterar um bucket, será necessário fazer alguns ajustes no banco de dados.

Ok, justo. Então, o que eu fiz que foi o grande problema foi quando renomeei o bucket S3 e assumi que atualizar o nome do bucket na administração resolveria tudo o que eu precisava. Talvez um aviso na interface de administração ao editar o nome do bucket fosse útil aqui. (Comecei com as configurações na interface de administração antes de mudar para o uso de variáveis de ambiente, pensando que isso de alguma forma ajudaria) Certamente não ficou claro que alterar o nome do bucket após o upload seria um problema.

Reconfigurei os domínios de volta para o domínio correto do AWS S3.

DbHelper.remap("communitycdn.ortussolutions.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/fc05f9be9b783479819fec68b1d8e493110007a4.cfc",
 "/images/d-logo-sketch-small.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/50f0d6f260cdb4ef91e29023d92b46df096ab34e.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/65d80cddc6dc15b9a4d1b9e9d88cc9a8928c5316.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/a86aa2a12183428f3289caa95787ea16f22e2e4d.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f76b5238b147a60c8ad5f65bd7fa4bb6b58d852.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6a4c9b992e6cd8a15ddeaec0d158ebd473164525.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/93420848249ecea2261d405e46f7f450cc02a3af.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/d67c39e06ce624b9deb7625dd041d21cffd96df9.png"]

Reconstruí o aplicativo novamente e agora estou recriando as postagens. Vou ver se a 37ª tentativa será a de sorte :slight_smile:

Todos os uploads possuem a URL correta do bucket S3, o contêiner foi reconstruído e todas as 30 mil postagens foram reprocessadas. Ainda estou vendo

/images/transparent.png

no lugar de todas as minhas imagens.

Ao editar as postagens, ainda aparece isso:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

O interessante é que outros anexos, como arquivos zip, estão funcionando corretamente agora.

Falta alguma peça para que as imagens incorporadas em postagens antigas comecem a funcionar?

Você pode imprimir os atributos do objeto Upload correspondente a yTDVQSa4wbIeLGEZvE7muXe8sAJ?

Eu adoraria ajudar, mas vou precisar de alguma assistência com isso. Sou desenvolvedor, mas não de Ruby. Descobri como imprimir todos os atributos de um upload aleatório, assim:

[17] pry(main)> Upload.all.sample(1)
=> [#<Upload:0x00005633230f8af0
  id: 353,
  user_id: 273,
  original_filename: "helloWorldF.zip",
  filesize: 50542,
  width: nil,
  height: nil,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
  created_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  updated_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  sha1: "3a532dec6390d5087ed6154fc0335c2c0f1ea543",
  origin: nil,
  retain_hours: nil,
  extension: "zip",
  thumbnail_width: nil,
  thumbnail_height: nil,
  etag: nil,
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

E encontrei algumas referências para o Active Record do Rails para buscar registros específicos, mas não consigo encontrar nenhum dado lá que se pareça remotamente com yTDVQSa4wbIeLGEZvE7muXe8sAJ. Como posso encontrar o registro de upload correspondente?

Ooh, boas notícias. Enquanto pesquisava como encontrar os registros de Upload, encontrei este post que me mostrou como converter a string base62 para o hash sha1.

Ele mencionou que imagens que apenas exibiam o transparent.png haviam sido tombstonadas. Não tenho certeza do que isso significa, mas presumo que um processo tenha rodado durante a noite enquanto as imagens estavam quebradas e as marcou como não utilizadas. Consegui executar

rake uploads:recover_from_tombstone

e parece que todas as minhas imagens incorporadas voltaram e agora estão apontando para o meu CDN S3!

E, por que não, aqui está como encontrei o registro de Upload começando com a string yTDVQSa4wbIeLGEZvE7muXe8sAJ.

[14] pry(main)> Base62.decode("yTDVQSa4wbIeLGEZvE7muXe8sAJ").to_s(16)
=> "f49428d6af35d7e0414408ccb65e7316f5003215"
[15] pry(main)> Upload.where( "original_filename ilike '%f49428d6af35d7e0414408ccb65e7316f5003215%'" )
=> [#<Upload:0x000056313aa91fe8
  id: 899,
  user_id: 549,
  original_filename: "f49428d6af35d7e0414408ccb65e7316f5003215.png",
  filesize: 25514,
  width: 1169,
  height: 984,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/f49428d6af35d7e0414408ccb65e7316f5003215.png",
  created_at: Tue, 12 Jan 2021 23:01:35 UTC +00:00,
  updated_at: Tue, 12 Jan 2021 23:01:36 UTC +00:00,
  sha1: "f49428d6af35d7e0414408ccb65e7316f5003215",
  origin: nil,
  retain_hours: nil,
  extension: "png",
  thumbnail_width: 594,
  thumbnail_height: 500,
  etag: "6977f35ddbf39a4399dc76f92a5079d4",
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

Obrigado novamente pela sua ajuda @Falco. Sou novo no Discourse, mas você provou ser muito paciente e prestativo :+1: