Olá, estou tentando incorporar comentários do Discourse no meu site, seguindo o guia de incorporação, e esbarrei em um muro ![]()
Sintomas
Tentei no Firefox e no Chrome. Em ambos, ele carrega o iframe do Discourse com a mensagem “Carregando discussão…”, mas fica travado ali, com erros recorrentes de JavaScript no console do desenvolvedor.
No Firefox, recebo um erro sobre o cabeçalho X-Frame-Options:
Cabeçalho X-Frame-Options inválido encontrado ao carregar “https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927”: “ALLOWALL” não é uma diretiva válida.
Em seguida, um erro DOMException em embed-application.js:7:
Uncaught DOMException: Uma string inválida ou ilegal foi especificada
Esses dois erros se repetem a cada 30 segundos ou mais. Não há requisições falhas na aba de rede.
No Chrome, não recebo o erro de X-Frame-Options. Após alguns segundos, recebo um erro sobre a origem de destino não corresponder à origem da janela receptora:
Falha ao executar 'postMessage' em 'DOMWindow': A origem de destino fornecida ('https://discourse.29th.local') não corresponde à origem da janela receptora ('https://personnel.29th.local').
Vi muitos tópicos no meta sobre esse erro e tentei todas as etapas de solução de problemas, sem sucesso.
Meu ambiente
Siga o guia de configuração do Discourse para Mac com uma pequena exceção: em vez de instalar o postgres, o redis e o mailcatcher globalmente no meu laptop, tenho eles rodando em contêineres Docker, com as portas expostas publicamente. O Discourse não tem ideia de que estão rodando em contêineres Docker em vez de diretamente no sistema. O Rails/Discourse está instalado globalmente e não está rodando em um contêiner Docker.
Totalmente separado disso, meu aplicativo web personalizado está rodando em um stack do Docker Compose. Parte desse stack inclui um servidor nginx que roteia personnel.29th.local para o contêiner upstream apropriado e discourse.29th.local para host.docker.internal:3000 (esse é o nome de host mágico que os contêineres Docker podem usar para acessar o localhost do host).
(Como menciono abaixo, removi a camada do nginx da equação e terminei com o mesmo erro)
Um possível problema aqui é que meu aplicativo web é uma aplicação de página única (SPA) em JavaScript. A página onde os comentários do Discourse estão sendo incorporados é https://personnel.29th.local/#enlistments/1234 e não há renderização do lado do servidor. Se isso fosse um problema, eu esperaria um erro com o rastreador (crawler), momento em que eu aceitaria que o Discourse simplesmente fizesse um link para meu aplicativo, em vez de tentar rastrear. Mas os erros que ele mostra não parecem estar relacionados a falhas de rastreamento.
Solução de problemas
Defini o host incorporável em Admin > Personalizar > Incorporação como personnel.29th.local. No início, o código de exemplo de incorporação mostrava http://localhost:3000/ para o discourseUrl, então abri o rails console e executei:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
E ativei a opção “forçar https” no painel administrativo. Isso corrigiu a URL no código de exemplo de incorporação.
Também adicionei https://personnel.29th.local como um domínio CORS na seção origens cors das configurações.
Agora estou iniciando o Discourse com o seguinte comando:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
Também tentei desativar a Política de Segurança de Conteúdo (CSP) no painel de configurações.
Olhei em https://discourse.29th.local/logs/, mas não vi erros e nada sobre o Sidekiq.
Sobre o Sidekiq, tenho uma mensagem no painel administrativo sobre atualizações:
Uma verificação de atualizações não foi realizada. Certifique-se de que o Sidekiq esteja rodando.
Então executei Sidekiq.redis { |r| puts r.flushall } no console do Rails e obtive OK, reiniciei o servidor Rails e não houve mudança na mensagem nem no problema geral. Explorarei o cache do Redis e não vi nada relacionado a essa página.
Também tentei simplificar as coisas removendo a camada do nginx da equação: revertendo SiteSetting.force_hostname e SiteSetting.port para nil, desativando o forçar https, acessando meu aplicativo web e o Discourse via localhost, e adicionando meu aplicativo web aos hosts incorporáveis e nomes de host CORS do Discourse (http://localhost:8080), mas obtive o mesmo erro, apenas com hosts diferentes:
Falha ao executar 'postMessage' em 'DOMWindow': A origem de destino fornecida ('http://localhost:3000') não corresponde à origem da janela receptora ('http://localhost:8080').
Estou rodando a versão 2.6.0.beta6 ( 60bc38e6a8 ), que obtive clonando a branch master conforme o guia de configuração do Discourse para Mac algumas semanas atrás e executando git pull origin master hoje.
Também removi o diretório tmp e reiniciei o servidor.
Também saí para caminhar, gritei em um travesseiro e chorei debaixo da minha mesa.
Espero que isso cubra todas as bases. Espero que alguém possa ajudar!
