Konektor Supabase
Hubungkan proyek Supabase Anda untuk menyinkronkan record database, data autentikasi pengguna, event penyimpanan file, dan perubahan real-time untuk otomatisasi customer engagement.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | Supabase |
| Kategori | Database & Backend |
| Kompleksitas setup | Mudah |
| Integrasi resmi | Ya |
| Data yang disinkronkan | Pengguna, tabel, storage, event |
| Skill yang tersedia | 11 |
| Tipe API | REST (PostgREST) + Realtime WebSocket |
| Dokumentasi resmi | supabase.com/docs |
Fitur
- REST API yang dibuat otomatis, operasi CRUD pada tabel Postgres mana pun via PostgREST, tanpa perlu kode
- Sinkronisasi pengguna Auth, sinkronkan pengguna Supabase Auth (email, telepon, login sosial) ke platform engagement Anda
- Langganan real-time, dengarkan event INSERT, UPDATE, DELETE pada tabel mana pun secara real-time
- Row Level Security, seluruh akses API menghormati kebijakan RLS Postgres untuk data multi-tenant yang aman
- Integrasi Storage, lacak unggahan file dan kelola aset di seluruh bucket Storage
- Edge Functions, panggil fungsi serverless Deno untuk logika kustom dan webhook
- Pencarian teks penuh, manfaatkan kemampuan full-text search Postgres melalui API
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Sebuah proyek Supabase (app.supabase.com)
- API URL dan API key proyek Anda (tersedia di Settings → API)
- Akun Tajo dengan akses API
API key
Supabase menyediakan dua key: anon (publik, menghormati RLS) dan service_role (melewati RLS, akses admin). Gunakan service_role untuk integrasi sisi server dan anon untuk sisi klien.
Autentikasi
Supabase menggunakan autentikasi API key. Setiap permintaan memerlukan header apikey dan secara opsional token bearer Authorization untuk akses yang dicakup per pengguna.
# 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>"Konfigurasi
Setup dasar
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_DATEPemetaan field
Petakan kolom tabel Supabase ke atribut platform engagement:
Pemetaan pengguna default
| Parameter | Type | Description |
|---|---|---|
email required | string | Email pengguna dari Supabase Auth (identifier unik) |
phone optional | string | Nomor telepon untuk engagement SMS/WhatsApp |
user_metadata.full_name optional | string | Nama tampilan dari metadata pengguna Auth |
user_metadata.avatar_url optional | string | URL gambar profil |
created_at optional | timestamp | Timestamp pembuatan akun |
last_sign_in_at optional | timestamp | Login terakhir untuk penilaian engagement |
app_metadata.provider optional | string | Penyedia Auth (email, google, github, dll.) |
confirmed_at optional | timestamp | Timestamp konfirmasi email |
Pemetaan tabel kustom
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_itemsEndpoint API
REST API Supabase dibuat otomatis dari skema database Anda di https://<ref>.supabase.co/rest/v1/.
| Endpoint | Metode | Deskripsi |
|---|---|---|
/rest/v1/{table} | GET | Mengueri baris dengan filter, pengurutan, dan paginasi |
/rest/v1/{table} | POST | Menyisipkan baris (mendukung bulk dan upsert) |
/rest/v1/{table} | PATCH | Memperbarui baris yang cocok dengan filter |
/rest/v1/{table} | DELETE | Menghapus baris yang cocok dengan filter |
/rest/v1/rpc/{function} | POST | Memanggil fungsi Postgres |
/auth/v1/signup | POST | Membuat pengguna baru |
/auth/v1/token?grant_type=password | POST | Masuk dengan password |
/auth/v1/user | GET | Mengambil pengguna saat ini |
/auth/v1/admin/users | GET | Menampilkan semua pengguna (service_role) |
/storage/v1/object/{bucket}/{path} | POST | Mengunggah file |
/storage/v1/object/list/{bucket} | POST | Menampilkan file dalam bucket |
/functions/v1/{function_name} | POST | Memanggil Edge Function |
Operator filter
| Operator | Deskripsi | Contoh |
|---|---|---|
eq | Sama dengan | ?status=eq.active |
neq | Tidak sama dengan | ?status=neq.deleted |
gt, gte | Lebih besar dari | ?amount=gt.100 |
lt, lte | Lebih kecil dari | ?created_at=lt.2024-01-01 |
like, ilike | Pencocokan pola | ?name=ilike.%john% |
in | Ada dalam array | ?status=in.(active,trial) |
is | Pemeriksaan null | ?deleted_at=is.null |
Event
Event Auth
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
user.signed_up | Registrasi pengguna baru | Rangkaian sambutan |
user.signed_in | Login pengguna | Pelacakan aktivitas |
user.updated | Perubahan profil | Sinkronisasi data |
user.deleted | Penghapusan akun | Alur kerja pembersihan |
Event database (Realtime)
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
INSERT | Baris baru ditambahkan | Notifikasi pesanan/pelanggan baru |
UPDATE | Baris diubah | Alur kerja perubahan status |
DELETE | Baris dihapus | Deteksi churn |
Event webhook
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
auth.user.created | Pendaftaran pengguna via webhook | Memicu onboarding |
storage.object.created | File diunggah | Pemrosesan aset |
Contoh kode
Inisialisasi konektor
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,});Menyinkronkan pengguna ke kontak
// 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',});Mendengarkan perubahan real-time
// 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();Kueri dan segmentasi
// 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);Batas rate
Batas rate API
Batas rate Supabase bergantung pada paket Anda. Paket Free: 500 permintaan/menit. Pro: 1.000 permintaan/detik. Hubungi Supabase untuk batas Enterprise.
| Paket | Batas rate | Koneksi Realtime |
|---|---|---|
| Free | 500 req/menit | 200 bersamaan |
| Pro | 1.000 req/detik | 500 bersamaan |
| Team | 2.000 req/detik | 1.000 bersamaan |
| Enterprise | Kustom | Kustom |
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | API key tidak valid atau kedaluwarsa | Periksa API key di Supabase Dashboard → Settings → API |
| 403 Forbidden | Kebijakan RLS memblokir akses | Gunakan key service_role untuk operasi admin, atau periksa kebijakan RLS |
| Tidak ada event realtime | Realtime belum aktif untuk tabel | Aktifkan di Database → Replication → tambahkan tabel ke publication |
| Hasil kueri kosong | RLS menyaring seluruh baris | Pastikan kebijakan RLS mengizinkan role terautentikasi untuk membaca |
| Unggahan Storage gagal | Kebijakan bucket | Pastikan bucket Storage disetel publik atau memiliki kebijakan RLS yang benar |
Mode debug
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: trueMenguji koneksi
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)Praktik terbaik
- Gunakan key service_role hanya di sisi server, jangan pernah mengeksposnya dalam kode klien
- Aktifkan RLS pada semua tabel, bahkan dengan service_role, rancanglah dengan RLS untuk defense in depth
- Gunakan Realtime untuk sinkronisasi berbasis event, lebih efisien daripada polling untuk perubahan
- Kelompokkan operasi, gunakan bulk insert dan filter
inuntuk operasi bervolume tinggi - Petakan metadata pengguna, simpan field yang relevan untuk engagement di
user_metadatasaat pendaftaran - Gunakan Edge Functions untuk webhook, proses webhook masuk dengan Supabase Edge Functions untuk penanganan berlatensi rendah
Keamanan
- Autentikasi API key, seluruh permintaan memerlukan API key yang valid
- Row Level Security (RLS), kontrol akses native Postgres per baris
- Verifikasi JWT, token Auth berupa JWT bertanda tangan yang diverifikasi pada setiap permintaan
- SSL/TLS, seluruh koneksi dienkripsi saat transit
- SOC 2 Type II, Supabase telah memenuhi kepatuhan SOC 2
- Network Restrictions, allowlist IP opsional pada paket berbayar