Definindo links DISCOURSE_S3_CDN_URL para ativos na URL do CDN S3

Você pode verificar quais variáveis configuramos aqui: infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

Estas são as variáveis que configuramos relacionadas ao S3/CDN:

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

Acredito que DISCOURSE_S3_BUCKET foi descontinuado em favor de DISCOURSE_S3_UPLOAD_BUCKET e DISCOURSE_S3_BACKUP_BUCKET. Você deve configurar essas variáveis em vez disso.

Foi isso que eu supus, mas não avanço nada a menos que configure tanto DISCOURSE_S3_UPLOAD_BUCKET quanto DISCOURSE_S3_BUCKET. Como você pode ver no trecho de código publicado acima, use_s3? ainda está procurando por s3_bucket e não por s3_upload_bucket.

Configurar DISCOURSE_BACKUP_BUCKET não resolve isso, pelo que pude perceber.

Se eu configurar ambas as variáveis de ambiente de bucket, avanço um passo, mas agora esbarrei em um novo problema: o Discourse está ignorando minha URL de CDN S3 e tentando carregar os ativos do meu caminho base. Isso está causando erros de CSP, pois a Política de Segurança de Conteúdo inclui apenas o caminho de ativos da minha CDN S3.

Deveria ser DISCOURSE_S3_BACKUP_BUCKET em vez de DISCOURSE_BACKUP_BUCKET. Fora isso, se você estiver configurando todas as variáveis com as duas distribuições do CloudFront, deve funcionar. Se observar nossas configurações, não estamos definindo DISCOURSE_S3_BUCKET.

Não tenho certeza se um rebake também é necessário.

@Falco, pelo que me lembro, uma das coisas que tornam isso muito contra-intuitivo é que há uma diferença de comportamento ao definir DISCOURSE_S3_CDN_URL como uma variável de ambiente / GlobalSetting em comparação com configurá-lo como um SiteSetting. Talvez isso seja algo que você queira prestar atenção no seu howto.

Sim, desculpe, foi um erro de digitação apenas no meu post anterior. DISCOURSE_S3_BACKUP_BUCKET não define s3_bucket em GlobalSetting para mim. Não tenho certeza de como você está executando essa tarefa rake sem definir DISCOURSE_S3_BUCKET.

Agradeço muito sua ajuda, aliás, e sei que isso não é problema seu para resolver, então obrigado.

Sem problemas, não é um issue. Esqueci de mencionar que também definimos USE_DB_S3_CONFIG: true no nosso arquivo app.yml. infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

E acho que você está certo, já que isso altera o comportamento de como os buckets S3 são definidos (discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub) e provavelmente é um bug.

Verifique se definir isso resolve o problema para você.

Olá @eatcodetravel, obrigado pelo seu ótimo post.

Estou tentando configurar o CloudFront como você fez.

Devo fazer o upload da pasta de assets para meu bucket S3 ou isso acontecerá automaticamente?

O que acontece após uma atualização do Discourse? Preciso fazer o upload do tema novamente se não for automático?

Obrigado.

Claro.

def ensure_s3_configured!
  unless GlobalSetting.use_s3? || use_db_s3_config
    STDERR.puts "ERRO: Certifique-se de que o S3 está configurado em config/discourse.conf ou nas variáveis de ambiente"
    exit 1
  end
end

use_db_s3_config evita que você precise definir essa variável extra. Isso deve ser um bug em global_setting.rb, pois deveria ser possível apenas definir DISCOURSE_S3_UPLOAD_BUCKET, a menos que haja uma diferença entre isso e DISCOURSE_S3_BUCKET. Mas acho que você tem razão: o último deveria estar obsoleto.

Independentemente de um bug no global_setting.rb, ainda estou enfrentando um problema onde o Discourse está procurando os assets no local habitual e não no meu CDN S3, mesmo tendo declarado todas as minhas variáveis e definido DISCOURSE_ENABLE_S3_UPLOADS como true.

Existe uma tarefa para isso: bundle exec rake uploads:migrate_to_s3. Depois de configurar seus buckets, você deve executar essa tarefa para mover os uploads para o S3. O S3/CDN mudou nos últimos meses e a documentação não está atualizada, então certifique-se de fazer backup e se preparar caso algo dê errado.

Quando ativei isso pela primeira vez, tivemos algumas interrupções enquanto resolvíamos tudo.

Acho que isso ocorre porque você está sem o DISCOURSE_CDN_URL. Temos configurado assim:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # isso aponta para o servidor
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # isso aponta para o bucket S3

Os estilos são buscados do servidor, então usam o DISCOURSE_CDN_URL. Já o JavaScript é enviado para o bucket S3 e usa o DISCOURSE_S3_CDN_URL. O @Falco me explicou isso aqui.

Sim, vi isso. Configurei DISCOURSE_CDN_URL, mas ainda tenho o mesmo problema. No entanto, estou cansado, então talvez tenha perdido algo com toda essa confusão. Vou retomar isso amanhã. Obrigado pela ajuda.

Isso fará o upload de ambos os arquivos como imagens e ativos como arquivos JS para o S3? E devo usar uma URL do Cloudfront ou o S3 é suficiente? Obrigado pela ajuda.

bundle exec rake uploads:migrate_to_s3 fará o upload apenas dos anexos para o S3; essa tarefa precisa ser executada apenas uma vez. Após ativar o S3, novos uploads serão salvos nos buckets do S3.

Para fazer o upload de ativos, você precisa usar bundle exec rake s3:upload_assets, e isso deve ser executado após cada rebuild/atualização.

Fiz o que você mencionou e os uploads para o S3 (imagens, etc.) foram bem-sucedidos, mas para assets recebo o erro abaixo:

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

Configurei ambos:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # isso aponta para o servidor
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # isso aponta para o bucket S3

Provavelmente isso está relacionado a USE_DB_S3_CONFIG: true. Tente definir essa variável para ver se funciona.

Aqui estão todas as variáveis que configurei relacionadas ao S3/CDN

Sim. Obrigado :slightly_smiling_face:. Isso resolveu o problema.

Existe um problema interessante: o Discourse está tentando acessar arquivos de ativos de um caminho incorreto. Ele tenta acessar a partir do caminho brotli_asset, mas não há esse caminho no bucket S3.

Além disso, ele tenta acessar arquivos de JavaScript e folhas de estilo a partir da URL do CDN. Mas esses arquivos também não estão no bucket.

@ufukayyildiz Acredito que todas as respostas para seus problemas estejam neste tópico. Acabei de passar pelo mesmo processo de configuração.

Em resumo, você precisa garantir que seus ativos tenham sido carregados assim que forem pré-compilados.

Espere
Não entendi uma coisa.

Por que configurar esses dados no ENV?

Vou dar meu exemplo.

Ao configurar os dados no painel administrativo para o S3, tudo funciona corretamente e tudo é carregado no S3. Eu não tenho nenhuma configuração no ENV. Isso é ruim? É necessário se tudo estiver funcionando?

O segundo exemplo é diferente porque não consigo migrar os dados antigos para o S3 (apenas os novos funcionam). Mas aqui, inserir esses dados no arquivo app.yml (DISCOURSE_S3_ACCESS_KEY_ID: ‘key’, etc.) não muda nada e ainda não funciona (ou seja,

rake uploads:migrate_to_s3

não funciona

Você pode me explicar isso?

Não, as variáveis de ambiente fornecem uma maneira adicional de configurar essas coisas, por exemplo, antes que você tenha acesso ao painel de administração.