Ambiente
- SO/Browser: Windows 10 • Edge/Chrome 139
- Orquestração: Docker Compose
- Banco: MySQL 8.0 (imagem oficial)
- NovoSGA (app): novosga/novosga:2.2
- Painel: novosga/panel-app:latest
- Mercure (hub): novosga/mercure:v0.11 (Caddy)
Portas
Sintoma
O painel renderiza a interface normalmente e o teste de som funciona.
Quando o operador clica em Chamar novamente ou Iniciar atendimento, a senha só aparece no painel após F5 (não há atualização em tempo real). A voz/áudio do painel também só dispara após recarregar.
O que já tentei
CORS do Mercure
Inicialmente o console do painel mostrava:
Ajustei o MERCURE_EXTRA_DIRECTIVES
no serviço do Mercure para liberar CORS e anônimo:
MERCURE_EXTRA_DIRECTIVES=anonymous 1; cors_origins http://localhost:8001 http://127.0.0.1:8001; respond /healthz 200
Depois disso, os erros de CORS diminuíram, mas o painel continua não recebendo os eventos.
JWT do publicador
Cheguei a ver “Key provided is shorter than 256 bits…”.
Corrigi usando uma chave hex de 64 caracteres (256 bits) em MERCURE_PUBLISHER_JWT_KEY
no app e no mercure.
Tópico/Unidade
Garanti que o painel assina topic=/unidades/1/painel e que a unidade configurada no painel é 1.
Verificação manual do SSE
curl -i 'http://127.0.0.1:3000/.well-known/mercure?topic=/unidades/1/painel'
retorna HTTP/1.1 200 OK
com Content-Type: text/event-stream
.
No DevTools do painel, vejo constantemente:
checking token. Authenticated: true. isExpired: false
GET …/.well-known/mercure?topic=/unidades/1/painel net::ERR_CONNECTION_REFUSED
ou às vezes net::ERR_FAILED (200 OK)
.
Proxy/Nginx
Não há proxy reverso entre o painel e o hub; estou acessando o Mercure diretamente em 127.0.0.1:3000.
Logs / Erros vistos
Console do painel (variando conforme as tentativas):
blocked by CORS policy: No 'Access-Control-Allow-Origin' header…
net::ERR_FAILED 200 (OK)
net::ERR_CONNECTION_REFUSED
App (quando JWT estava incorreto):
Key provided is shorter than 256 bits, only 104 bits provided
Em uma fase anterior, ao chamar a senha:
Unexpected token '<' … is not valid JSON (isso ocorreu antes de corrigir as URLs/JWT/CORS)
Configuração atual (resumo)
.env (redigido):