Infraestrutura dos Servidores — apiclickup + engine gita-agents
Mapa único dos 2 servidores Node que rodam a operação da Gita: o que cada um faz, onde roda, suas rotas (estilo Swagger), env vars, integrações e armadilhas conhecidas.
Por que esse doc existe: durante o debug da automação reuniao-confirmada descobrimos na marra detalhes de infra que estavam só na cabeça/no código (URL errada de Chatwoot na env global, escopo de token Google, em qual server vivia cada rota). Este arquivo é a fonte única pra não repetir essa caça.
Fontes relacionadas (não duplicar — linkar):
- Crons e jobs agendados: docs/automations/CRONS.md
- Launchd local: docs/automations/LAUNCHD.md
- Bridge Chatwoot ↔ UaZapi: docs/automations/CHATWOOT-UAZAPI-BRIDGE.md
Visão geral
|
apiclickup |
engine gita-agents |
| Nome do serviço (Easypanel) |
apiclickup |
engine-gita-agents |
| Repositório |
/Users/juniormaia/gita/server/ (este repo) |
/Users/juniormaia/Projetos/gita-agents/packages/engine/ (repo separado) |
| Stack |
Node.js + Express (JS puro) |
Node.js + Express (TypeScript, ESM) |
| Papel |
Automações de negócio + webhooks de produto (ClickUp, vendas, relatórios, LPs, render) |
Pipeline de agentes IA no WhatsApp (multi-tenant) + bridge Chatwoot |
| Tem agente IA conversacional? |
Não (gera conteúdo pontual via API Anthropic/Gemini) |
Sim — é o motor dos agentes de cliente |
| DB |
Supabase (compartilhado) |
Supabase (compartilhado) + Redis (fila/cache) |
| Admin panel |
/dashboard, /operacional/dashboard |
https://admin.gita.work (incl. /crons, /caixas) |
Os dois compartilham o mesmo projeto Supabase e ambos falam com ClickUp, Google e Hotmart, mas com responsabilidades distintas: apiclickup é o backoffice da Gita; engine é a operação de WhatsApp dos clientes.
┌─────────────────────────────────────────┐
ClickUp webhooks ─────▶│ apiclickup (gita-webhook-server) │
Hotmart/Kiwify ─────▶│ - automações de negócio │──▶ Anthropic / Gemini
DocuSeal ─────▶│ - relatórios, LPs, render, crons "gi" │──▶ ClickUp / Drive / Sheets
Cron (Easypanel) ─────▶│ │──▶ UaZapi (grupos)
└─────────────────────────────────────────┘
│ Supabase
▼
┌─────────────────────────────────────────┐
WhatsApp (UaZapi)─────▶│ engine-gita-agents │
Chatwoot ─────▶│ - pipeline de agentes IA (multi-tenant) │──▶ Anthropic (via agente)
automation rule ─────▶│ - bridge Chatwoot↔UaZapi │──▶ Google Calendar/Meet
│ - automação reuniao-confirmada │──▶ Chatwoot API
└─────────────────────────────────────────┘
1. apiclickup (gita-webhook-server)
Servidor de automações de negócio. Entry: server/index.js. Cada automação é um módulo em server/automations/<nome>.js que registra suas próprias rotas (module.exports = (app) => { ... }).
1.1 Rotas (Swagger-style)
Saúde e debug
| Método |
Rota |
O que faz |
| GET |
/health |
Healthcheck |
| POST |
/webhook/debug |
Eco de payload pra debug |
| GET |
/status |
Status agregado (router.js) |
| GET |
/audit, /audit/stats |
Auditoria de execuções |
| POST |
/crons/invalidate |
Invalida cache de config de crons |
| GET |
/dashboard |
Painel admin (token DASHBOARD_TOKEN) |
| GET |
/operacional/status, /operacional/dashboard |
Status operacional consolidado |
ClickUp (geração de conteúdo + workflow de aprovação)
| Método |
Rota |
O que faz |
| POST |
/webhook/clickup/gerar-com-ia |
Gera conteúdo via IA a partir de task (roteia agente por listId) |
| POST |
/webhook/clickup/em-alteracao |
Trata task movida pra "em alteração" |
| POST |
/webhook/clickup/pre-auditoria |
Pré-auditoria automática |
| POST |
/pre-auditoria/trigger/:taskId · GET /pre-auditoria/debug |
Trigger manual / debug |
| POST |
/webhook/clickup/aprovado |
Task aprovada internamente |
| POST |
/webhook/clickup/aprovacao-cliente |
Aprovação do cliente (gera link/contrato) |
| POST |
/webhook/clickup/revisao-interna |
Revisão interna |
| POST |
/webhook/clickup/cliente-autofill · GET .../status |
Autofill de dados de cliente |
| POST |
/webhook/clickup/boletim · /webhook/clickup/relatorio-cliente |
Dispara Boletim de Entregas por task |
| Método |
Rota |
O que faz |
| POST |
/webhook/hotmart/venda |
Venda Hotmart genérica (valida HOTMART_HOTTOK) |
| POST |
/webhook/hotmart/janaina-listboss |
Venda ListBoss (token próprio) |
| POST |
/webhook/kiwify/venda |
Venda Kiwify (raw body, valida KIWIFY_WEBHOOK_TOKEN) |
| POST |
/webhook/chatwoot/venda-realizada |
Trigger de venda via label no Chatwoot |
| POST |
/vendas/reconcile/run · GET /vendas/reconcile/status |
Reconciliação de vendas |
| GET |
/vendas/stats · /vendas/recentes |
Métricas de vendas |
Onboarding e contratos (DocuSeal)
| Método |
Rota |
O que faz |
| GET |
/onboarding/:taskId · POST /onboarding/:taskId |
Formulário de onboarding (submit → status "formulário recebido" + aviso #BackOffice) |
| GET |
/assinar/:taskId · /contrato/:taskId |
Fluxo de assinatura de contrato |
| POST |
/webhook/clickup/gerar-contrato · GET .../status |
Status "gerar contrato" → cria submissão DocuSeal |
| POST |
/webhook/clickup/enviar-contrato · GET .../status |
Status "enviar contrato" → envia link+PIX ao cliente (gated) |
| POST |
/webhook/clickup/cliente-ativo · GET .../status |
Status "ativos" → grupo + Drive + projeto PED (gated) |
| POST |
/webhook/docuseal/assinado |
Contrato assinado → posta contrato completo + auditoria (sem criar grupo/Drive) |
Fluxo completo e setup: docs/pops/onboarding/fluxo-fechamento-cliente.md.
Janaina (produtos)
| Método |
Rota |
O que faz |
| POST |
/webhook/janaina-ls-pro-pre |
Pré-cadastro LS Pro |
| POST |
/webhook/janaina-ls-pro-pesquisa |
Pesquisa LS Pro |
| POST |
/webhook/janaina-programa-aceleracao |
Programa de Aceleração |
Base10 (área de membros)
| Método |
Rota |
O que faz |
| POST |
/membros/base10/login |
Login membro |
| GET |
/membros/base10/verificar |
Verifica sessão (BASE10_SESSION_SECRET) |
| GET |
/membros/base10/download/:arquivo |
Download de material |
Diagnóstico de cliente
| Método |
Rota |
O que faz |
| POST |
/webhook/diagnostico |
Recebe diagnóstico |
| POST |
/webhook/diagnostico/resposta |
Resposta do diagnóstico |
| POST |
/diagnostico/sequencia/processar · GET .../status |
Sequência de follow-up |
Instagram
| Método |
Rota |
O que faz |
| GET |
/instagram/admin |
Painel de agendamento |
| GET/POST |
/instagram/posts |
Listar / criar posts |
| POST |
/instagram/publish-pending |
Publica pendentes |
| GET |
/instagram/scheduler/status |
Status do scheduler |
| Método |
Rota |
O que faz |
| GET |
/meta-ads/relatorio · /meta-ads/relatorio/:accountId |
Relatório de performance |
| GET |
/meta-ads/contas |
Lista contas de anúncio |
WhatsApp / grupos (UaZapi)
| Método |
Rota |
O que faz |
| POST |
/webhook/whatsapp/grupos-clientes |
Curadoria de grupos de clientes |
| POST |
/grupos-clientes/curar · /grupos-clientes/curar-range |
Curadoria manual / por range |
| GET |
/grupos-clientes/health |
Health dos grupos |
| POST |
/webhook/whatsapp/claude-code-news · /claude-code-news/curar |
News Claude Code |
| POST |
/webhook/whatsapp/boletim · /webhook/whatsapp/relatorio-cliente |
Boletim via WhatsApp |
Relatórios e crons "gi"
| Método |
Rota |
O que faz |
| POST |
/reports/send-daily · GET /reports/cron-status |
Relatório diário |
| POST |
/cron/gi-apresentacao · GET .../status |
Cron Gi: apresentação |
| POST |
/cron/gi-resolved-watcher · GET .../status |
Cron Gi: watcher de resolvidas |
| POST |
/cron/gi-followup-revisao · GET .../status |
Cron Gi: follow-up de revisão |
| POST |
/cron/gi-briefing-matinal · GET .../status |
Cron Gi: briefing matinal |
| POST |
/cron/gi-alteracao-watcher · GET .../status |
Cron Gi: watcher de alterações |
| POST |
/cron/gi-backoffice-watcher · GET .../status |
Cron Gi: watcher de backoffice |
Detalhe de agendamento e flags ENABLE_* de cada cron em CRONS.md.
Landing pages, render, Drive, diversos
| Método |
Rota |
O que faz |
| GET |
/lp · /lp/:slug · static /lp/static |
Serve landing pages de cliente |
| POST |
/render · /render/carousel · /render/attach |
Render de criativos via Remotion (Puppeteer) |
| POST |
/drive/upload · /drive/upload-batch |
Upload pro Google Drive |
| GET/POST |
/vaga-domestica |
Form de vaga (RH) |
| POST |
/boletim/preview · /boletim/gerar (+ /relatorio-cliente/*) |
Boletim de Entregas (preview/gerar manual) |
1.2 Env vars (nomes — sem valores)
| Grupo |
Vars |
| Núcleo |
PORT, NODE_ENV, DEPLOY_COMMIT, BASE_URL, SERVER_URL |
| IA |
ANTHROPIC_API_KEY, GEMINI_API_KEY, OPENAI_API_KEY |
| ClickUp |
CLICKUP_TOKEN, CLICKUP_WORKSPACE_ID, RH_VAGAS_LIST_ID, PRE_AUDITORIA_CHANNEL_ID |
| Supabase |
SUPABASE_URL, SUPABASE_SERVICE_KEY, SUPABASE_SERVICE_ROLE_KEY |
| Google |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN, GOOGLE_DRIVE_PASTA_CLIENTES, GOOGLE_DRIVE_PASTA_RELATORIOS |
| Hotmart |
HOTMART_CLIENT_ID, HOTMART_CLIENT_SECRET, HOTMART_BASIC_TOKEN, HOTMART_HOTTOK, HOTMART_HOTTOK_JANAINA_LISTBOSS, HOTMART_HOTTOK_LS_JAN |
| Kiwify |
KIWIFY_WEBHOOK_TOKEN, KIWIFY_BASE10_PRODUCT_ID |
| DocuSeal |
DOCUSEAL_URL, DOCUSEAL_API_KEY, DOCUSEAL_TEMPLATE_ID |
| UaZapi |
UAZAPI_URL, UAZAPI_TOKEN, UAZAPI_TOKEN_GRUPOS, LISTBOSS_UAZAPI_TOKEN, WHATSAPP_TEST_GROUP_JID |
| Meta |
META_ACCESS_TOKEN, META_IG_TOKEN_GITA, META_IG_TOKEN_JUNIOR, META_IG_USER_ID_GITA, META_IG_USER_ID_JUNIOR |
| ManyChat |
MANYCHAT_BEARER, MANYCHAT_TAG_LS_JAN |
| Sheets (IDs) |
SHEET_ID, SHEET_NAME, INSTAGRAM_SHEET_ID, JANAINA_LEADS_SHEET_ID, JANAINA_LISTBOSS_SHEET_ID, JANAINA_PA_SHEET_ID, JANAINA_PA_SHEET_RANGE, JANAINA_PESQUISA_SHEET_ID |
| Acesso/segredos |
DASHBOARD_TOKEN, BASE10_SESSION_SECRET, BOLETIM_WHITELIST_PHONES, RELATORIO_WHITELIST_PHONES |
Flags ENABLE_* |
ENABLE_SCHEDULED_REPORTS, ENABLE_GRUPOS_CURADORIA, ENABLE_INSTAGRAM_PUBLISHER, ENABLE_PRE_AUDITORIA, ENABLE_VENDAS_RECONCILE, ENABLE_DIAGNOSTICO_SEQUENCIA, ENABLE_GI_ALTERACAO_WATCHER, ENABLE_GI_BACKOFFICE_WATCHER, ENABLE_GI_BRIEFING_MATINAL, ENABLE_GI_FOLLOWUP_REVISAO, ENABLE_GI_RESOLVED_WATCHER |
| Render |
PUPPETEER_EXECUTABLE_PATH, DRY_RUN_APROVACAO_CLIENTE |
1.3 Integrações (deps)
@anthropic-ai/sdk · @google/generative-ai · @supabase/supabase-js · puppeteer (render) · ws (WebSocket) · Google APIs (Drive/Sheets/Calendar via OAuth2) · ClickUp REST · Hotmart/Kiwify REST · DocuSeal · UaZapi · Meta Graph API.
2. engine gita-agents
Motor multi-tenant dos agentes IA de WhatsApp. Entry: packages/engine/src/index.ts. Config centralizada em src/config.ts (vars obrigatórias lançam erro no boot via required()).
⚠️ Repo separado — não está em /gita. Vive em /Users/juniormaia/Projetos/gita-agents/. PRs em github.com/administrador-ai-gita/gita-agents. Ver [[project_gita_agents_engine_location]].
2.1 Rotas (Swagger-style)
Saúde e operação
| Método |
Rota |
O que faz |
| GET |
/health |
Healthcheck |
| GET |
/version |
Commit + build time + uptime (⚠️ ver armadilha DEPLOY_COMMIT) |
| GET |
/metrics |
Prometheus — agrega agent_logs + leads em tempo real |
| GET |
/status |
Status agregado |
| POST |
/crons/invalidate |
Invalida cache de config de crons |
| POST |
/test/followup-trigger |
Dispara follow-up manualmente (GITA_TEST_SECRET) |
Pipeline de agentes (multi-tenant — :agentSlug)
| Método |
Rota |
O que faz |
| POST |
/webhook/:channel/:agentSlug |
Rota principal — recebe msg do canal, roda o agente |
| POST |
/webhook/seed-lead/:agentSlug |
Injeta lead inicial pro agente |
| POST |
/webhook/clickup-task-comment/:agentSlug |
Comentário de task vira mensagem pro agente |
| POST |
/webhook/gita-sales/provisioning |
Provisiona nova instância de agente (GITA_SALES_WEBHOOK_SECRET) |
| POST |
/webhook/groups |
Mensagens de grupo |
Chatwoot
| Método |
Rota |
O que faz |
| POST |
/webhook/chatwoot/inbound-message |
Mensagem inbound do Chatwoot pro pipeline |
| POST |
/webhook/bridge/chatwoot/:accountId/:inboxId |
Bridge: Chatwoot → UaZapi (account 3 / inbox 75) |
| POST |
/webhook/bridge/uazapi/:bridgeId |
Bridge: UaZapi → Chatwoot |
| POST |
/webhook/reuniao-confirmada |
Automação reunião (tag → Google Meet → mensagem). Ver §2.4 |
2.2 Env vars (nomes — sem valores)
| Grupo |
Vars |
| Núcleo |
PORT, REDIS_URL, DEPLOY_COMMIT, DEPLOY_BUILT_AT, ENGINE_INTERNAL_URL |
| Supabase |
SUPABASE_URL, SUPABASE_SERVICE_KEY (obrigatórias) |
| Chatwoot |
CHATWOOT_URL, CHATWOOT_PLATFORM_TOKEN (obrigatórias), CHATWOOT_ACCOUNT_TOKEN, CHATWOOT_ACCOUNT_URL |
| ClickUp |
CLICKUP_TOKEN, CLICKUP_WORKSPACE_ID, CLICKUP_CHANNEL_ID, CLICKUP_ALERTS_CHANNEL_ID, CLICKUP_ONBOARDING_LIST_ID |
| Google |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN |
| Reunião |
REUNIAO_AGENT_SLUG (default gita-conversao), REUNIAO_CALENDAR_ID (default [email protected]) |
| IA |
OPENAI_API_KEY |
| Hotmart |
HOTMART_CLIENT_ID, HOTMART_CLIENT_SECRET, HOTMART_BASIC |
| UaZapi (Gita) |
GITA_UAZAPI_URL, GITA_UAZAPI_TOKEN |
| Segredos |
GITA_SALES_WEBHOOK_SECRET, GITA_TEST_SECRET |
Flags ENABLE_* |
ENABLE_CHATWOOT_UAZAPI_BRIDGE, ENABLE_CLICKUP_CHAT_POLLER, ENABLE_FOLLOWUP_LOOP |
2.3 Integrações (src/integrations/)
chatwoot/ (bridge + API de conta) · clickup/ · crm/ · gemini/ · google/ (calendar, OAuth2 e service_account) · openai/ · whatsapp/ (UaZapi) · hotmart.ts · redis.ts. Credencial Google de cada agente vive no provider_config da tabela ai_agents (Supabase), não nas envs.
2.4 Automação reuniao-confirmada (manual, sem IA)
Fluxo: a Tay preenche 2 custom attributes (data + hora) numa conversa do Chatwoot e marca a tag reuniao-confirmada → uma Automation Rule do Chatwoot chama POST /webhook/reuniao-confirmada → a engine cria evento no Google Calendar com Meet (30 min), convida o lead por e-mail e posta a copy+link na conversa.
- Handler:
packages/engine/src/webhooks/reuniao-confirmada.ts
- Credencial Google: reusa o
provider_config do agente gita-conversao (o global GOOGLE_REFRESH_TOKEN não tem escopo Calendar).
- Posta via API de conta do Chatwoot (a conversa é WhatsApp nativo, account 1/inbox 78 — não passa pela bridge).
- Detalhes completos, config real e histórico de PRs em [[project_automacao_reuniao_chatwoot]].
3. Armadilhas conhecidas (gotchas)
CHATWOOT_URL global está com domínio errado (chatwoot.gita.work). O correto é atendimento.gita.work. A automação reuniao-confirmada usa env própria (CHATWOOT_ACCOUNT_URL) pra não depender da errada. Não confie na env global pra montar URL de API.
/version mostra DEPLOY_COMMIT desatualizado na engine — a env não atualiza no build do Easypanel. Confie no comportamento em runtime, não no /version.
- Token Google global sem escopo Calendar → 403
ACCESS_TOKEN_SCOPE_INSUFFICIENT. Por isso a automação reusa a credencial de um agente que já agenda em prod.
- Bridge só existe pra account 3 / inbox 75. Conversas de account 1 (WhatsApp nativo) postam direto pela API do Chatwoot.
- Merge de PR antes do 2º push chegar deixa commit órfão (já aconteceu 3x). Confirmar "sem push pendente" antes de mergear.
- Crons têm 2 camadas de controle: flag
ENABLE_<ID> na env (liga/desliga no deploy) + toggle em runtime no Supabase crons_config. Ambas precisam estar ligadas. Ver CRONS.md.
@google/generative-ai está deprecado em favor de @google/genai — apiclickup ainda usa o antigo.
4. Como descobrir/atualizar este mapa
Pra regenerar as listas de rotas e envs quando algo mudar:
# apiclickup — rotas
cd server && grep -rEn "app\.(get|post|put|delete|patch)\(" --include="*.js" . | grep -v node_modules
# apiclickup — envs
cd server && grep -rohE "process\.env\.[A-Z_0-9]+" --include="*.js" . | grep -v node_modules | sort -u
# engine — rotas
cd ~/Projetos/gita-agents/packages/engine && grep -nE "app\.(get|post|put|delete|patch)\(" src/index.ts
# engine — envs
cd ~/Projetos/gita-agents/packages/engine && grep -rohE "process\.env\.[A-Z_0-9]+" src | sort -u
Mantenha este doc como fonte única da topologia dos 2 servers. Crons → CRONS.md. Bridge → CHATWOOT-UAZAPI-BRIDGE.md.
Atualizado em 2026-05-26. Atualizar quando rotas, envs ou serviços mudarem.