Conector Supabase
Conectați proiectul Supabase pentru a sincroniza înregistrările din baza de date, datele de autentificare a utilizatorilor, evenimentele de stocare a fișierelor și modificările în timp real pentru automatizarea implicării clienților.
Prezentare generală
| Proprietate | Valoare |
|---|---|
| Platformă | Supabase |
| Categorie | Bază de date și Backend |
| Complexitate configurare | Ușoară |
| Integrare oficială | Da |
| Date sincronizate | Utilizatori, Tabele, Stocare, Evenimente |
| Skilluri disponibile | 11 |
| Tip API | REST (PostgREST) + WebSocket în timp real |
| Documentație oficială | supabase.com/docs |
Funcționalități
- REST API auto-generat - Operații CRUD pe orice tabelă Postgres prin PostgREST, fără cod necesar
- Sincronizare utilizatori Auth - Sincronizați utilizatorii Supabase Auth (email, telefon, conectări sociale) cu platforma de implicare
- Abonamente în timp real - Ascultați evenimentele INSERT, UPDATE, DELETE pe orice tabelă în timp real
- Securitate la nivel de rând - Toate accesele API respectă politicile RLS Postgres pentru date multi-tenant securizate
- Integrare stocare - Urmăriți încărcările de fișiere și gestionați resursele în bucket-uri Storage
- Funcții Edge - Invocați funcții Deno serverless pentru logică personalizată și webhook-uri
- Căutare full-text - Valorificați capacitățile de căutare full-text Postgres prin API
Cerințe preliminare
Înainte de a începe, asigurați-vă că aveți:
- Un proiect Supabase (app.supabase.com)
- URL-ul API și cheile API ale proiectului (găsite în Settings → API)
- Un cont Tajo cu acces API
Chei API
Supabase oferă două chei: anon (publică, respectă RLS) și service_role (ocolește RLS, acces admin). Utilizați service_role pentru integrările server-side și anon pentru cele client-side.
Autentificare
Supabase utilizează autentificarea cu cheie API. Fiecare cerere necesită antetul apikey și opțional un token Bearer Authorization pentru acces cu scope de utilizator.
# Using anon key (respects RLS)curl 'https://<project_ref>.supabase.co/rest/v1/customers' \ -H "apikey: <SUPABASE_ANON_KEY>" \ -H "Authorization: Bearer <SUPABASE_ANON_KEY>"
# Using service_role key (bypasses RLS)curl 'https://<project_ref>.supabase.co/rest/v1/customers' \ -H "apikey: <SUPABASE_SERVICE_ROLE_KEY>" \ -H "Authorization: Bearer <SUPABASE_SERVICE_ROLE_KEY>"Configurare
Configurare de bază
connectors: supabase: enabled: true project_url: "https://xyzcompany.supabase.co" api_key: "${SUPABASE_SERVICE_ROLE_KEY}"
# Data sync options sync: users: true tables: - customers - orders - products storage: true realtime: true
# Map Supabase Auth users to contacts user_mapping: email: email phone: SMS user_metadata.full_name: FIRSTNAME created_at: SIGNUP_DATEMapare câmpuri
Mapați coloanele tabelelor Supabase la atributele platformei de implicare:
Mapări implicite utilizatori
| Parameter | Type | Description |
|---|---|---|
email required | string | E-mailul utilizatorului din Supabase Auth (identificator unic) |
phone optional | string | Numărul de telefon pentru implicare prin SMS/WhatsApp |
user_metadata.full_name optional | string | Numele de afișare din metadatele utilizatorului Auth |
user_metadata.avatar_url optional | string | URL-ul imaginii de profil |
created_at optional | timestamp | Marca temporală a creării contului |
last_sign_in_at optional | timestamp | Cea mai recentă autentificare pentru scorarea implicării |
app_metadata.provider optional | string | Furnizorul de autentificare (email, google, github, etc.) |
confirmed_at optional | timestamp | Marca temporală a confirmării e-mailului |
Mapare tabelă personalizată
table_mapping: customers: # Column → Attribute mapping email: email full_name: FIRSTNAME company: COMPANY plan: SUBSCRIPTION_PLAN mrr: MONTHLY_REVENUE created_at: SIGNUP_DATE
orders: # Track as events sync_as: events event_name: "order_placed" properties: total: amount status: order_status items: line_itemsPuncte finale API
REST API Supabase este auto-generat din schema bazei de date la https://<ref>.supabase.co/rest/v1/.
| Punct final | Metodă | Descriere |
|---|---|---|
/rest/v1/{table} | GET | Interogați rânduri cu filtrare, ordonare, paginare |
/rest/v1/{table} | POST | Inserați rânduri (suportă bulk și upsert) |
/rest/v1/{table} | PATCH | Actualizați rânduri care corespund filtrelor |
/rest/v1/{table} | DELETE | Ștergeți rânduri care corespund filtrelor |
/rest/v1/rpc/{function} | POST | Apelați o funcție Postgres |
/auth/v1/signup | POST | Creați un utilizator nou |
/auth/v1/token?grant_type=password | POST | Autentificare cu parolă |
/auth/v1/user | GET | Obțineți utilizatorul curent |
/auth/v1/admin/users | GET | Listați toți utilizatorii (service_role) |
/storage/v1/object/{bucket}/{path} | POST | Încărcați fișier |
/storage/v1/object/list/{bucket} | POST | Listați fișierele din bucket |
/functions/v1/{function_name} | POST | Invocați o funcție Edge |
Operatori de filtrare
| Operator | Descriere | Exemplu |
|---|---|---|
eq | Egal | ?status=eq.active |
neq | Diferit | ?status=neq.deleted |
gt, gte | Mai mare decât | ?amount=gt.100 |
lt, lte | Mai mic decât | ?created_at=lt.2024-01-01 |
like, ilike | Potrivire șablon | ?name=ilike.%john% |
in | În tablou | ?status=in.(active,trial) |
is | Verificare null | ?deleted_at=is.null |
Evenimente
Evenimente Auth
| Eveniment | Declanșator | Caz de utilizare |
|---|---|---|
user.signed_up | Înregistrare utilizator nou | Serie de bun venit |
user.signed_in | Autentificare utilizator | Urmărire activitate |
user.updated | Modificări profil | Sincronizare date |
user.deleted | Ștergere cont | Fluxuri de lucru de curățare |
Evenimente bază de date (Timp real)
| Eveniment | Declanșator | Caz de utilizare |
|---|---|---|
INSERT | Rând nou adăugat | Notificări comandă/client nou |
UPDATE | Rând modificat | Fluxuri de lucru de modificare status |
DELETE | Rând eliminat | Detectare churn |
Evenimente Webhook
| Eveniment | Declanșator | Caz de utilizare |
|---|---|---|
auth.user.created | Înregistrare utilizator prin webhook | Declanșare onboarding |
storage.object.created | Fișier încărcat | Procesare resurse |
Exemple de cod
Inițializare conector
import { TajoClient } from '@tajo/sdk';import { createClient } from '@supabase/supabase-js';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY,});
// Connect Supabase projectawait tajo.connectors.connect('supabase', { projectUrl: process.env.SUPABASE_URL, serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,});Sincronizare utilizatori ca contacte
// Sync all Supabase Auth users as contactsawait tajo.connectors.sync('supabase', { type: 'full', resources: ['users'],});
// Incremental sync (new/changed users only)await tajo.connectors.sync('supabase', { type: 'incremental', resources: ['users'], since: '2024-01-01T00:00:00Z',});Ascultare modificări în timp real
// Subscribe to new orders for engagement triggersconst supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY);
supabase .channel('orders') .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'orders' }, async (payload) => { // Forward to Tajo as an event await tajo.events.track({ email: payload.new.customer_email, event: 'order_placed', properties: { order_id: payload.new.id, total: payload.new.total, items: payload.new.line_items, }, }); } ) .subscribe();Interogare și segmentare
// Query customers by plan for targeted campaignsconst { data: proUsers } = await supabase .from('customers') .select('email, full_name, plan, mrr') .eq('plan', 'pro') .gt('mrr', 100) .order('mrr', { ascending: false });
// Sync to a Brevo list for campaign targetingawait tajo.lists.addContacts(PRO_LIST_ID, proUsers);Limite de rată
Limite de rată API
Limitele de rată Supabase depind de planul dvs. Nivel gratuit: 500 cereri/minut. Pro: 1.000 cereri/secundă. Contactați Supabase pentru limitele Enterprise.
| Plan | Limită de rată | Conexiuni în timp real |
|---|---|---|
| Gratuit | 500 cereri/min | 200 concurente |
| Pro | 1.000 cereri/sec | 500 concurente |
| Team | 2.000 cereri/sec | 1.000 concurente |
| Enterprise | Personalizat | Personalizat |
Depanare
Probleme frecvente
| Problemă | Cauză | Soluție |
|---|---|---|
| 401 Neautorizat | Cheie API invalidă sau expirată | Verificați cheile API în Supabase Dashboard → Settings → API |
| 403 Interzis | Politică RLS blochează accesul | Utilizați cheia service_role pentru operații admin sau verificați politicile RLS |
| Niciun eveniment în timp real | Realtime neactivat pentru tabelă | Activați în Database → Replication → adăugați tabela la publicație |
| Rezultate interogare goale | RLS filtrează toate rândurile | Verificați că politicile RLS permit rolului autentificat să citească |
| Încărcare stocare eșuată | Politici bucket | Verificați că bucket-ul Storage este public sau are politici RLS corecte |
Modul de depanare
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: trueTestare conexiune
tajo connectors test supabase# ✓ API connection successful# ✓ Auth endpoint accessible# ✓ Tables readable (12 tables found)# ✓ Storage accessible (3 buckets)# ✓ Realtime connection established# ✓ Edge Functions available (4 functions)Bune practici
- Utilizați cheia service_role doar server-side - Nu o expuneți niciodată în codul client
- Activați RLS pe toate tabelele - Chiar și cu service_role, proiectați cu RLS pentru apărare în profunzime
- Utilizați Realtime pentru sincronizare bazată pe evenimente - Mai eficient decât polling-ul pentru modificări
- Grupați operațiile - Utilizați inserții bulk și filtrul
inpentru operații cu volum mare - Mapați metadatele utilizatorului - Stocați câmpurile relevante pentru implicare în
user_metadatala înregistrare - Utilizați Funcții Edge pentru webhook-uri - Procesați webhook-urile primite cu Supabase Edge Functions pentru gestionare cu latență redusă
Securitate
- Autentificare cu cheie API - Toate cererile necesită chei API valide
- Securitate la nivel de rând (RLS) - Control acces nativ Postgres per rând
- Verificare JWT - Token-urile de autentificare sunt JWT-uri semnate verificate la fiecare cerere
- SSL/TLS - Toate conexiunile criptate în tranzit
- SOC 2 Tip II - Supabase este conform SOC 2
- Restricții de rețea - Allowlisting IP opțional pe planurile plătite