配置

本章节中,我们将:

  • 安装并配置 Apache Superset,使之能在 Jmix 应用程序中使用。

  • 配置 Jmix 应用程序连接至 Apache Superset。

安装 Apache Superset

根据 Apache Superset 的 文档,有多种安装方式。

其中,最简单的一种方式是使用 Docker Compose。这种方式提供一些已经配置好的仪表板和示例数据,也支持自定义配置。

Apache Superset 不推荐在生产环境中使用 Docker Compose,因为这种方式的主要目的是在单一服务中运行多个 docker 容器,从而无法满足高可用性要求。

首先,克隆 Superset 的仓库,使用特定的 release tag,例如对于 4.0.1:

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

然后,在克隆的仓库根目录的 docker-compose-non-dev.yml 文件中配置 Apache Superset docker 镜像的版本与下载的版本一致:

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

最后,为了简化在 Jmix 中集成 Superset 的过程,我们配置 Superset 与 Jmix 使用同一数据源服务。

docker-compose-non-dev.yml 中添加 PostgreSQL 服务:

  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:
# ...

如果你本地已经有运行在标准端口 5432 的 PostgreSQL,为了避免冲突,可以开放另一个端口,例如,5433:

    ports:
      - 5433:5432

现在可以启动 Apache Superset 了,在克隆仓库的根目录运行下面的命令:

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

然后可以从 http://localhost:8088 访问 Superset 的 web UI。凭证为:admin / admin

superset login

配置 Apache Superset

Superset 有很多配置参数。完整参数列表在 superset/config.py 文件中。为了让 Jmix 应用程序能访问 Superset,需要配置 Content Security Policy (CSP) - 内容安全策略 并启用带功能标签(feature flag)的默认角色。

Apache Superset 支持在下列文件中的自定义配置:

  • docker/pythonpath_dev/superset_config.py

  • docker/pythonpath_dev/superset_config_docker.py(Git 忽略该文件)。

本示例中,我们使用第二个方法。在 /apache-superset/superset/docker/pythonpath_dev/ 中创建 superset_config_docker.py 文件。

访客 Token

Jmix Superset 扩展组件使用 访客 token 访问集成的仪表板。使用这个 token 时,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,
}

内容安全策略(CSP)

为了在 iframe 中集成仪表板,需要配置内容安全策略(CSP)。Apache Superset 使用 Talisman(一个 Flask web 框架的扩展),支持集成额外的安全层,例如 CSP、HTTPS 等。

内容安全策略具有 frame-ancestors 指令,该指令指定可嵌入网页的父地址。Superset 已经在 superset/config.py 中定义了带默认值的 TALISMAN_CONFIG 属性。

复制 TALISMAN_CONFIGsuperset_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

由于已在 Docker Compose 中启动了 PostgreSQL 服务,因此需要将 主数据存储HSQLDB 改为 PostgreSQL

如果容器配置中的 jmix_database 定义的端口并非 5432,则需要在数据库 URL 中指定该端口。例如,数据库 host 字段设置为:localhost:5433

现在,应用程序已经可以与 Superset 进行通信了。由于数据库还是空的,应用程序会自动运行数据库结构创建脚本,并用添加演示数据。启动应用程序并打开 Users 视图:

users list