موصل Supabase
اربط مشروع Supabase الخاص بك لمزامنة سجلات قاعدة البيانات، وبيانات مصادقة المستخدمين، وأحداث تخزين الملفات، والتغييرات الآنية لأتمتة تفاعل العملاء.
نظرة عامة
| الخاصية | القيمة |
|---|---|
| المنصة | Supabase |
| الفئة | قاعدة بيانات وخلفية |
| تعقيد الإعداد | سهل |
| تكامل رسمي | نعم |
| البيانات المُزامَنة | مستخدمون، جداول، تخزين، أحداث |
| المهارات المتاحة | 11 |
| نوع واجهة البرمجة | REST (PostgREST) + Realtime WebSocket |
| الوثائق الرسمية | supabase.com/docs |
الميزات
- واجهة REST API المُولَّدة تلقائيًا, عمليات CRUD على أي جدول Postgres عبر PostgREST، بدون كود
- مزامنة مستخدمي Auth, مزامنة مستخدمي Supabase Auth (البريد الإلكتروني، الهاتف، تسجيلات الدخول الاجتماعية) مع منصة التفاعل الخاصة بك
- الاشتراكات الآنية, الاستماع إلى أحداث INSERT وUPDATE وDELETE على أي جدول في الوقت الفعلي
- أمان مستوى الصف, يحترم جميع الوصول إلى API سياسات RLS في Postgres لبيانات آمنة متعددة المستأجرين
- تكامل التخزين, تتبع تحميل الملفات وإدارة الأصول عبر دلاء التخزين
- وظائف Edge, استدعاء وظائف Deno بدون خادم لمنطق مخصص وwebhooks
- البحث النصي الكامل, الاستفادة من إمكانيات البحث النصي الكامل في Postgres عبر API
المتطلبات الأساسية
قبل البدء، تأكد من توفر ما يلي:
- مشروع Supabase (app.supabase.com)
- عنوان URL الخاص بـ API ومفاتيح API لمشروعك (موجودة في Settings → API)
- حساب Tajo مع وصول إلى API
مفاتيح API
يوفر Supabase مفتاحين: anon (عام، يحترم RLS) وservice_role (يتجاوز RLS، وصول مسؤول). استخدم service_role للتكاملات من جانب الخادم وanon من جانب العميل.
المصادقة
يستخدم Supabase مصادقة مفتاح API. يتطلب كل طلب ترويسة apikey واختياريًا رمز Authorization bearer للوصول المُقيد بالمستخدم.
# 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 بسمات منصة التفاعل:
تعيينات المستخدم الافتراضية
| Parameter | Type | Description |
|---|---|---|
email required | string | البريد الإلكتروني للمستخدم من Supabase Auth (معرّف فريد) |
phone optional | string | رقم الهاتف لتفاعل SMS/WhatsApp |
user_metadata.full_name optional | string | اسم العرض من البيانات الوصفية لمستخدم Auth |
user_metadata.avatar_url optional | string | عنوان URL لصورة الملف الشخصي |
created_at optional | timestamp | الطابع الزمني لإنشاء الحساب |
last_sign_in_at optional | timestamp | أحدث تسجيل دخول لتقييم التفاعل |
app_metadata.provider optional | string | مزود Auth (email، google، github، إلخ) |
confirmed_at optional | timestamp | الطابع الزمني لتأكيد البريد الإلكتروني |
تعيين جدول مخصص
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نقاط نهاية واجهة البرمجة
تُولَّد واجهة REST API الخاصة بـ Supabase تلقائيًا من مخطط قاعدة البيانات في https://<ref>.supabase.co/rest/v1/.
| نقطة النهاية | الطريقة | الوصف |
|---|---|---|
/rest/v1/{table} | GET | استعلام الصفوف بالتصفية والترتيب والتقسيم |
/rest/v1/{table} | POST | إدراج الصفوف (يدعم الجملة والإدراج أو التحديث) |
/rest/v1/{table} | PATCH | تحديث الصفوف المطابقة لعوامل التصفية |
/rest/v1/{table} | DELETE | حذف الصفوف المطابقة لعوامل التصفية |
/rest/v1/rpc/{function} | POST | استدعاء وظيفة Postgres |
/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 | سرد الملفات في الدلو |
/functions/v1/{function_name} | POST | استدعاء وظيفة Edge |
عوامل التصفية
| العامل | الوصف | مثال |
|---|---|---|
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 | ضمن المصفوفة | ?status=in.(active,trial) |
is | التحقق من Null | ?deleted_at=is.null |
الأحداث
أحداث Auth
| الحدث | المحفز | حالة الاستخدام |
|---|---|---|
user.signed_up | تسجيل مستخدم جديد | سلسلة ترحيب |
user.signed_in | تسجيل دخول المستخدم | تتبع النشاط |
user.updated | تغييرات الملف الشخصي | مزامنة البيانات |
user.deleted | حذف الحساب | سير عمل التنظيف |
أحداث قاعدة البيانات (Realtime)
| الحدث | المحفز | حالة الاستخدام |
|---|---|---|
INSERT | تمت إضافة صف جديد | إشعارات الطلبات/العملاء الجديدة |
UPDATE | تم تعديل الصف | سير عمل تغيير الحالة |
DELETE | تمت إزالة الصف | اكتشاف الفقد |
أحداث Webhook
| الحدث | المحفز | حالة الاستخدام |
|---|---|---|
auth.user.created | تسجيل مستخدم عبر webhook | تشغيل التأهيل |
storage.object.created | تم تحميل ملف | معالجة الأصول |
أمثلة على الكود
تهيئة الموصل
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,});مزامنة المستخدمين مع جهات الاتصال
// مزامنة جميع مستخدمي Supabase Auth كجهات اتصالawait tajo.connectors.sync('supabase', { type: 'full', resources: ['users'],});
// مزامنة تزايدية (المستخدمون الجدد/المتغيرون فقط)await tajo.connectors.sync('supabase', { type: 'incremental', resources: ['users'], since: '2024-01-01T00:00:00Z',});الاستماع إلى التغييرات الآنية
// الاشتراك في الطلبات الجديدة لمحفزات التفاعل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) => { // إعادة توجيه إلى Tajo كحدث 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();الاستعلام والتقسيم
// استعلام العملاء حسب الخطة للحملات المستهدفةconst { data: proUsers } = await supabase .from('customers') .select('email, full_name, plan, mrr') .eq('plan', 'pro') .gt('mrr', 100) .order('mrr', { ascending: false });
// المزامنة مع قائمة Brevo لاستهداف الحملاتawait tajo.lists.addContacts(PRO_LIST_ID, proUsers);حدود المعدل
حدود معدل API
تعتمد حدود معدل Supabase على خطتك. الطبقة المجانية: 500 طلب/دقيقة. Pro: 1,000 طلب/ثانية. اتصل بـ Supabase لحدود المؤسسات.
| الخطة | حد المعدل | اتصالات Realtime |
|---|---|---|
| مجاني | 500 طلب/دقيقة | 200 متزامن |
| Pro | 1,000 طلب/ثانية | 500 متزامن |
| Team | 2,000 طلب/ثانية | 1,000 متزامن |
| Enterprise | مخصص | مخصص |
استكشاف الأخطاء وإصلاحها
المشاكل الشائعة
| المشكلة | السبب | الحل |
|---|---|---|
| 401 Unauthorized | مفتاح API غير صالح أو منتهي | تحقق من مفاتيح API في لوحة Supabase → Settings → API |
| 403 Forbidden | سياسة RLS تحظر الوصول | استخدم مفتاح service_role لعمليات المسؤول، أو تحقق من سياسات RLS |
| لا توجد أحداث realtime | Realtime غير مفعَّل للجدول | فعّله في Database → Replication → أضف الجدول إلى النشر |
| نتائج استعلام فارغة | RLS يصفِّي جميع الصفوف | تحقق من أن سياسات RLS تسمح للدور المصادق عليه بالقراءة |
| فشل تحميل التخزين | سياسات الدلو | تحقق من أن دلو التخزين مُعَد كعام أو لديه سياسات RLS صحيحة |
وضع التصحيح
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 من جانب الخادم فقط, لا تكشف عنه أبدًا في كود العميل
- فعّل RLS على جميع الجداول, حتى مع service_role، صمّم بـ RLS للدفاع المتعمق
- استخدم Realtime للمزامنة القائمة على الأحداث, أكثر كفاءة من الاستطلاع للتغييرات
- عمليات مُجمّعة, استخدم الإدراجات بالجملة وعامل
inللعمليات عالية الحجم - عيّن البيانات الوصفية للمستخدم, خزّن الحقول ذات الصلة بالتفاعل في
user_metadataأثناء التسجيل - استخدم Edge Functions لـ webhooks, عالج webhooks الواردة باستخدام Supabase Edge Functions لمعالجة منخفضة الكمون
الأمان
- مصادقة مفتاح API, تتطلب جميع الطلبات مفاتيح API صالحة
- أمان مستوى الصف (RLS), تحكم في الوصول أصلي في Postgres لكل صف
- التحقق من JWT, رموز Auth هي JWTs موقّعة يتم التحقق منها في كل طلب
- SSL/TLS, جميع الاتصالات مشفرة أثناء النقل
- SOC 2 Type II, Supabase متوافق مع SOC 2
- قيود الشبكة, قائمة IP المسموح بها الاختيارية في الخطط المدفوعة