Коннектор Supabase
Подключите проект Supabase для синхронизации записей базы данных, данных аутентификации пользователей, событий файлового хранилища и изменений в реальном времени для автоматизации взаимодействия с клиентами.
Обзор
| Свойство | Значение |
|---|---|
| Платформа | Supabase |
| Категория | Database & Backend |
| Сложность настройки | Простая |
| Официальная интеграция | Да |
| Синхронизируемые данные | Пользователи, таблицы, хранилище, события |
| Доступных скиллов | 11 |
| Тип API | REST (PostgREST) + Realtime WebSocket |
| Официальная документация | supabase.com/docs |
Возможности
- Автогенерируемый REST API, CRUD-операции над любой таблицей Postgres через PostgREST без написания кода
- Синхронизация пользователей Auth, синхронизация пользователей Supabase Auth (email, телефон, социальные логины) с платформой вовлечения
- Подписки реального времени, прослушивание событий INSERT, UPDATE, DELETE в любой таблице в реальном времени
- Row Level Security, весь API-доступ соблюдает политики RLS Postgres для безопасной мультиарендной работы с данными
- Интеграция хранилища, отслеживание загрузки файлов и управление ресурсами в корзинах Storage
- Edge Functions, вызов бессерверных Deno-функций для пользовательской логики и вебхуков
- Полнотекстовый поиск, использование возможностей полнотекстового поиска Postgres через API
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть:
- Проект Supabase (app.supabase.com)
- API URL и API-ключи проекта (в Settings → API)
- Аккаунт Tajo с доступом к API
API Keys
Supabase предоставляет два ключа: anon (публичный, соблюдает RLS) и service_role (обходит RLS, административный доступ). Используйте service_role для серверных интеграций и anon для клиентских.
Аутентификация
Supabase использует аутентификацию по API-ключу. Каждый запрос требует заголовка apikey и опционально Bearer-токена Authorization для пользовательского доступа.
# Использование anon key (соблюдает RLS)curl 'https://<project_ref>.supabase.co/rest/v1/customers' \ -H "apikey: <SUPABASE_ANON_KEY>" \ -H "Authorization: Bearer <SUPABASE_ANON_KEY>"
# Использование service_role key (обходит 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}"
# Параметры синхронизации данных sync: users: true tables: - customers - orders - products storage: true realtime: true
# Сопоставление пользователей Supabase Auth с контактами user_mapping: email: email phone: SMS user_metadata.full_name: FIRSTNAME created_at: SIGNUP_DATEСопоставление полей
Сопоставьте столбцы таблиц Supabase с атрибутами платформы вовлечения:
Сопоставления пользователей по умолчанию
| Parameter | Type | Description |
|---|---|---|
email required | string | Email пользователя из 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 | Провайдер аутентификации (email, google, github и др.) |
confirmed_at optional | timestamp | Временная метка подтверждения email |
Сопоставление пользовательских таблиц
table_mapping: customers: # Сопоставление столбцов с атрибутами email: email full_name: FIRSTNAME company: COMPANY plan: SUBSCRIPTION_PLAN mrr: MONTHLY_REVENUE created_at: SIGNUP_DATE
orders: # Трекинг как события sync_as: events event_name: "order_placed" properties: total: amount status: order_status items: line_itemsЭндпоинты API
REST API Supabase автогенерируется из схемы базы данных по адресу https://<ref>.supabase.co/rest/v1/.
| Эндпоинт | Метод | Описание |
|---|---|---|
/rest/v1/{table} | GET | Запрос строк с фильтрацией, сортировкой, пагинацией |
/rest/v1/{table} | POST | Вставка строк (поддерживает пакетную вставку и 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 | Список файлов в корзине |
/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 | Регистрация нового пользователя | Приветственная цепочка |
user.signed_in | Вход пользователя | Отслеживание активности |
user.updated | Изменение профиля | Синхронизация данных |
user.deleted | Удаление аккаунта | Очищающие рабочие процессы |
События базы данных (Realtime)
| Событие | Триггер | Сценарий использования |
|---|---|---|
INSERT | Добавлена новая строка | Уведомления о новых заказах/клиентах |
UPDATE | Строка изменена | Рабочие процессы при изменении статуса |
DELETE | Строка удалена | Обнаружение оттока |
События вебхуков
| Событие | Триггер | Сценарий использования |
|---|---|---|
auth.user.created | Регистрация через вебхук | Запуск онбординга |
storage.object.created | Загружен файл | Обработка ресурсов |
Примеры кода
Инициализация коннектора
import { TajoClient } from '@tajo/sdk';import { createClient } from '@supabase/supabase-js';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY,});
// Подключение проекта Supabaseawait 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 для уточнения лимитов Enterprise.
| План | Ограничение скорости | 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 → добавьте таблицу в публикацию |
| Пустые результаты запроса | RLS фильтрует все строки | Проверьте, что политики RLS разрешают аутентифицированной роли читать данные |
| Ошибка загрузки в Storage | Политики корзины | Проверьте, что корзина Storage публична или имеет корректные политики 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 key только на стороне сервера, никогда не раскрывайте его в клиентском коде
- Включайте RLS для всех таблиц, даже с service_role проектируйте с учётом RLS для эшелонированной защиты
- Используйте Realtime для синхронизации по событиям, эффективнее опроса для отслеживания изменений
- Пакетные операции, используйте массовые вставки и фильтр
inдля высокопроизводительных операций - Сопоставляйте метаданные пользователей, храните поля, значимые для вовлечения, в
user_metadataпри регистрации - Используйте Edge Functions для вебхуков, обрабатывайте входящие вебхуки с помощью Supabase Edge Functions для минимальной задержки
Безопасность
- Аутентификация по API Key, все запросы требуют действительных API-ключей
- Row Level Security (RLS), нативный для Postgres контроль доступа на уровне строки
- JWT-верификация, токены Auth представляют собой подписанные JWT, проверяемые при каждом запросе
- SSL/TLS, все соединения зашифрованы при передаче
- SOC 2 Type II, Supabase соответствует SOC 2
- Ограничения сети, опциональное IP-разрешение на платных планах