Supabase конектор
Свържи своя проект в Supabase, за да синхронизираш записи от базата данни, данни за потребителска автентикация, събития от file storage и промени в реално време за автоматизация на ангажирането на клиентите.
Преглед
| Свойство | Стойност |
|---|---|
| Платформа | Supabase |
| Категория | Database & Backend |
| Сложност на настройка | Лесна |
| Официална интеграция | Да |
| Синхронизирани данни | Потребители, таблици, Storage, събития |
| Налични скилове | 11 |
| Тип на API | REST (PostgREST) + Realtime WebSocket |
| Официална документация | supabase.com/docs |
Функции
- Автоматично генериран REST API, CRUD операции върху всяка Postgres таблица чрез PostgREST, без код
- Синхронизация на Auth потребители, Синхронизирай Supabase Auth потребителите (имейл, телефон, social logins) към твоята ангажираща платформа
- Абонаменти в реално време, Слушай INSERT, UPDATE, DELETE събития върху всяка таблица в реално време
- Row Level Security, Целият API достъп спазва Postgres RLS политиките за сигурни multi-tenant данни
- Интеграция със Storage, Проследявай качвания на файлове и управлявай активи в Storage bucket-ите
- Edge Functions, Извиквай serverless Deno функции за персонализирана логика и уебхуци
- Full-text search, Използвай възможностите за full-text търсене на Postgres през API
Предварителни условия
Преди да започнеш, увери се, че имаш:
- Проект в Supabase (app.supabase.com)
- API URL и API ключовете на проекта (намират се в Settings → API)
- Акаунт в Tajo с API достъп
API ключове
Supabase предоставя два ключа: anon (публичен, спазва RLS) и service_role (заобикаля RLS, администраторски достъп). Използвай service_role за server-side интеграции и anon за client-side.
Автентикация
Supabase използва автентикация с API ключ. Всяка заявка изисква хедъра 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 таблици към атрибути на ангажиращата платформа:
Мапвания по подразбиране за потребители
| Parameter | Type | Description |
|---|---|---|
email required | string | Имейл на потребителя от Supabase Auth (уникален идентификатор) |
phone optional | string | Телефонен номер за SMS/WhatsApp ангажиране |
user_metadata.full_name optional | string | Display име от Auth user metadata |
user_metadata.avatar_url optional | string | URL на профилното изображение |
created_at optional | timestamp | Timestamp на създаване на акаунта |
last_sign_in_at optional | timestamp | Последен login за engagement scoring |
app_metadata.provider optional | string | Auth доставчик (email, google, github и др.) |
confirmed_at optional | timestamp | 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_itemsAPI крайни точки
Supabase REST API се генерира автоматично от схемата на базата ти на https://<ref>.supabase.co/rest/v1/.
| Крайна точка | Метод | Описание |
|---|---|---|
/rest/v1/{table} | GET | Заявка за редове с филтриране, сортиране, пагинация |
/rest/v1/{table} | POST | Вмъкване на редове (поддържа bulk и upsert) |
/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 | Списък с файлове в 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 | В масив | ?status=in.(active,trial) |
is | Проверка за null | ?deleted_at=is.null |
Събития
Auth събития
| Събитие | Тригер | Случай на употреба |
|---|---|---|
user.signed_up | Регистрация на нов потребител | Welcome серия |
user.signed_in | Потребителски login | Проследяване на активност |
user.updated | Промени в профила | Синхронизация на данни |
user.deleted | Изтриване на акаунт | Cleanup работни потоци |
Събития от базата данни (Realtime)
| Събитие | Тригер | Случай на употреба |
|---|---|---|
INSERT | Добавен нов ред | Известия за нова поръчка/клиент |
UPDATE | Модифициран ред | Работни потоци при промяна на статус |
DELETE | Премахнат ред | Откриване на churn |
Уебхук събития
| Събитие | Тригер | Случай на употреба |
|---|---|---|
auth.user.created | Потребителска регистрация чрез уебхук | Тригер на onboarding |
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,});Синхронизация на потребители към контакти
// 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 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 rate limits
Supabase rate limits зависят от плана. Free tier: 500 заявки/минута. Pro: 1 000 заявки/секунда. Свържи се със Supabase за Enterprise лимити.
| План | Rate limit | Realtime връзки |
|---|---|---|
| Free | 500 заявки/мин | 200 едновременни |
| Pro | 1 000 заявки/сек | 500 едновременни |
| Team | 2 000 заявки/сек | 1 000 едновременни |
| Enterprise | Персонализиран | Персонализиран |
Отстраняване на проблеми
Чести проблеми
| Проблем | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Невалиден или изтекъл API ключ | Провери API ключовете в Supabase Dashboard → Settings → API |
| 403 Forbidden | RLS политика блокира достъпа | Използвай service_role ключ за администраторски операции или провери RLS политиките |
| Няма realtime събития | Realtime не е активиран за таблицата | Активирай от Database → Replication → добави таблицата към publication |
| Празни резултати от заявка | RLS филтрира всички редове | Провери дали RLS политиките позволяват на автентикираната роля да чете |
| Неуспешно качване в Storage | Политики на bucket-а | Провери дали Storage bucket е публичен или има правилни 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 ключа само на сървъра, Никога не го излагай в client код
- Активирай RLS на всички таблици, Дори със service_role, проектирай с RLS за защита в дълбочина
- Използвай Realtime за event-driven синхронизация, По-ефективно от polling за промени
- Пакетирай операциите, Използвай bulk inserts и филтъра
inза операции с голям обем - Мапвай user metadata, Съхранявай поле, релевантни за ангажиране, в
user_metadataпри регистрация - Използвай Edge Functions за уебхуци, Обработвай входящи уебхуци с Supabase Edge Functions за обработка с ниска латентност
Сигурност
- Автентикация с API ключ, Всички заявки изискват валидни API ключове
- Row Level Security (RLS), Postgres-нативен контрол на достъпа на ниво ред
- Верификация на JWT, Auth tokens са подписани JWT-и, верифицирани при всяка заявка
- SSL/TLS, Всички връзки са криптирани при пренос
- SOC 2 Type II, Supabase е SOC 2 съвместим
- Мрежови ограничения, Опционално IP allowlisting на платените планове