RudderStack OSS → PostgreSQL → Power BI

RudderStack OSS → PostgreSQL → Power BI

(пошаговый гайд, опубликован 19 июня 2025 г.)

TL;DR • Берём RudderStack Community Edition 1.47.0 — свежий релиз от 14 апреля 2025 г. (github.com) • Ставим self-host сервер, подключаем tap к Bitrix24 и пишем события потоком в PostgreSQL 16. • В пару кликов подключаем Superset 5.1 (для self-service) и Power BI (для C-level) — оба читают те же витрины, а платить некому.


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

С бухты-барахты к «событийному» складу. Bitrix24 генерирует сотни тысяч событий: сделки, задачи, комментарии, звонки. Хочется хранить их в единой схеме (event_name, timestamp, properties) — на манер Segment, но без долларов. RudderStack OSS (лицензия AGPL) даёт «router» + «warehouse loader»: он принимает веб-хуки Bitrix24, нормализует JSON под Unified Event Model и шлёт батчи прямо в Postgres. Благодаря Adaptive Throttler (добавлен в v1.47) поток не забивает базу пиками (github.com).

Zero-SaaS, zero-рублей. Community-версия бесплатна — миллион событий в месяц без карт и VPN (g2.com). Всё крутится на VPS в РФ, ФЗ-152 соблюдён, и ни одна подписка не списывает деньги внезапно ночью.

“One source of truth” для BI и ML. Postgres хранит как “сырьё”, так и витрины. Superset берёт stage.events — менеджеры фильтруют live-таблицы в браузере. Power BI импортирует агрегаты (mart.fact_events_daily) и красиво рисует KPI. Один склад — две аудитории, никакого «у нас цифры не сходятся».


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

Компонент Роль Кто «дежурит»
Bitrix24 Генерирует события (REST-веб-хуки) CRM-админ
RudderStack OSS 1.47 Роутер + loader (stream-write) DevOps
PostgreSQL 16 DWH: stagemart DBA
Superset 5.1 Self-service панели, алерты BI-аналитик
Power BI .pbix для C-level, Excel-export BI-аналитик
(опц.) dbt 1.9 SQL-модели, тесты Analytics Engineer

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

3.1 Устанавливаем ПО

# RudderStack server
docker pull rudderlabs/rudder-server:1.47.0     # 14-апр-2025

# Postgres 16
docker pull postgres:16

# Superset 5.1
docker pull apache/superset:5.1

Полезные мануалы: RudderStack OSS Quick-Start(rudderstack.com), Release Notes(rudderstack.com).

3.2 docker-compose (минимум)

version: '3.9'
services:
  rudder:
    image: rudderlabs/rudder-server:1.47.0
    environment:
      - POSTGRES_USER=etl
      - POSTGRES_PASSWORD=etl_pwd
      - POSTGRES_DB=datamart
      - DB_HOST=postgres
      - DB_PORT=5432
      - ENABLE_EVENT_REPLAY=true
    ports:
      - "8080:8080"    # collect
      - "5555:5555"    # dashboard
    depends_on: [postgres]

  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: etl
      POSTGRES_PASSWORD: etl_pwd
      POSTGRES_DB: datamart
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports: ["5432:5432"]

  superset:
    image: apache/superset:5.1
    env_file: superset.env
    depends_on: [postgres]
    ports: ["8088:8088"]

Запускаем → docker compose up -d — через минуту dashboard Rudder доступен на http://localhost:5555.

3.3 Bitrix24 → Rudder Webhook

  • В портале CRM создаём веб-хук «Любое обновление сделки».
  • Событие POST-JSON летит на http://rudder:8080/v1/track.
  • В header кладём writeKey: bitrix24_stream.

Важно: у Bitrix24 лимит 2 req/s. Rudder adaptive_throttler снижает QPS, если встречает 429.


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

4.1 Создаём источник и назначаем destination

  1. Rudder dashboard → Sources → Add → HTTP (назовём bitrix24).
  2. Write Key “bitrix24_stream” — сверяем с хук-запросом.
  3. Destinations → PostgreSQL:

    • Host postgres, порт 5432, DB datamart, user etl.
    • Таблица events (auto).
    • Mode stream-row — каждая запись INSERT мгновенно.
Читай также:  NiFi → Elasticsearch ↔ PostgreSQL → Power BI

Rudder создаёт схему rudder и таблицу events_raw.

4.2 Единой схемой — через трансформацию

В папке /config-transformations/bitrix24 пишем JS-функцию:

export function transform(event) {
  return {
    event: event.event || "crm_event",
    userId: event.properties.ASSIGNED_BY_ID,
    properties: {
      id: event.properties.ID,
      title: event.properties.TITLE,
      stage: event.properties.STAGE_ID,
      amount: parseFloat(event.properties.OPPORTUNITY || 0)
    },
    timestamp: new Date(event.properties.DATE_MODIFY)
  };
}

Rudder применит функцию, JSON «плоский», поля понятны BI.


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

-- staging view
CREATE OR REPLACE VIEW stage.events AS
SELECT
    (data->>'event')                  AS event_name,
    (data->>'userId')::bigint         AS manager_id,
    (data->'properties'->>'id')::bigint        AS deal_id,
    (data->'properties'->>'stage')              AS stage_id,
    (data->'properties'->>'amount')::numeric    AS amount,
    timestamp
FROM rudder.events_raw;

-- mart: ежемесячный pipeline
CREATE MATERIALIZED VIEW mart.pipeline_monthly AS
SELECT
    date_trunc('month', timestamp)::date AS month,
    stage_id,
    COUNT(*)                              AS events_cnt,
    SUM(amount)                           AS sum_amount
FROM stage.events
WHERE event_name = 'crm_event'
GROUP BY 1,2;

Сжатие (Postgres 16):

ALTER TABLE rudder.events_raw
  SET (toast.compress = 'lz4');

6. Визуализация

6.1 Superset

  1. Databases → + postgresql://superset:pwd@postgres:5432/datamart.
  2. Datasetsmart.pipeline_monthly.
  3. Chart “Time Series Bar”: Time = month, Metric = sum_amount, Series = stage_id.
  4. Alert: «если sum_amount < плана» → письмо в Telegram.

6.2 Power BI

  1. Get Data → PostgreSQL (SSL).
  2. Выбираем mart.pipeline_monthly.
  3. Import (≤ 1 M строк) или DirectQuery.
  4. Incremental Refresh: Store = 36 months, Refresh = 2 days (поле month).

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

Объект Как смотреть Порог
Rudder dashboard → Live Events drop rate > 1 % красный
Postgres size pg_database_size > 70 % диска тревога
Материализованная вью lag last_refresh > 1 ч алерт
Superset /health latency > 500 мс алерт
Power BI refresh failure > 1/сутки тикет

Cron-скрипт (bash) refresh MV:

psql -c "REFRESH MATERIALIZED VIEW CONCURRENTLY mart.pipeline_monthly;"

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

  1. В таблице events_raw строки с camelCase. Решение: добавьте flattening в JS-трансформации или делайте ->> в VIEW.
  2. Bitrix24 шлёт одинаковые сделки → дубль PK. Решение: создайте UNIQUE (deal_id, timestamp) + ON CONFLICT DO NOTHING.
  3. Rudder перешёл в backlog (отстаёт). Решение: увеличьте spool_file_size до 200 MB и dеlay-микро-баты в 500 мс.
  4. Superset «не видит» новые schemas. Решение: Database → Sync metadata и включить авто-sync каждые 6 ч.
  5. Power BI choke на 10 М строк. Решение: переключитесь на DirectQuery + Aggregations или делайте ежемесячное партиционирование в Postgres.
Читай также:  Airflow → PostgreSQL DWH → dbt → Superset

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

👍 Плюсы 👎 Минусы
100 % open-source, 0 ₽ подписок AGPL — придётся открыть форк, если модифицируете
Единый event-schema — легко кормить ML Нужны JS-трансформации вручную
Постоянный stream-write < 1 с lag Требуется DevOps: Docker, Nginx, SSL
Superset + Power BI читают один источник Ограничение Bitrix24 2 r/s остаётся

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

  • 10 М событий/день → ClickHouse + Rudder Warehouse S3 → CH.

  • < 1 с SLA → Kafka Connect вместо HTTP, Power BI Push Dataset.
  • GitOps-policy → dbt Core + CI (GitHub Actions) + pytest-singer-tap.

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

Теперь ваши события Bitrix24 летят «по-взрослому»: в момент обновления сделки Rudder пишет JSON в Postgres, Superset рисует график, Power BI показывает KPI, а кошелёк директора не плачет о SaaS-подписках.