موصل Supabase
حالة الموصل: مخطط له لم يُبنَ بعد. لا يشغّل Tajo هذا الموصل اليوم.
رسم توضيحي · بيانات تجريبية
مثال على المزامنة
المصدر
Supabase
حالة الموصل: مخطط له
الوجهة
أداتك الأخرى
حالة الموصل: أداة مخصصة
ربط الحقول
| حقل المصدر | حقل الوجهة | قيمة نموذجية |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- الصياغة
- راجع سجلاً واحداً
- اعتمد هذه النسخة
تصف الحالات كل موصل على حدة، ولا تضمن جاهزية هذه المزامنة. حقول توضيحية. راجع المخطط الفعلي والأذونات قبل تشغيل المزامنة.
اربط مشروع 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 المسموح بها الاختيارية في الخطط المدفوعة