ComercialRS — Bug Report & Fixes
> Updated: 2026-07-20
Bugs Corrigidos
Bug #1 — Reuniões para Remarketing ✅ CORRIGIDO
Causa raiz: Botão WhatsApp clicado → verify_responsible_for_task rejeitava porque não fazia fallback para client_phone.
Fix:
- - Adicionado
client_phone textà tabelapublic.tasks - - Backfill: 323 tasks populadas a partir de
message_log - - Handler de clique de botão:
verify_responsible_for_task→verify_client_for_task(task_id, from_phone)com fallback - - Handler de reply com
context.id: adicionado phone fallback - - Handler de reply sem
context.id: adicionado bloco de fallback completo - - Kong (
rochasales-kong-1) intercepta/functions/v1/*→ route comstrip_path: true→ Kong →http://172.28.0.1:9000(Deno no host) - - Deno v5 (
/tmp/main_server_v5.ts) слушает port 9000, usa PostgreSQL direto (172.23.0.7:5432), não passa pelo Supabase Cloud - - Arquivos:
/tmp/main_server_v5.tsno VPS host - -
POST /functions/v1/main(com action: create, list, delete, reset-password, update-profile) - -
POST /functions/v1/admin-update-user-email(sem auth, atualizaauth.usersEprofiles) - -
POST /functions/v1/admin-reset-user-password(sem auth, usa bcryptjs para hash)
Bug #2 — UPSERT DO NOTHING ✅ CORRIGIDO
Causa raiz: log_reply() usava ON CONFLICT DO NOTHING — silenciosamente falhava se incoming_messages ainda não existisse.
Fix: Mudado para UPSERT com COALESCE para todos os campos.
Bug #3 — (mesma causa de #1 e #2) ✅ CORRIGIDO
Bug #4 — Keywords já funcionavam ✅ NÃO É BUG
Bug #5 — Polling setInterval(15000) ✅ NÃO É BUG
Bug #6 — full_name NULL ✅ CORRIGIDO
4 perfis corrigidos: profiles.full_name atualizado a partir de team_members.name.
Bug #7 — 4 statuses = 4 colunas ✅ NÃO É BUG
Bug #9 — Cliente rejeitado ao clicar botão ✅ CORRIGIDO
Causa raiz: verify_responsible_for_task não buscava por client_phone.
Fix: Nova função verify_client_for_task(task_id, from_phone) — busca tasks.client_phone.
Bug #10 — 93 tasks sem client_phone ✅ INVESTIGADO (não auto-corrigível)
Todas são anteriores a 22/mai/2026. Sem message_log associável.手动追踪 required.
Bug #11 — Edge Function 500 + Login Carol ❌ CORRIGIDO (parcial)
#### Problema A: Edge Function main returning 500
Causa raiz: supabase/edge-runtime:v1.58.3 Docker crashava com "failed to read path" — imagem incompatível.
Solução: Deno nativo no VPS host (não em Docker).
Arquitetura atual:
Handlers disponíveis:
#### Problema B: Carol não conseguia fazer login
Causa raiz: A password da Carol estava guardada com SHA-256 (handler antigo do Deno v3) mas o GoTrue espera bcrypt.
Solução: Password re-definida com bcrypt diretamente na DB (auth.users).
Como fazer reset de password no futuro:
1. O Deno v5 usa bcryptjs (CDN: https://cdn.skypack.dev/bcryptjs) para fazer hash bcrypt
2. handleAdminResetPassword faz UPDATE auth.users SET encrypted_password =
3. O login no browser vai para /auth/v1/token?grant_type=password → Kong → deploy-vps-auth-1:9999 (GoTrue self-hosted) → verifica contra bcrypt
Nota importante: O GoTrue self-hosted usa VERIFY_JWT=false — tokens Cloud não são verificados no Admin API.
Bug #8 — WhatsApp Phone ID ❌ PENDENTE
Falta confirmar o Phone ID da conta WhatsApp Business.
Arquitetura Atual
Deno Edge Runtime (VPS Host)
`
Deno process: /root/.deno/bin/deno run --allow-net --allow-read=/tmp /tmp/main_server_v5.ts
Port: 9000
PID check: fuser 9000/tcp
Restart: fuser -k 9000/tcp && nohup /root/.deno/bin/deno run ... > /tmp/main_server_v5.log 2>&1 &
`
Kong Routing
`
/functions/v1/* → strip_path: true → http://172.28.0.1:9000 (Deno host)
/auth/v1/* → http://deploy-vps-auth-1:9999 (GoTrue self-hosted)
/rest/v1/* → http://deploy-vps-rest-1:3000 (PostgREST)
/realtime/v1/* → http://deploy-vps-realtime-1:4000/socket
`
GoTrue Self-Hosted
`
Container: deploy-vps-auth-1 (supabase/gotrue:v2.99.0)
IP: 172.23.0.2:9999
DB: 172.23.0.7:5432 (search_path=auth,public)
JWT_SECRET: OyIoGm...xXs4
VERIFY_JWT: false
`
PostgreSQL (Self-Hosted)
`
Container: root-postgres-1
IP: 172.23.0.7:5432
User: postgres
Password: tSm?p8n57f+TX5n
Database: postgres
Auth schema: auth (search_path=auth,public)
`
Supabase Cloud (apenas para browser sessions)
`
Project ref: dauftiqcvgaydddoxqhh
URL: https://dauftiqcvgaydddoxqhh.supabase.co
ANON_KEY: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InJvY2hhc2FsZXMiLCJyb2xlIjoiYW5vbiIsImlhdCI6MTc4MzQzMzcyNCwiZXhwIjoxNzg0NjQzMzI0fQ.qfgKlvwdMkvKZp3CubkLC73yPtd5Pv5jOkil1BDsW2w
`
Importante: Cloud está bloqueado por exceed_egress_quota — Edge Functions Cloud retornam 402. Todas as operações vão pelo Deno + self-hosted.
Pendentes
1. Bug #8: Confirmar WhatsApp Phone ID com responsável Meta
2. Realtime WebSocket 500: deploy-vps-realtime-1 tem REALTIME_API_JWT_SECRET=* (GoTrue key) mas tokens Cloud usam key diferente. Causa: ArgumentError: incorrect padding` no decode JWT.
3. Bug #10: 93 tasks sem client_phone — todas anteriores a 22/mai/2026, sem message_log associável
Sistema de Notificações WhatsApp (Dispatch VPS)
> Updated: 2026-07-22
Arquitetura
`
ComercialRS (Lovable/VPS)
↓ escribe
Self-hosted Supabase (deploy-vps-db-1:5432)
↓
dispatch_vps.py (cron 1 min) → Meta WhatsApp Business API
↓
Notificações nova_reuniao_criada → corretores
`
Arquivos
| File | Role | |
| ------ | ------ | |
/var/www/comercialrs/data/dispatch_vps.py | Dispatch principal — cron 1 min, conecta DB self-hosted | |
/var/www/comercialrs/data/backfill_notifications.py | Backfill pontual — envia pendentes das últimas 8h | |
/var/www/comercialrs/data/dispatch_cron.log | Log do cron (stdout/stderr) | |
/var/www/comercialrs/data/backfill_cron.log | Log do backfill | |
/var/www/comercialrs/data/dispatch_vps.log | Log Python do dispatch principal | |
| Nome | Phone | Role |
| ------ | ------- | ------ |
| Carol | 5511925080819 | member |
| Nayara | 5511992285063 | broker |
| Madu | 5511915143146 | corretor |
| Victoria | 5511983877212 | broker |
| Rafael | 5511989793356 | member |
| Vinicius | 5511983928504 | manager |
| Raiany | 11944404184 | member |
| Davi | 11913412661 | manager |
| Michael | 5511980267689 | broker (telefone com 12 dígitos — possivelmente falta 1) |
| Pietra | _(sem fone)_ | admin |
| Rayca | _(sem fone)_ | pre_sales |
Meta API
`
Token: EAASNGf6ucRcBRYZC7BtZAZBKnRjDTUwkTRpPgRw1jZALy7mQxiUTf6a7zJt7BvLj9iYsht7PtphRfDp9BjgyzjUNmJUru0yTVpzVc2EZCFxbRJID052my8IynikcjOeLAuuuXCFcE9SMKTWEdNUpnS4ltpJK4iD8d3ZAckIZBffhvrBmVFDIkmU3t1eg99klwZDZD
Phone ID: 812251211981254
WABA ID: 532448808878595
Template: nova_reuniao_criada (6 body params: broker_name, due_str, title, " ", " ", " ")
`
Resultado backfill 22/jul/2026
13 notificações enviadas com sucesso, 0 falhas.
Crons
`bash
Cron dispatch (1 min)
* cd /var/www/comercialrs/data && python3 dispatch_vps.py >> dispatch_cron.log 2>&1
Rodar backfill manualmente
cd /var/www/comercialrs/data && nohup python3 backfill_notifications.py >> backfill_cron.log 2>&1 &
`
Nota sobre Supabase Cloud
O Cloud (db.dauftiqcvgaydddoxqhh.supabase.co) está desactualizado — tem dados antigos (Ilano em vez de Carol, Maju que não existe, Nayara com phone errado). O ComercialRS (Lovable) escreve no self-hosted. Nunca usar o Cloud como fonte para dispatch.
Comandos Úteis
`bash
Ver se Deno está a correr
ssh root@31.97.243.106 "fuser 9000/tcp"
Reiniciar Deno
ssh root@31.97.243.106 "fuser -k 9000/tcp 2>/dev/null; sleep 1; nohup /root/.deno/bin/deno run --allow-net --allow-read=/tmp /tmp/main_server_v5.ts > /tmp/main_server_v5.log 2>&1 & sleep 3; cat /tmp/main_server_v5.log"
Testar login Carol (via Kong)
curl -s -X POST https://comercialrs.rochasalesseguros.com.br/auth/v1/token?grant_type=password \
-H 'Content-Type: application/json' \
-d '{"email":"carol@rochasales.com.br","password":"acesso@rochasales"}'
Reset password via API (futuro)
curl -s -X POST https://comercialrs.rochasalesseguros.com.br/functions/v1/admin-reset-user-password \
-H 'Content-Type: application/json' \
-d '{"user_id":"
Atualizar email (duas tabelas)
curl -s -X POST https://comercialrs.rochasalesseguros.com.br/functions/v1/admin-update-user-email \
-H 'Content-Type: application/json' \
-d '{"user_id":"
Ver logs Deno
ssh root@31.97.243.106 "tail -20 /tmp/main_server_v5.log"
Ver container GoTrue auth
ssh root@31.97.243.106 "docker ps | grep auth"
DB: verificar password Carol (bcrypt)
python3 -c "import bcrypt; print(bcrypt.hashpw('senha'.encode(), bcrypt.gensalt(rounds=10)).decode())"
DB: fazer reset password Carol diretamente
docker run --rm --network container:rochasales-kong-1 -v /tmp/do_fix_carol.py:/tmp/do_fix_carol.py:ro python:3.11-slim bash /tmp/do_fix_carol.py
`