Discourse implantado na AWS está buscando assets da URL do banco de dados

Olá, equipe

Estou executando o Discourse no AWS ECS. Ao tentar executar o aplicativo, a aba do console no navegador está falhando com as URLs abaixo. Será que perdi alguma alteração de configuração?

Conteúdo misto: A página em ‘https://discuss-stage.tllms.com/finish-installation/register’ foi carregada via HTTPS, mas solicitou um favicon inseguro ‘http://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_32x32.png’. Essa solicitação foi bloqueada; o conteúdo deve ser servido via HTTPS.

Na URL acima, este é meu endpoint de banco de dados: discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com.

Forneci o endpoint acima no arquivo database.yml.

Fiz o deploy do Discourse no ECS usando Docker. Ao tentar acessar o aplicativo, o navegador está buscando recursos nas URLs abaixo em vez de https://discuss-stage.tllms.com/.

Este é nosso endpoint RDS discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com usado no arquivo database.yml.

Conteúdo misto: A página em ‘https://discuss-stage.tllms.com/’ foi carregada via HTTPS, mas solicitou um favicon inseguro ‘http://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_32x32.png’. Essa solicitação foi bloqueada; o conteúdo deve ser servido via HTTPS.

Recusa em carregar o script ‘https://discuss-stage.tllms.com/assets/browser-detect.js’ porque ele viola a seguinte diretiva de Política de Segurança de Conteúdo: “script-src https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/logs/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/sidekiq/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/mini-profiler-resources/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/assets/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/brotli_asset/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/extra-locales/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/highlight-js/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/javascripts/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/plugins/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/theme-javascripts/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/svg-sprite/”. Observe que ‘script-src-elem’ não foi definido explicitamente, então ‘script-src’ está sendo usado como fallback.

Parece uma má configuração do seu bucket S3.

Como você instalou o Discourse? Você usou a Instalação Padrão Oficial do Discourse ou talvez tenha sido a Solução de Problemas de Instalações Bitnami?

Eu apostaria minha sorte em um CDN mal configurado.
Você pode compartilhar seu config/discourse.conf?
E procure em suas configurações do site por c0fbtc e veja se há resultados.

Olá Jay,

Instalei como um aplicativo Rails padrão. Abaixo estão os passos que segui.

  1. Clonei o repositório do GitHub.
  2. Executei o bundle install dos gems.
  3. Modifiquei o arquivo database.yml para apontar para o endpoint do AWS RDS.
  4. Modifiquei o arquivo discourse.conf para apontar para o AWS ElastiCache.
  5. Não utilizei configuração de bucket S3 em nenhum lugar.
  6. Copiei o código para dentro de um contêiner Docker e o implantei no ECS.

Não utilizei a imagem Docker pré-construída. Construí minha própria imagem Docker.

excluindo arquivo de configuração

Isso não parece correto. Se eu fosse você, verificaria se meu banco de dados não era realmente local e tem um nome estranho.

Acho que deveria ficar assim:

# endereço do host para o servidor de banco de dados
# Isso está definido como em branco para que ele tente usar sockets primeiro
db_host = discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com
# nome do banco de dados executando o Discourse
db_name = default

Para que o S3 é usado? E também, preciso criar um arquivo discourse.conf separado sem alterar nada no arquivo discourse_defaults.conf?

Isso não tem nada a ver com S3.

O arquivo discourse.conf é gerado a partir do seu app.yml; você deve fazer as alterações lá e reconstruir.

Richard

Clonei o Discourse do GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub, mas não consegui encontrar o arquivo app.yml em lugar nenhum do repositório.

Toda a configuração do Discourse está apontando para discourse_docker, que não quero usar. Quero construir meu próprio container.

(Devo avisá-lo sobre tentar reinventar uma roda que já funciona perfeitamente. Além disso, algumas pessoas por aqui não estarão muito entusiasmadas em apoiá-lo, já que isso não beneficia a comunidade).

Independentemente do que fizer, eventualmente você deve garantir que esses valores sejam corretamente aplicados no seu discourse.conf. Se você o editou manualmente, deve, no mínimo, colocar o nome de host da AWS em db_host e deixar db_name como default.

Olá Richard,

Estou na mesma equipe que o Vijay. O caso de uso específico que estamos tentando abordar aqui é fazer um fork do Discourse e colocá-lo no GitHub da nossa empresa. A partir daí, construiríamos e implementaríamos na AWS. O motivo de querer ter isso no nosso GitHub é manter a flexibilidade de fazer alterações conforme nossas necessidades. Gostaríamos de contribuir de volta sempre que aplicável. Como não conseguimos encontrar um Dockerfile no repositório público do Discourse, acabamos criando o nosso próprio para construir a imagem do Docker. Além disso, usamos o GitHub Actions para implantar o Docker no serviço ECS da AWS.

Considerando nossa necessidade, você acha que poderíamos ter adotado alguma outra abordagem?

Obrigado.

Sim. Minha recomendação é usar os repositórios oficiais do Discourse e do discourse_docker e implementar todas as alterações como plugins.

Usar o discourse_docker oficial evitará problemas como o deste tópico. Além disso, não fazer um fork do Discourse, mantendo todas as suas modificações em plugins separados, evita que você se afaste da branch principal e economiza muito esforço ao precisar portar todas as alterações upstream de volta para seu fork.

A curva de aprendizado no desenvolvimento de plugins se paga em poucas semanas em comparação ao esforço de mesclar atualizações upstream e, a partir daí, o processo se torna ainda mais eficiente.

Ao usar o repositório oficial do Discourse, você também pode considerar hospedagem gerenciada, e as pessoas tendem a ser mais entusiastas (e/ou cobrar menos) quando precisam ajudá-lo.

Obrigado pelas suas contribuições. Tenho algumas perguntas de acompanhamento:

  1. Com a abordagem de plug-in, existe a possibilidade de encontrarmos um gargalo em alguns requisitos que não possam ser atendidos por meio de plug-ins? Por exemplo, gerenciar funções de usuário de maneira altamente personalizada?
  2. Como seria o pipeline de ponta a ponta se utilizássemos o discourse_docker e o implantássemos em nossa conta da AWS no ECS? Como mencionei, atualmente usamos o GitHub Actions para implantar na ECS em nossa conta da AWS. Que estratégia de implantação podemos usar a partir do repositório público, mantendo a proteção das nossas credenciais da AWS?
  1. Os plugins suportam monkey patching em Ruby e a extensão de objetos Ember, de modo que, no final, tudo é possível.

  2. Não é minha especialidade, então vou deixar isso para outra pessoa.

Sempre comece com uma cópia do repositório discourse_docker. Crie um arquivo app.yml nele.

Use o subcomando bootstrap do script launcher na sua cópia local do discourse_docker para criar uma imagem Docker. Envie a imagem Docker para um repositório Docker. Implante essa imagem Docker onde desejar.

Crie plugins se necessário. Liste seus plugins personalizados no app.yml assim como os outros plugins.

@ashish_rawat @Vijay_Vantipalli Como vocês configuraram o Discourse Docker no ECS? Quando tento no servidor EC2, o Discourse carrega normalmente. Mas, ao enviar a imagem Docker do Discourse para o registro ECR e criar uma tarefa a partir dessa imagem, o contêiner não inicia — recebo apenas o código de saída 1. Estou travado nisso há mais de uma semana. Gostaria muito de ouvir suas sugestões. Obrigado!

Criei uma instância RDS separada e um cluster ElastiCache para Redis para isso.

Tente examinar os argumentos presentes em ./launcher start-cmd app — pode haver algo ali que você esqueceu de copiar para o ECS.

Obrigado pela resposta rápida! Acredito que esteja apenas faltando algo simples. Vou tentar fazer isso.

Desculpe se isso está fora do seu escopo. Tentei adicionar o “-e” que encontrei no app start-cmd, mas há outros argumentos como os seguintes:

+ /usr/bin/docker run --shm-size=512m -d --restart=always 
-h <server ip> 
-e DOCKER_HOST_IP=172.17.0.1 
--name app -t -p 80:80 
-v /var/discourse/shared/web-only:/shared 
-v /var/discourse/shared/web-only/log/var-log:/var/log 
--mac-address <address> local_discourse/app /sbin/boot

O -v é realmente necessário?

Sim, são montagens de volume. É absolutamente necessário que o Discourse tenha armazenamento disponível em /shared dentro do contêiner.