Supabase Connector

เชื่อมต่อ Supabase project ของคุณเพื่อซิงค์ database records ข้อมูลการยืนยันตัวตนผู้ใช้ เหตุการณ์ file storage และการเปลี่ยนแปลงแบบเรียลไทม์สำหรับระบบอัตโนมัติการมีส่วนร่วมกับลูกค้า

ภาพรวม

คุณสมบัติค่า
แพลตฟอร์มSupabase
หมวดหมู่Database & Backend
ความซับซ้อนในการตั้งค่าง่าย
การผสานรวมอย่างเป็นทางการใช่
ข้อมูลที่ซิงค์ผู้ใช้ Tables Storage เหตุการณ์
ทักษะที่ใช้ได้11
ประเภท APIREST (PostgREST) + Realtime WebSocket
เอกสารทางการsupabase.com/docs

ฟีเจอร์

  • REST API ที่สร้างอัตโนมัติ - การดำเนินการ CRUD บน Postgres table ใดก็ได้ผ่าน PostgREST ไม่ต้องเขียนโค้ด
  • การซิงค์ผู้ใช้ Auth - ซิงค์ผู้ใช้ Supabase Auth (อีเมล โทรศัพท์ social logins) ไปยังแพลตฟอร์ม engagement ของคุณ
  • Real-time subscriptions - รับฟังเหตุการณ์ INSERT, UPDATE, DELETE บน table ใดก็ได้แบบเรียลไทม์
  • Row Level Security - การเข้าถึง API ทั้งหมดเป็นไปตาม Postgres RLS policies สำหรับข้อมูล multi-tenant ที่ปลอดภัย
  • การผสานรวม Storage - ติดตามการอัปโหลดไฟล์และจัดการ assets ใน Storage buckets
  • Edge Functions - เรียก serverless Deno functions สำหรับ custom logic และ webhooks
  • Full-text search - ใช้ความสามารถ full-text search ของ Postgres ผ่าน API

ข้อกำหนดเบื้องต้น

ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:

  1. Supabase project (app.supabase.com)
  2. API URL และ API keys ของ project (พบได้ใน Settings → API)
  3. บัญชี Tajo ที่มีสิทธิ์เข้าถึง API

API Keys

Supabase มีสอง keys: anon (สาธารณะ เป็นไปตาม RLS) และ service_role (ข้ามผ่าน RLS สิทธิ์ admin) ใช้ service_role สำหรับการผสานรวมฝั่งเซิร์ฟเวอร์ และ anon สำหรับฝั่ง client

การยืนยันตัวตน

Supabase ใช้การยืนยันตัวตนด้วย API key คำขอทุกรายการต้องใช้ header apikey และอาจต้องใช้ Authorization bearer token สำหรับการเข้าถึงในขอบเขตผู้ใช้

Terminal window
# 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>"

การกำหนดค่า

การตั้งค่าพื้นฐาน

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_DATE

การแมปฟิลด์

แมปคอลัมน์ Supabase table กับแอตทริบิวต์แพลตฟอร์ม engagement:

การแมปผู้ใช้ค่าเริ่มต้น

Parameter Type Description
email required
string

อีเมลผู้ใช้จาก Supabase Auth (ตัวระบุที่ไม่ซ้ำกัน)

phone optional
string

หมายเลขโทรศัพท์สำหรับการ engagement ผ่าน SMS/WhatsApp

user_metadata.full_name optional
string

ชื่อแสดงจาก Auth user metadata

user_metadata.avatar_url optional
string

URL รูปโปรไฟล์

created_at optional
timestamp

timestamp การสร้างบัญชี

last_sign_in_at optional
timestamp

การเข้าสู่ระบบครั้งล่าสุดสำหรับการให้คะแนน engagement

app_metadata.provider optional
string

ผู้ให้บริการ Auth (email, google, github ฯลฯ)

confirmed_at optional
timestamp

timestamp การยืนยันอีเมล

การแมป Custom Table

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_items

API Endpoints

Supabase REST API สร้างอัตโนมัติจาก database schema ของคุณที่ https://<ref>.supabase.co/rest/v1/

Endpointเมธอดคำอธิบาย
/rest/v1/{table}GETQuery rows พร้อม filtering, ordering, pagination
/rest/v1/{table}POSTแทรก rows (รองรับ bulk และ upsert)
/rest/v1/{table}PATCHอัปเดต rows ที่ตรงกับตัวกรอง
/rest/v1/{table}DELETEลบ rows ที่ตรงกับตัวกรอง
/rest/v1/rpc/{function}POSTเรียก Postgres function
/auth/v1/signupPOSTสร้างผู้ใช้ใหม่
/auth/v1/token?grant_type=passwordPOSTลงชื่อเข้าใช้ด้วยรหัสผ่าน
/auth/v1/userGETดูผู้ใช้ปัจจุบัน
/auth/v1/admin/usersGETแสดงรายการผู้ใช้ทั้งหมด (service_role)
/storage/v1/object/{bucket}/{path}POSTอัปโหลดไฟล์
/storage/v1/object/list/{bucket}POSTแสดงรายการไฟล์ใน bucket
/functions/v1/{function_name}POSTเรียก Edge Function

ตัวดำเนินการกรอง

ตัวดำเนินการคำอธิบายตัวอย่าง
eqเท่ากับ?status=eq.active
neqไม่เท่ากับ?status=neq.deleted
gt, gteมากกว่า?amount=gt.100
lt, lteน้อยกว่า?created_at=lt.2024-01-01
like, ilikeจับคู่รูปแบบ?name=ilike.%john%
inใน array?status=in.(active,trial)
isตรวจสอบ null?deleted_at=is.null

เหตุการณ์

เหตุการณ์ Auth

เหตุการณ์ทริกเกอร์กรณีใช้งาน
user.signed_upการลงทะเบียนผู้ใช้ใหม่ชุดอีเมลต้อนรับ
user.signed_inผู้ใช้เข้าสู่ระบบการติดตามกิจกรรม
user.updatedการเปลี่ยนแปลงโปรไฟล์การซิงค์ข้อมูล
user.deletedการลบบัญชีเวิร์กโฟลว์ cleanup

เหตุการณ์ Database (Realtime)

เหตุการณ์ทริกเกอร์กรณีใช้งาน
INSERTเพิ่ม row ใหม่การแจ้งเตือนคำสั่งซื้อ/ลูกค้าใหม่
UPDATEแก้ไข rowเวิร์กโฟลว์เปลี่ยนแปลงสถานะ
DELETEลบ rowการตรวจจับ churn

เหตุการณ์ Webhook

เหตุการณ์ทริกเกอร์กรณีใช้งาน
auth.user.createdUser signup ผ่าน webhookทริกเกอร์ onboarding
storage.object.createdอัปโหลดไฟล์การประมวลผล asset

ตัวอย่างโค้ด

เริ่มต้น Connector

import { TajoClient } from '@tajo/sdk';
import { createClient } from '@supabase/supabase-js';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
});
// Connect Supabase project
await tajo.connectors.connect('supabase', {
projectUrl: process.env.SUPABASE_URL,
serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
});

ซิงค์ผู้ใช้เป็นผู้ติดต่อ

// Sync all Supabase Auth users as contacts
await 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',
});

รับฟังการเปลี่ยนแปลงแบบเรียลไทม์

// Subscribe to new orders for engagement triggers
const 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();

Query และแบ่งกลุ่ม

// Query customers by plan for targeted campaigns
const { 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 targeting
await tajo.lists.addContacts(PRO_LIST_ID, proUsers);

ขีดจำกัดอัตรา

ขีดจำกัดอัตรา API

ขีดจำกัดอัตราของ Supabase ขึ้นอยู่กับแผนของคุณ Free tier: 500 คำขอ/นาที Pro: 1,000 คำขอ/วินาที ติดต่อ Supabase สำหรับขีดจำกัด Enterprise

แผนขีดจำกัดอัตราการเชื่อมต่อ Realtime
Free500 คำขอ/นาที200 พร้อมกัน
Pro1,000 คำขอ/วินาที500 พร้อมกัน
Team2,000 คำขอ/วินาที1,000 พร้อมกัน
Enterpriseกำหนดเองกำหนดเอง

การแก้ไขปัญหา

ปัญหาทั่วไป

ปัญหาสาเหตุวิธีแก้
401 UnauthorizedAPI key ไม่ถูกต้องหรือหมดอายุตรวจสอบ API keys ใน Supabase Dashboard → Settings → API
403 ForbiddenRLS policy บล็อกการเข้าถึงใช้ key service_role สำหรับการดำเนินการ admin หรือตรวจสอบ RLS policies
ไม่มีเหตุการณ์ realtimeRealtime ไม่ได้เปิดใช้งานสำหรับ tableเปิดใช้งานใน Database → Replication → เพิ่ม table ใน publication
ผล query ว่างเปล่าRLS กรองทุก rowsตรวจสอบว่า RLS policies อนุญาตให้ role ที่ยืนยันตัวตนอ่านได้
การอัปโหลด storage ล้มเหลวBucket policiesตรวจสอบว่า Storage bucket เป็น public หรือมี RLS policies ที่ถูกต้อง

โหมด Debug

connectors:
supabase:
debug: true
log_level: verbose
log_queries: true
log_realtime: true

ทดสอบการเชื่อมต่อ

Terminal window
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)

แนวทางปฏิบัติที่ดีที่สุด

  1. ใช้ service_role key ฝั่งเซิร์ฟเวอร์เท่านั้น - อย่าเปิดเผยในโค้ด client
  2. เปิดใช้งาน RLS บนทุก tables - แม้แต่กับ service_role ออกแบบด้วย RLS เพื่อการป้องกันเชิงลึก
  3. ใช้ Realtime สำหรับ event-driven sync - มีประสิทธิภาพมากกว่าการ polling สำหรับการเปลี่ยนแปลง
  4. Batch operations - ใช้ bulk inserts และตัวกรอง in สำหรับการดำเนินการปริมาณสูง
  5. แมป user metadata - เก็บฟิลด์ที่เกี่ยวข้องกับ engagement ใน user_metadata ระหว่างการลงทะเบียน
  6. ใช้ Edge Functions สำหรับ webhooks - ประมวลผล incoming webhooks ด้วย Supabase Edge Functions เพื่อการจัดการ latency ต่ำ

ความปลอดภัย

  • การยืนยันตัวตนด้วย API Key - คำขอทั้งหมดต้องใช้ API keys ที่ถูกต้อง
  • Row Level Security (RLS) - การควบคุมการเข้าถึงต่อ row แบบ Postgres-native
  • การตรวจสอบ JWT - Auth tokens เป็น JWTs ที่ลายเซ็นและตรวจสอบในทุกคำขอ
  • SSL/TLS - การเชื่อมต่อทั้งหมดเข้ารหัสระหว่างการส่ง
  • SOC 2 Type II - Supabase สอดคล้องกับ SOC 2
  • Network Restrictions - IP allowlisting เสริมสำหรับแผนที่ชำระเงิน

แหล่งข้อมูลที่เกี่ยวข้อง

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
ผู้ช่วย AI

สวัสดี! ถามฉันเกี่ยวกับเอกสารได้เลย