📄 SUPABASE_SELF_HOSTED_FIXES.md

← Vault

broker_links 400 — Cloud JWT vs Self-Hosted JWT mismatch (08/jul/2026)

Symptom

POST /rest/v1/broker_links 400 (Bad Request) no DevTools ao adicionar link na página /admin do main site (rochasalesseguros.com.br).

Root Cause — TWO problems

Problema 1: Cloud anon key no bundle principal

Debug Commands

`bash

Verificar anon keys no bundle

sshpass -p 'Marcia19671951@' ssh root@31.97.243.106 \

"grep -o 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\.[a-zA-Z0-9_-]\.[a-zA-Z0-9_-]' \

/opt/rochasales/dist/assets/index-oCPVfdCr.js | sort -u"

Testar POST broker_links com JWT real (via curl + auth real)

TOKEN=$(curl -s "https://rochasalesseguros.com.br/auth/v1/token?grant_type=password" \

-H "Content-Type: application/json" \

-H "apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InJvY2hhc2FsZXMiLCAicm9sZSI6ICJhbm9uIiwgImlhdCI6IDE3ODM0MzM3MjQsICJleHAiOiAxNzg0NjQzMzI0fQ.qfgKlvwdMkvKZp3CubkLC73yPtd5Pv5jOkil1BDsW2w" \

-d '{"email":"tecrochasales@gmail.com","password":"acesso@rochasales"}' \

| python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")

curl -s -X POST "https://rochasalesseguros.com.br/rest/v1/broker_links" \

-H "apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \

-H "Authorization: Bearer $TOKEN" \

-H "Content-Type: application/json" -H "Prefer: return=representation" \

-d '{"title":"Teste","url":"https://teste.com","is_active":true,"display_order":99}'

Ver triggers da tabela

docker exec deploy-vps-db-1 psql -U supabase_admin -d postgres -c \

"SELECT trigger_name, action_statement FROM information_schema.triggers WHERE event_object_table = 'broker_links';"

Verificar PostgREST JWT config

docker exec deploy-vps-rest-1 sh -c 'echo $PGRST_DB_VERIFY_JWT $PGRST_JWT_SECRET'

`

Self-hosted Anon Key (atual, Jul 2026)

`

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InJvY2hhc2FsZXMiLCAicm9sZSI6ICJhbm9uIiwgImlhdCI6IDE3ODM0MzM3MjQsICJleHAiOiAxNzg0NjQzMzI0fQ.qfgKlvwdMkvKZp3CubkLC73yPtd5Pv5jOkil1BDsW2w

`

(iat: 1783433724 = Jul 2026, ref: rochasales)

PostgREST Config

`

PGRST_DB_VERIFY_JWT=false

PGRST_JWT_SECRET=OyIoGm...xXs4 (JWT_SECRET do GoTrue)

PGRST_DB_ANON_ROLE=anon

`

Lessons

1. PGRST_DB_VERIFY_JWT=false não significa "aceita qualquer JWT" — PostgREST ainda tenta decodificar o JWT e rejeita se o formato/claims forem incompatíveis

2. Mesmo com JWT correto, constraint NOT NULL sem default/trigger quebra INSERTs

3. Bundle do main site (/opt/rochasales/dist/) é SEPARADO do ComercialRS (/var/www/comercialrs/dist/) — cada um tem seu próprio JS com suas próprias chaves

4. Two separate docker-compose networks: deploy-vps_ containers vs rochasales- containers — cada um com seu próprio Kong + PostgREST