Supabase Connector
เชื่อมต่อ Supabase project ของคุณเพื่อซิงค์ database records ข้อมูลการยืนยันตัวตนผู้ใช้ เหตุการณ์ file storage และการเปลี่ยนแปลงแบบเรียลไทม์สำหรับระบบอัตโนมัติการมีส่วนร่วมกับลูกค้า
ภาพรวม
| คุณสมบัติ | ค่า |
|---|---|
| แพลตฟอร์ม | Supabase |
| หมวดหมู่ | Database & Backend |
| ความซับซ้อนในการตั้งค่า | ง่าย |
| การผสานรวมอย่างเป็นทางการ | ใช่ |
| ข้อมูลที่ซิงค์ | ผู้ใช้ Tables Storage เหตุการณ์ |
| ทักษะที่ใช้ได้ | 11 |
| ประเภท API | REST (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
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:
- Supabase project (app.supabase.com)
- API URL และ API keys ของ project (พบได้ใน Settings → API)
- บัญชี Tajo ที่มีสิทธิ์เข้าถึง API
API Keys
Supabase มีสอง keys: anon (สาธารณะ เป็นไปตาม RLS) และ service_role (ข้ามผ่าน RLS สิทธิ์ admin) ใช้ service_role สำหรับการผสานรวมฝั่งเซิร์ฟเวอร์ และ anon สำหรับฝั่ง client
การยืนยันตัวตน
Supabase ใช้การยืนยันตัวตนด้วย API key คำขอทุกรายการต้องใช้ header apikey และอาจต้องใช้ Authorization bearer token สำหรับการเข้าถึงในขอบเขตผู้ใช้
# 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_itemsAPI Endpoints
Supabase REST API สร้างอัตโนมัติจาก database schema ของคุณที่ https://<ref>.supabase.co/rest/v1/
| Endpoint | เมธอด | คำอธิบาย |
|---|---|---|
/rest/v1/{table} | GET | Query 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/signup | POST | สร้างผู้ใช้ใหม่ |
/auth/v1/token?grant_type=password | POST | ลงชื่อเข้าใช้ด้วยรหัสผ่าน |
/auth/v1/user | GET | ดูผู้ใช้ปัจจุบัน |
/auth/v1/admin/users | GET | แสดงรายการผู้ใช้ทั้งหมด (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.created | User 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 projectawait tajo.connectors.connect('supabase', { projectUrl: process.env.SUPABASE_URL, serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,});ซิงค์ผู้ใช้เป็นผู้ติดต่อ
// 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',});รับฟังการเปลี่ยนแปลงแบบเรียลไทม์
// 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();Query และแบ่งกลุ่ม
// 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);ขีดจำกัดอัตรา
ขีดจำกัดอัตรา API
ขีดจำกัดอัตราของ Supabase ขึ้นอยู่กับแผนของคุณ Free tier: 500 คำขอ/นาที Pro: 1,000 คำขอ/วินาที ติดต่อ Supabase สำหรับขีดจำกัด Enterprise
| แผน | ขีดจำกัดอัตรา | การเชื่อมต่อ Realtime |
|---|---|---|
| Free | 500 คำขอ/นาที | 200 พร้อมกัน |
| Pro | 1,000 คำขอ/วินาที | 500 พร้อมกัน |
| Team | 2,000 คำขอ/วินาที | 1,000 พร้อมกัน |
| Enterprise | กำหนดเอง | กำหนดเอง |
การแก้ไขปัญหา
ปัญหาทั่วไป
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| 401 Unauthorized | API key ไม่ถูกต้องหรือหมดอายุ | ตรวจสอบ API keys ใน Supabase Dashboard → Settings → API |
| 403 Forbidden | RLS policy บล็อกการเข้าถึง | ใช้ key service_role สำหรับการดำเนินการ admin หรือตรวจสอบ RLS policies |
| ไม่มีเหตุการณ์ realtime | Realtime ไม่ได้เปิดใช้งานสำหรับ 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ทดสอบการเชื่อมต่อ
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)แนวทางปฏิบัติที่ดีที่สุด
- ใช้ service_role key ฝั่งเซิร์ฟเวอร์เท่านั้น - อย่าเปิดเผยในโค้ด client
- เปิดใช้งาน RLS บนทุก tables - แม้แต่กับ service_role ออกแบบด้วย RLS เพื่อการป้องกันเชิงลึก
- ใช้ Realtime สำหรับ event-driven sync - มีประสิทธิภาพมากกว่าการ polling สำหรับการเปลี่ยนแปลง
- Batch operations - ใช้ bulk inserts และตัวกรอง
inสำหรับการดำเนินการปริมาณสูง - แมป user metadata - เก็บฟิลด์ที่เกี่ยวข้องกับ engagement ใน
user_metadataระหว่างการลงทะเบียน - ใช้ 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 เสริมสำหรับแผนที่ชำระเงิน