Canal de atendimento via WhatsApp Cloud API, com GPT-5.6 Luna, filas duráveis e integração de agendamento.
O Tohy Hub é a fonte de verdade para catálogo, profissionais, disponibilidade, leads, clientes e agendamentos do Studio. O jm-wpbot atua como adapter/orquestrador de canal; n8n também não deve possuir dados mestres de agenda ou catálogo.
Contrato interno disponível no Hub:
GET /api/internal/jm/catalogGET /api/internal/jm/availabilityPOST /api/internal/jm/leadsPOST /api/internal/jm/appointmentsPOST /api/internal/jm/booking-holdsPOST /api/internal/jm/booking-holds/:holdId/confirmPOST /api/internal/jm/booking-holds/:holdId/cancel
A autenticação usa credencial interna dedicada e organização fixa no Hub. Segredos nunca devem ser versionados.
O executor Luna usa o Hub para catálogo, disponibilidade, reserva temporária, confirmação e cancelamento quando HUB_INTERNAL_API_TOKEN e HUB_INTERNAL_ORGANIZATION_ID estão configurados. O bot envia a organização fixa pelo cabeçalho X-Hub-Organization e usa sourceDetail=jm-wpbot nas reservas.
Se a configuração interna do Hub estiver ausente, o worker mantém o executor PostgreSQL legado como rollback seguro. Não há dual-write: em modo Hub, slot occupancy e appointments pertencem ao Hub; o PostgreSQL local permanece para conversas, mensagens, outbox, jobs, painel operacional legado e estado de canal.
Configuração necessária para o modo Hub:
HUB_INTERNAL_BASE_URL=https://hub.tohy.com.br
HUB_INTERNAL_API_TOKEN=<segredo provisionado no Portainer>
HUB_INTERNAL_ORGANIZATION_ID=<id fixo da Jessica Marques no Hub>
AUTOMATION_INTERNAL_TOKEN=<segredo dedicado n8n -> Bella>HUB_INTERNAL_API_TOKEN e HUB_INTERNAL_ORGANIZATION_ID devem ser definidos juntos. Definir apenas um deles falha no bootstrap para evitar operação parcial.
- Node.js + TypeScript + Fastify
- PostgreSQL 16 para estado de canal, conversas, outbox e jobs
- pg-boss para jobs duráveis
- GPT-5.6 Luna para conversa
- WhatsApp Cloud API oficial
- Portainer Stack para produção
- Portainer stack
184acompanharefs/heads/main. web,workerepostgresusamrestart: unless-stopped.- PostgreSQL está healthy e
/healthzretorna{"status":"ok"}. - Verificação local do webhook Meta retorna HTTP 200 e ecoa corretamente o challenge.
WHATSAPP_VERIFY_TOKEN,WHATSAPP_APP_SECRETeOPENAI_API_KEYestão provisionados sem exposição de valores.WHATSAPP_ACCESS_TOKENeWHATSAPP_PHONE_NUMBER_IDainda não estão provisionados; envio real permanece bloqueado por esse gate externo.- Os smokes dessa reconciliação não enviaram mensagens reais.
Backup pré-redeploy criado no host Docker em /root/backups/jm-wpbot/20260917T102903Z.
- Copie
.env.examplepara.enve troque os segredos. - Suba a stack de desenvolvimento conforme o Compose do repositório.
- O serviço
migrateaplica migrations pendentes automaticamente antes de liberarweb/worker. - Mantenha webhook HTTPS com validação HMAC e painel administrativo atrás do Cloudflare Access.
Docker de produção é administrado exclusivamente por Portainer Stack; não usar docker compose direto para alterar a stack de produção.