Retool → PostgreSQL (views) → Power BI

Retool → PostgreSQL (views) → Power BI

Как построить «двойную» витрину без двойного хранилища 19 июня 2025 г.


1. Почему именно Retool → PostgreSQL (views) → Power BI

Формула «один источник — два интерфейса». SMB-командам обычно приходится выбирать: либо быстрые admin-панели «для менеджеров», либо серьёзные отчёты «для аналитиков». Связка Retool → PostgreSQL → Power BI снимает дилемму: Retool читает и пишет в те же таблицы, где хранится продуктивный слой данных, а Power BI подключается к подготовленным представлениям (VIEW) и строит красивые дашборды. Такой «единый источник правды» избавляет от двоения логики, технического долга и пересогласования KPI между отделами.

Минимум DevOps-магии, максимум гибкости.

  • Retool Cloud раздаёт drag-and-drop виджеты, OAuth и RBAC «из коробки» — фронтенд разворачивается за полчаса.
  • PostgreSQL 16 остаётся бесплатным «танком»; c новым pg_stat_io анализ дисковых узких мест проще — база спокойно держит both OLTP и лёгкий OLAP.
  • Power BI Desktop/Service бесплатен на старте, масштабируется до Pro, а Incremental Refresh экономит обновления при росте данных. Получается лестница взросления: от одного VPS и Retool Cloud — к полноценной Data Platform без миграций.

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

Компонент Роль в цепочке Ответственный
Bitrix24 (или другой CRM) Источник данных и веб-хуков CRM-администратор
n8n / Airbyte Лёгкий ETL-конвейер в PostgreSQL Data Engineer
PostgreSQL 16 Единое хранилище (raw + views) DBA
Retool Cloud / Self-Host Внутренние admin-панели, CRUD, approvals Product-OPS
Power BI BI-отчёты, экспорт в Excel / PDF BI-аналитик
(опция) Superset 5.1 Self-service графики для middle-менеджеров BI-аналитик

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

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

Что Где взять
n8n 1.44+ (или Airbyte 0.61+) n8n Docs / Airbyte Docs
PostgreSQL 16.3 PostgreSQL Downloads
Retool Cloud (Free → Team) Retool Sign-up
Power BI Desktop June 2025 Power BI Update

3.2 Мини-Docker-композ (DEV)

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

  n8n:
    image: n8nio/n8n:1.44
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=datamart
      - DB_POSTGRESDB_USER=etl
      - DB_POSTGRESDB_PASSWORD=etl_pwd
    ports: ["5678:5678"]
    depends_on: [postgres]

docker compose up -d — через минуту Postgres слушает localhost:5432, а n8n готов ловить веб-хуки Bitrix24.

3.3 Политика доступа

Аккаунт Права
etl INSERT, UPDATE (схема raw)
retool_app SELECT, INSERT, UPDATE (только нужные таблицы)
bi_user SELECT (только views в mart)
Service-PAT Bitrix crm, task

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

4.1 n8n: вытягиваем сделки Bitrix24

  1. Trigger → HTTP webhook

    • URL /webhook/btx_deal.
  2. Bitrix24: на событие ONCRMDEALUPDATE поставить POST на этот URL.
  3. Set node: нормализуем payload.
  4. Postgres → Execute Query:
INSERT INTO raw.crm_deal (id, title, stage_id, amount, updated_at, payload)
VALUES ( :={{ $json.id }}, :={{ $json.title }}, :={{ $json.stage }}, :={{ $json.amount }},
         :={{ $json.date_modify }}, :={{ $json | dump }} )
ON CONFLICT (id) DO UPDATE
  SET stage_id   = EXCLUDED.stage_id,
      amount     = EXCLUDED.amount,
      updated_at = EXCLUDED.updated_at,
      payload    = EXCLUDED.payload;

Cron-fallback: раз в час полная сверка crm.deal.listraw.crm_deal.

4.2 Postgres: готовим представления

CREATE SCHEMA mart;

-- «Плоская» витрина для Power BI
CREATE OR REPLACE VIEW mart.v_deal_won AS
SELECT
    d.id,
    d.title,
    d.amount,
    s.name        AS stage_name,
    d.updated_at,
    u.name        AS manager
FROM raw.crm_deal AS d
LEFT JOIN dim.stage  AS s ON s.id = d.stage_id
LEFT JOIN dim.user   AS u ON u.id = d.assigned_by
WHERE d.stage_id = 'WON';
-- «Lean» view для Retool
CREATE OR REPLACE VIEW mart.v_deal_dashboard AS
SELECT
    id, title, stage_id, amount
FROM raw.crm_deal
ORDER BY updated_at DESC
LIMIT 1000;

Лайфхак: держите в mart только VIEW — Retool и Power BI читают один код, но накладные расходы сохраняются на стороне Postgres.

4.3 Retool: строим admin-панель

  1. Resources → Add PostgreSQL

    • Host postgres, db datamart, user retool_app.
  2. GUI

    • Таблица → запрос SELECT * FROM mart.v_deal_dashboard;.
    • Form → UPDATE raw.crm_deal SET amount = {{amountInput.value}} WHERE id = {{table.selectedRow.id}};
    • Button «Approve» → статус APPROVED, websockets включаем для live-обновления.
  3. RBAC

    • Viewer: только SELECT.
    • Editor: INSERT/UPDATE через Prepared Queries.
Читай также:  Supabase (PostgreSQL + Edge Functions) → Power BI

4.4 Power BI: подключаемся к той же БД

  1. Home → Get Data → PostgreSQL

    • DSN postgres:5432, DB datamart, SSL On.
  2. Модель: выбираем mart.v_deal_won.
  3. Import или DirectQuery (< 1 млн строк → DirectQuery).
  4. Incremental Refresh

    • RangeStart/RangeEnd → поле updated_at.
    • Store 36 months, Refresh 2 days.

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

Зона Схема Содержимое
Stage / Raw raw Как есть из Bitrix24
DWH dims dim Пользователи, стадии, справочники
Mart mart Представления для Retool и BI

Continuous metrics

-- Быстрое KPI «pipeline за сегодня»
CREATE OR REPLACE VIEW mart.v_pipeline_today AS
SELECT SUM(amount) AS pipeline
FROM raw.crm_deal
WHERE updated_at >= date_trunc('day', now());

Retool использует его в карточке, Power BI — в Measure.


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

6.1 Power BI

  • Clustered Column: Axis = stage_name, Value = amount.
  • Line chart: updated_at × amount — динамика выигранных сделок.
  • Фильтр по менеджеру → slicer.

6.2 Retool

  • Table: mart.v_deal_dashboard.
  • Statistics: KPI-виджет «Сегодняшний pipeline» ← mart.v_pipeline_today.
  • Modal: детальный edit → UPDATE-query.
  • ActionButton: «Создать счёт» → HTTP POST на 1С REST, статус-подтверждение возвращается в таблицу.

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

Объект Инструмент Порог
n8n job errors built-in → Slack Webhook > 1 ошибка за 1 час
Postgres bloat pg_stat_user_tables > 20 %
Retool query time Retool Performance tab > 200 мс P95
Power BI refresh Service → Refresh history Failure > 1/сутки
Backup pg_dump nightly → S3 пропуск > 1 сутки

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

  1. Панель Retool «мерцает» при массовых обновлениях — Используйте Bulk Update (array of rows) вместо десятков запросов.
  2. Power BI не «видит» новые представленияTransform data → Refresh Preview или в Service «Apply changes».
  3. Duplicate key в raw при веб-хуках — Bitrix24 может отправить UPDATE до CREATE; добавьте фильтр if exists в n8n.
  4. VIEW медленно работает — Создайте MATERIALIZED VIEW + индекс; в Retool invalidate cache через /refresh.
  5. Retool query «SET …» блокирует транзакции — Включите AUTOCOMMIT в Resource Settings, на запросах UPDATE поставьте RETURNING id.

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

Связка Retool → PostgreSQL (views) → Power BI даёт малому и среднему бизнесу три бонуса сразу:

Читай также:  Albato → PostgreSQL → Yandex DataLens
Плюсы Минусы
Единое хранилище — никакого «Spreadsheet V0 vs BI V1». При 100+ пользователей Retool Cloud → платный Team-plan.
Retool CRUD-панели готовятся за часы, а не недели. Power BI Pro нужен для шедулера обновлений и шаринга.
BI-аналитики не просят dev-команду «сделай API» — берут VIEW сами. Ущербный RBAC Postgres уровня VIEW — придётся продумывать схему.

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

  • 5 млн строк в raw → включаем TimescaleDB или выделяем ClickHouse.

  • Требуется real-time < 5 с → Kafka + Debezium c Materialized Views.
  • Админ-панели стали customer-facing → миграция на Next.js + custom API.

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

С одной базой и двумя фасадами вы получаете и быстрые кнопки «одобрить счет», и дашборд «как растёт pipeline» — без копирования данных и ночных ETL-слёз.