Supabase (PostgreSQL + Edge Functions) → Power BI

Supabase (PostgreSQL + Edge Functions) → Power BI

Realtime-конвейер без DevOps-головной боли Версия от 19 июня 2025 г.


1. Почему именно Supabase → Power BI

Смысл: жить в «почти-реальном» времени и больше писать SQL, а не YAML. Supabase кладёт поверх чистого PostgreSQL готовые сервисы: подписки на изменения (Realtime), row-level-security (RLS) и Edge Functions на Deno. Всего этого хватает, чтобы малой команде без опеки DevOps развернуть «мини-фреймворк данных»: события CRM летят веб-хуком в функцию, функция пишет в таблицу, а отчёт в Power BI обновляется секундой позже. При этом вы всё ещё на Postgres и можете мигрировать, если «вырастете».

Экономика для SMB:

  • Supabase — бесплатный слой до 500 MB БД и 50 000 сообщений Realtime/мес.
  • Edge Functions включены, платишь лишь за «compute-units» поверх бесплатной квоты.
  • Power BI Desktop бесплатен; лицензия Pro (\$10) нужна, когда отчёты станут shared. Итого: можно стартовать на zero-budget, а платить только, когда данные действительно «побегут».

Типовые сценарии

  • Сервис-стартап пушит веб-события регистрации и платёжные статусы в Supabase; дашборд Power BI показывает живую конверсию в оплату для CEO.
  • Маркетинговое агентство слушает веб-хуки Bitrix24 о новых лидах, таблица «leads» обновляется, и менеджер сразу видит дельту воронки.
  • Ритейл-e-commerce — Edge Function принимает Stripe-webhook «payment_succeeded», классифицирует SKU и пушит в realtime-таблицу продаж; Power BI плитка «GMV за последние 10 минут» мерцает почти live.

2. Компоненты и роли

Компонент Роль Кто отвечает
Supabase Postgres 16 Хранилище + RLS + logical replication Data Engineer
Supabase Realtime WebSocket-подписки на INSERT/UPDATE/DELETE Full-stack dev
Supabase Edge Functions Serverless-обработка веб-хуков, обогащение JS/TS-инженер
Power BI Витрина и self-service-аналитика BI-аналитик
(опция) Power BI Gateway Если Supabase приватный VPC IT Ops

3. Подготовка окружения

3.1 Что поставить

Что Где взять
supabase CLI 1.51+ Supabase CLI
Node 18 + Deno 1.44 Deno
Power BI Desktop June 2025 Release notes
Npgsql 7.0.5 (если нужен отдельный драйвер) Npgsql

3.2 Создаём проект Supabase

supabase init realtime-pipeline
supabase link --project-ref <your-project-ref>
supabase db start   # локальная dev-БД

В Dashboard → Database включите → Row Level Security галочкой.

3.3 Роли и политики

create role b2b_user noinherit;
grant connect on database postgres to b2b_user;
alter role b2b_user set search_path = public;

-- таблица с лидами
create table public.leads (
  id          bigint generated by default as identity primary key,
  source      text,
  email       text,
  created_at  timestamptz default now()
);

-- включаем RLS
alter table public.leads enable row level security;

-- политика: юзер видит только свои лиды
create policy "Leads are private"
on public.leads
for select
using (auth.uid() = user_id);

RLS работает на самом уровне Postgres и «режет» строки даже при доступе извне — безопасность не зависит от клиентской библиотеки (supabase.com).

Читай также:  Kafka + Debezium → PostgreSQL → Superset

3.4 Edge Functions scaffold

supabase functions new webhook-btx

Файл index.ts уже содержит шаблон Deno-функции.


4. Настройка потоков данных

4.1 Веб-хук из Bitrix24 (пример)

Bitrix24 шлёт POST / JSON при изменении сделки. В Edge Function:

import { serve } from "https://deno.land/std/http/server.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js";

serve(async (req) => {
  const payload = await req.json();
  const supabase = createClient(Deno.env.get("SUPABASE_URL")!,
                                Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!);

  // обогащаем: добавим канал по UTM
  const channel = payload.UF_CRM_AD_CHANNEL ?? "unknown";

  const { error } = await supabase.from("leads").insert({
    source: channel,
    email: payload.EMAIL,
    user_id: payload.ASSIGNED_BY_ID,
  });
  if (error) return new Response(error.message, { status: 500 });
  return new Response("ok", { status: 200 });
});

Деплой: supabase functions deploy webhook-btx.

4.2 Подписка Realtime

Фронтенд, бекенд или тест-скрипт может слушать изменения:

import { createClient } from "@supabase/supabase-js";

const supabase = createClient(SUPABASE_URL, PUBLIC_ANON_KEY);

supabase.channel("leads-changes")
  .on("postgres_changes",
      { event: "*", schema: "public", table: "leads" },
      (payload) => console.log("Change!", payload))
  .subscribe();

Supabase выдаёт события через глобально распределённый Realtime сервис (supabase.com).

4.3 Представление для Power BI

create or replace view analytics.vw_leads_live as
select
  date_trunc('minute', created_at) as minute_bucket,
  source,
  count(*)                         as leads_cnt
from public.leads
group by 1,2;

Поскольку это обычный Postgres-view, DirectQuery в Power BI увидит новые строки без импорта.


5. Трансформации и моделирование

Зона Схема Что лежит
Raw public Триггерные таблицы, RLS включён
ODS ods Типизированные копии, минимальная лента изменений
Mart analytics Агрегаты для BI

5.1 CDC через logical replication

Supabase Realtime уже читает WAL для генерации событий; мы можем подключить собственный slot в Edge Function, если нужен доп-поток Kafka, не нарушая основную логику.

5.2 Материализация

create materialized view analytics.mv_leads_daily as
select
  date_trunc('day', created_at)::date as day,
  source,
  count(*)                            as leads_cnt
from public.leads
group by 1,2;

-- Обновляем в Edge Function по CRON-субподписке

6. Визуализация в Power BI

6.1 DirectQuery к Supabase

  1. Get Data → PostgreSQL.
  2. Server =<project>.supabase.co, Port 6543 (если Supabase EU West).
  3. DirectQuery (поддерживается с драйвером Npgsql > 7) (learn.microsoft.com).
  4. Таблица/представление analytics.vw_leads_live.
  5. Сборка визуализаций:

    • Stacked columnminute_bucket × source.
    • Card → SUM(leads_cnt) → live-счётчик за последние 60 мин.

Если нужен true-real-time < 1 с, создайте Push Dataset через Power BI REST; Edge Function может дергать POST https://api.powerbi.com/v1.0/myorg/datasets/{id}/rows на каждый INSERT (learn.microsoft.com). Но это платный трафик — DirectQuery чаще всего хватает.

6.2 Gateway vs Cloud

  • Power BI Service → Supabase (public SSL) — работает без Gateway.
  • Если Supabase в приватном VPC, ставим On-premises Data Gateway и публикуем отчёт в workspace с той же организацией.
Читай также:  Retool → PostgreSQL (views) → Power BI

7. Мониторинг и автоматизация

Что отслеживаем Инструмент Порог
Edge Function cold start Supabase logs > 500 мс P95
Realtime сообщений Supabase metrics > 90 % квоты
DB connections pg_stat_activity > 80 % max_connections
Billing Supabase Dashboard alerts +25 % к прошлому месяцу
Power BI refresh Workspace → Refresh history Failures > 1/день

Edge Functions логируются в Supabase Dashboard; можно настроить Webhook-Alert → Slack при статусе ≥ 500. Supabase Edge автоскейлится глобально, так что DevOps-нагрузка ≈ 0 (supabase.com).


8. Типичные ошибки и лайфхаки

  1. «Could not connect: no pg_hba.conf entry» — В Supabase все подключения SSL-только; убедитесь, что драйвер использует Require SSL.
  2. RLS блокирует Power BI — Создайте сервис-роль reporting без RLS, но дайте ей только доступ к analytics-схеме.
  3. Edge Function истекла по таймауту 30 с — Предобрабатывайте payload локально, heavy SQL гоните асинхронно через supabase.functions.invoke('bg-job').
  4. DirectQuery «медленно» — На view добавьте Materialized-View + индекс, либо в Power BI настройте Hybrid (Import history + DirectQuery recent).
  5. Realtime дублирует события — Убедитесь, что слушаете только insert либо фильтруете old, new payload; Broadcast-канал минимизирует трафик и масштабируется лучше Postgres-changes (supabase.com).

9. Заключение

Связка Supabase (PostgreSQL + Edge Functions) → Power BI даёт малым и средним командам «живой» поток данных без традиционного DevOps-слоя:

Плюсы

  • Realtime WebSocket-подписки без Kafka.
  • RLS держит безопасность прямо в Postgres.
  • Edge Functions обрабатывают веб-хуки на TypeScript, деплой за 3 сек.
  • Power BI цепляется напрямую через DirectQuery; пользователи видят «почти live» цифры.

Минусы

  • Supabase бесплатная квота быстро заканчивается, если у вас десятки тысяч событий в час.
  • Edge Functions (Deno) ≠ NodeJS — нужно перестраивать привычные npm-зависимости.
  • Нет out-of-the-box CDC в Big Data масштабе; при > 5 млн событий/день придётся думать о Kafka.

Когда масштабировать?

  • 500 к сообщений/день — рассмотрите Supabase Realtime Broadcast + S3-архив.

  • Требуется аналитика 1 млрд строк — подключаем ClickHouse/BigQuery через FDW.
  • Нужен ML-stream — Edge Functions пушат в Azure Event Hub, а Power BI читает из Synapse.

Полезные ссылки

Теперь ваш отчёт «Лиды за последние 10 минут» обновляется практически в тот же момент, когда менеджер нажимает «Сохранить» в CRM — а вы пьёте раф, не вспоминая слово «Kubernetes».