Movendo de um bucket S3 para outro

Continuando a discussão de Como mover meu bucket de upload S3 de um provedor para outro?:

Estou tentando migrar de um bucket GCP para um bucket AWS S3. O sistema antigo não usava um CDN S3 (o cara que configurou não parecia saber muito bem o que estava fazendo, aparentemente).

Usei o s3cmd para sincronizar o antigo bucket GCP com um sistema de arquivos local e, em seguida, usei-o novamente para enviar os ativos para o novo bucket S3. O sistema agora está corretamente configurado com S3 e CDNs do site, conforme descrito em Usando Armazenamento de Objetos para Uploads (S3 e Clones).

O tópico vinculado acima sugeriu usar rake posts:remap para atualizar os posts (acho que também deveria rebakear todos os posts? Ou pelo menos aqueles que correspondem ao bucket antigo?).

Quando executei o posts:remap, ele remapeou apenas um post.

 Upload.order(Arel.sql('RANDOM()')).limit(10).pluck(:id, :url)

mostra que todos eles ainda têm o bucket antigo… Ah, esse é o problema. Não precisamos de um rake posts:remap, mas sim de um discourse remap, conforme descrito em Change the domain name or rename your Discourse.

Sim, acho que sim.

Vou ver sobre fazer isso Realmente Logo Agora. @Falco, de forma geral, é algo como:

  • criar um novo bucket e CDN para ele, reconstruir o contêiner para usar o novo bucket/CDN e garantir que funcione;
  • configurar o s3cmd para o bucket antigo e sincronizar os dados para o local;
  • configurar o s3cmd para o novo bucket e sincronizar os dados para cima, até o novo bucket;
  • executar um discourse remap DOMÍNIO-DO-BUCKET-ANTIGO DOMÍNIO-DO-BUCKET-NOVO;
  • rebakear.

Isso parece correto?

Se você usar o mesmo CDN para o bucket antigo e o novo, pode economizar a necessidade de rebakear, mas acertar esse timing parece um pouco complicado (não é possível alterar a origem do CDN até que os dados estejam no novo bucket, mas você precisaria garantir de alguma forma que nada seja enviado para o bucket antigo durante o processo de sincronização) — talvez apenas dizer que é possível.

2 curtidas

Talvez usar a CLI oficial da AWS seja melhor para um guia?

Use DbHelper.remap aqui.

Não é necessário.

Use o mesmo CDN e apenas altere a origem do CDN no painel do CDN, ou use um novo CDN e faça o remapeamento com DbHelper.remap. Em ambos os casos, não é necessário rebake.

2 curtidas

Ah. OK. Vou verificar isso. . . É possível fazer a CLI da AWS funcionar com buckets que não sejam da AWS?

Ei, Rafael. Estou chegando lá. Minha versão atual deste guia aponta para o aws cli e o gsutil para sincronizar do antigo para o local e do local para o novo (eu apenas faço links para essas ferramentas e forneço um comando de linha de comando preenchido com os nomes dos buckets em um espaço reservado). Em seguida, usa o DbHelper para atualizar as tabelas. Para meu site de tamanho moderado, roda bastante rápido. Incrível.

O único problema que tenho agora é que a configuração antiga não tinha um s3_cdn_url, então essas imagens ainda estão vinculadas diretamente ao bucket (não ao CDN) nos posts. Reassar não ajuda. Os novos uploads estão corretamente vinculados ao CDN. Você não pode corrigir isso definindo DISCOURSE_S3_ENDPOINT: '', pois isso não tem efeito, então, após restaurar o banco de dados, tive que limpar o SiteSetting. Isso não é tão ruim, mas levou várias recriações para eu descobrir isso.

A configuração antiga não tinha um CDN S3 definido. Posso corrigir isso reassando todos os 1250 posts que contêm a URL/nome do host do bucket, mas isso faz com que todas essas imagens sejam baixadas e otimizadas (o servidor antigo está rodando a versão 2.7.0.beta5, então pensei que já teria algumas reotimizações recentes?). Isso sobrecarrega (média de carga de 10-20) meu servidor miserável de 2GB (com Postgres e Redis no RDS e Elasticache) por bastante tempo. Acho que talvez precise de uma instância EC2 maior para este site de qualquer forma, mas ainda estou um pouco surpreso de que esse reassar leve o servidor à falha (erros 500 na interface do usuário).

Deveria, em vez disso, criar uma substituição do nome do host do bucket para a URL do CDN em cooked nesses posts?

@pfaffman Obrigado por me indicar aqui.
Mas meu problema se agrava nos últimos dois passos.

Problema atual: Algumas das minhas imagens estão faltando, mas exibem pequenos ícones em seu lugar. Se eu passar o mouse sobre elas, elas mostram o endereço ‘olds3bucket’. Porém, quando clico nelas, elas são exibidas corretamente em tamanho completo, e agora o caminho do ‘news3bucket’ aparece na barra de URL.

  1. Principalmente, você disse para sincronizar os dados do bucket antigo com o novo, o que já fiz com sucesso.
  2. Em seguida, preencher as configurações do novo bucket na interface web do Discourse, que já utilizo há um ano.
  3. Agora você diz para ‘remapear’ a URL do bucket antigo com a do novo. E então fazer o rebake. Aqui está o problema. Quando faço isso (ou mesmo se fizer apenas o ‘rebake’, ou mesmo se escolher ‘Reconstruir HTML’ no menu de configurações da postagem, com ou sem fazer o passo de ‘remapear’ primeiro), aquelas imagens que apareciam apenas como ícones desaparecem completamente. Apenas um ‘espaço em branco’ é mostrado em seu lugar. Então, eu reverto/restauro imediatamente.

Obrigado mais uma vez.
(Tenho um site muito pequeno e, da mesma forma, tenho…).

O rclone é uma boa ferramenta que pode sincronizar com vários backends. Atualmente, o usamos para backups.

E aí, Jay,

Desculpe por retomar o assunto, mas você conseguiu avançar mais no guia? Obrigado!