Конфигурация

В этом разделе вы выполните следующие шаги:

  • Установите и настроите Apache Superset так, чтобы сделать его доступным в приложениях Jmix.

  • Настроите приложение Jmix для подключения к Apache Superset.

Установка Apache Superset

Согласно документации Apache Superset, существуют различные способы его установки.

Самый простой способ познакомиться с Apache Superset - использовать Docker Compose. Этот способ предоставляет демонстрационные данные с уже созданными дэшбордами и позволяет настраивать конфигурацию Superset.

Apache Superset не рекомендует использовать Docker Compose в продакшн, так как он в основном предназначен для запуска набора контейнеров на одном хосте и не может поддерживать требования по высокой доступности.

Во-первых, клонируйте репозиторий Superset с тегом релиза, например 4.0.1:

git clone --depth 1 --branch 4.0.1 https://github.com/apache/superset.git

Во-вторых, укажите эту же версию для docker-образа Apache Superset в файле docker-compose-non-dev.yml, расположенном в корневом каталоге клонированного репозитория. Откройте файл docker-compose-non-dev.yml и установите следующее значение для свойства x-superset-image:

x-superset-image: &superset-image apache/superset:4.0.1

И наконец, чтобы упростить интеграцию Superset с приложением Jmix, настройте сервис базы данных, который будет доступен как для Superset, так и приложению.

Добавьте сервис PostgreSQL в docker-compose-non-dev.yml:

  superset-worker-beat:
  # ...

  jmix_database:
    image: postgres:16.3
    container_name: jmix_database
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: onboarding
      POSTGRES_USER: jmix
      POSTGRES_PASSWORD: jmix

volumes:
# ...

Если у вас уже есть локальный PostgreSQL, использующий стандартный порт 5432, откройте другой порт, чтобы избежать конфликтов. Например, 5433:

    ports:
      - 5433:5432

Теперь Apache Superset готов к запуску. Выполните следующую команду в корневом каталоге клонированного репозитория:

docker compose -f docker-compose-non-dev.yml up

Веб-интерфейс Superset будет доступен по адресу http://localhost:8088. Учетные данные пользователя: admin / admin.

superset login

Конфигурация Apache Superset

Superset имеет много параметров настройки. Вы можете найти полный список в файле config.py. Для доступа к Superset из приложений Jmix вам нужно настроить Content Security Policy (CSP) и включить роль по умолчанию.

Apache Superset поддерживает определение настроек в следующих файлах:

  • docker/pythonpath_dev/superset_config.py

  • docker/pythonpath_dev/superset_config_docker.py (игнорируется Git).

В этом руководстве вы будете использовать второй вариант. Создайте файл superset_config_docker.py в директории /apache-superset/superset/docker/pythonpath_dev/.

Гостевой токен

Дополнение Jmix Superset использует гостевой токен (guest token) для доступа к встроенным дэшбордам. Используя этот токен, Apache Superset создает анонимный объект пользователя с ролью из свойства GUEST_ROLE_NAME, которое по умолчанию равно Public. Для того чтобы разрешить анонимным пользователям просматривать дэшборды, необходимо использовать роль Gamma.

Добавьте следующее свойство в файл superset_config_docker.py:

GUEST_ROLE_NAME = 'Gamma'

Встраиваемые дэшборды

По умолчанию Superset не позволяет встраивать дэшборды в iframe. Вы можете разрешить это с помощью свойства FEATURE_FLAGS.

Добавьте следующее свойство в файл superset_config_docker.py:

FEATURE_FLAGS = {
    "EMBEDDED_SUPERSET": True,
}

Content Security Policy (CSP)

Для встраивания дэшбордов в iframe необходимо также настроить Content Security Policy. Apache Superset использует Talisman (расширение для веб-фреймворка Flask), которое позволяет интегрировать дополнительные слои безопасности, такие как CSP, HTTPS и т.д.

Content Security Policy имеет директиву frame-ancestors, которая указывает допустимых родителей, которые могут встраивать страницу. Superset уже определяет свойство TALISMAN_CONFIG с значениями по умолчанию в файле superset/config.py.

Скопируйте свойство TALISMAN_CONFIG в файл superset_config_docker.py и добавьте значение frame-ancestors:

TALISMAN_CONFIG = {
    "content_security_policy": {
        # ...
        "frame-ancestors": ["http://localhost:8080"]
    },
    # ...
}

Результат настройки в файле superset_config_docker.py будет следующим:

GUEST_ROLE_NAME = 'Gamma'
FEATURE_FLAGS = {
    "EMBEDDED_SUPERSET": True,
}
TALISMAN_CONFIG = {
    "content_security_policy": {
        "base-uri": ["'self'"],
        "default-src": ["'self'"],
        "img-src": [
            "'self'",
            "blob:",
            "data:",
            "https://apachesuperset.gateway.scarf.sh",
            "https://static.scarf.sh/",
        ],
        "worker-src": ["'self'", "blob:"],
        "connect-src": [
            "'self'",
            "https://api.mapbox.com",
            "https://events.mapbox.com",
        ],
        "object-src": "'none'",
        "style-src": [
            "'self'",
            "'unsafe-inline'",
        ],
        "script-src": ["'self'", "'strict-dynamic'"],
        "frame-ancestors": ["http://localhost:8080"]
    },
    "content_security_policy_nonce_in": ["script-src"],
    "force_https": False,
    "session_cookie_secure": False,
}
Это настройка используется только для демонстрационных целей. Для продакшн-среды вам нужно произвести более точную настройку с включенными CORS, HTTPS и т.д.

Теперь Superset настроен и может быть перезапущен. Остановите работающие контейнеры и запустите снова:

docker compose -f docker-compose-non-dev.yml up

Конфигурация Jmix

Дополнение Jmix Superset требует определения следующих свойств:

application.properties
jmix.superset.url = http://localhost:8088
jmix.superset.username = admin
jmix.superset.password = admin

Так как вы запустили базу данных приложения как сервис PostgreSQL в Docker Compose, измените основное хранилище данных с HSQLDB на PostgreSQL.

Если в конфигурации контейнера jmix_database определен порт, отличный от 5432, укажите его в URL базы данных. Например, установите localhost:5433 в поле хоста базы данных.

Теперь приложение готово к взаимодействию с Superset. Поскольку база данных пуста, приложение выполнит скрипты миграции схемы и заполнит базу данных демонстрационными данными. Запустите приложение и откройте экран Users:

users list