首页 > 其他分享 >Superset Docker-Compose部署

Superset Docker-Compose部署

时间:2024-08-14 22:17:12浏览次数:13  
标签:Compose appbuilder security Superset AUTH LDAP Docker superset docker

bi系统是一类旨在帮助企业和组织分析、可视化和理解其业务数据的软件工具
之前了解过商业的阿里quickbi,腾讯bi,开源的话用superset,据了解新老公司不少会调研superset
https://github.com/apache/superset/releases/tag/4.0.2
这里我使用了最新的包,经过测试发现一年前的镜像更新到最新版本以后也没有出现版本问题

部署

1、规范部署基本都在/data下,解压目录后

mkdir /data/superset/ -p
包解压下来
$# ls
4.0.2.tar.gz  superset-4.0.2
# 这就是源码目录了
superset-4.0.2

2、介绍一下主要的配置文件

docker-compose.yml # 包含很多部署工具,用这个compose启动的superset web界面各种静态文件刷不出来,基本是空白页,并且多了很多业务用不到的功能,完全没必要用。特点是会把宿主机目录的文件都映射到容器内
docker-compose-non-dev.yml # 纯净版,需要依赖自行安装即可,不会有dev镜像那种静态文件的问题
superset/config.py # 主配置文件,自定义代码和LDAP配置都在这里
docker/docker-bootstrap.sh # 容器启动脚本,可以添加一些命令
docker/docker-init.sh # 初始化脚本,这里经常修改默认用户名密码

3、如果是使用默认的AUTH_DB验证方式,现在就可以启动了

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

配置LDAP

由于是py写的,用了flask去做ldap验证,更详细的用法参考如下链接
https://flask-appbuilder.readthedocs.io/en/latest/security.html#authentication-ldap

1、修改superset/config.py,vim下搜索模式找到LDAP,在附近增加代码

from flask_appbuilder.security.manager import AUTH_DB,AUTH_LDAP
AUTH_TYPE = AUTH_LDAP  # 默认是AUTH_DB
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = "Admin"   # 这里最好用Public
AUTH_LDAP_SERVER = "ldap://ip:port"
AUTH_LDAP_USE_TLS = False
AUTH_LDAP_BIND_USER = 'cn=admin,dc=xx,dc=com'
AUTH_LDAP_BIND_PASSWORD = "password"
AUTH_LDAP_SEARCH = "dc=xx,dc=com"
AUTH_LDAP_UID_FIELD = "cn"
AUTH_LDAP_ALLOW_SELF_SIGNED=True
AUTH_LDAP_APPEND_DOMAIN=False
#AUTH_LDAP_FIRSTNAME_FIELD="givenName"
#AUTH_LDAP_LASTNAME_FIELD="sn"
AUTH_LDAP_USE_TLS=False
AUTH_USER_REGISTRATION=True

2、默认情况下superset只支持一种验证方式,用了LDAP以后DB验证就会失败,所以我们需要自定义脚本同时支持两种登录方式

3、在superset程序目录下增加custom_security_manager.py

from superset.security import SupersetSecurityManager
from flask_appbuilder.security.views import AuthLDAPView
from flask_appbuilder.security.views import expose
from flask import g, redirect, flash
from flask_appbuilder.security.forms import LoginForm_db
from flask_login import login_user
from flask_appbuilder._compat import as_unicode

class AuthLocalAndLDAPView(AuthLDAPView):
    @expose("/login/", methods=["GET", "POST"])
    def login(self):
        if g.user is not None and g.user.is_authenticated:
            return redirect(self.appbuilder.get_url_for_index)
        form = LoginForm_db()
        if form.validate_on_submit():
            user = self.appbuilder.sm.auth_user_ldap(
                form.username.data, form.password.data
            )
            if not user:
                user = self.appbuilder.sm.auth_user_db(
                    form.username.data, form.password.data
                )
            if user:
                login_user(user, remember=False)
                return redirect(self.appbuilder.get_url_for_index)
            else:
                flash(as_unicode(self.invalid_login_message), "warning")
                return redirect(self.appbuilder.get_url_for_login)
        return self.render_template(
            self.login_template, title=self.title, form=form, appbuilder=self.appbuilder
        )


class CustomSecurityManager(SupersetSecurityManager):
    authldapview = AuthLocalAndLDAPView
    def __init__(self, appbuilder):
        super(CustomSecurityManager, self).__init__(appbuilder)

4、导入SupersetSecurityManager支持自定义安全管理器,第二条则是导入我们自定义的包,最后做一个引用

from superset.security import SupersetSecurityManager
from superset.custom_security_manager import CustomSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSecurityManager

5、满足两种验证方式的LDAP配置如下

from superset.security import SupersetSecurityManager
from flask_appbuilder.security.manager import AUTH_DB,AUTH_LDAP
from superset.custom_security_manager import CustomSecurityManager
AUTH_TYPE = AUTH_LDAP
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = "Admin"
AUTH_LDAP_SERVER = "ldap://10.198.224.89:389"
AUTH_LDAP_USE_TLS = False
AUTH_LDAP_BIND_USER = 'cn=admin,dc=peekaboo,dc=group'
AUTH_LDAP_BIND_PASSWORD = "BAH5vnd_dtv8avz5bxp"
AUTH_LDAP_SEARCH = "dc=peekaboo,dc=group"
AUTH_LDAP_UID_FIELD = "cn"
AUTH_LDAP_ALLOW_SELF_SIGNED=True
AUTH_LDAP_APPEND_DOMAIN=False
#AUTH_LDAP_FIRSTNAME_FIELD="givenName"
#AUTH_LDAP_LASTNAME_FIELD="sn"
AUTH_LDAP_USE_TLS=False
AUTH_USER_REGISTRATION=True
CUSTOM_SECURITY_MANAGER = CustomSecurityManager

6、配置文件没问题以后,我们把宿主机的config.py和custom_security_manager.py挂载到容器里
官方的compose使用了锚点写法,省略一些重复代码

x-superset-volumes:
  &superset-volumes # /app/pythonpath_docker will be appended to the PYTHONPATH in the final container
  - ./docker:/app/docker
  - superset_home:/app/superset_home
  #- ./superset:/app/superset
  - ./superset/config.py:/app/superset/config.py
  - ./superset/custom_security_manager.py:/app/superset/custom_security_manager.py

7、指定compose启动

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

8、使用http://ip:8088访问
如果DB用户和LDAP用户相同,可以用两种密码登录

小问题

compose安装的superset主流数据库都可以连接,但是没有clickhouse,临时处理方式进入容器pip install clickhouse-connect

这里我们找到docker-compose中的一段代码,发现容器启动脚本是docker-bootstrap.sh

  superset:
    env_file: docker/.env-non-dev
    image: *superset-image
    container_name: superset_app
    command: ["/app/docker/docker-bootstrap.sh", "app-gunicorn"]
    user: "root"
    restart: unless-stopped
    ports:
      - 8088:8088
    depends_on: *superset-depends-on
    volumes: *superset-volumes

去修改脚本,在set -eo pipefail下方增加

# add
# 使用 Python 尝试导入 clickhouse_connect 来检查是否已安装
if ! python -c "import clickhouse_connect" 2>/dev/null; then
    echo "clickhouse-connect not found, installing..."
    pip install clickhouse-connect

    # 再次验证是否安装成功
    python -c "import clickhouse_connect" && echo "clickhouse-connect installed successfully"
else
    echo "clickhouse-connect is already installed."
fi
# end

需要down后up才会生效,可以在superset_app容器启动时看到对应输出

参考
https://medium.com/@ozan/configure-ldap-and-local-user-login-on-superset-69fa4df4ee24

标签:Compose,appbuilder,security,Superset,AUTH,LDAP,Docker,superset,docker
From: https://www.cnblogs.com/Jarvansi/p/18359862

相关文章

  • 在虚拟机CentOS中安装docker
    公众号本文地址:在虚拟机CentOS中安装Docker1、关闭防火墙docker需要用到网络,所以需要关闭防火墙。进入管理员模式获得权限后进行关闭。su关闭防火墙:systemctldisablefirewalldsystemctlstopfirewalld2、禁用selinux(1)进入配置文件vim/etc/selinux/configvim/etc/......
  • 部署--项目打成 jar 包后部署为Docker镜像
     在Java项目打成jar包后,可以通过Docker容器进行部署。 1.打包Java项目为jar文件mvncleanpackage完成后会在本地目录target下生成jar文件。如: 2.文件上传将jar包上传到制定的目录下。(如:我的是 control包放在目录/home/dockerdata/docke......
  • docker-compose部署tdengine 3.3.0.0集群
    说明:官方文档提供dockerswarm部署多台服务器集群方式,不适用于公司目前部署方式,故研究多台服务器docker部署集群目前只是部署,还未生产使用,仅供参考一、环境:服务器3台,系统为Ubuntu20.04.4LTSemscluster0110.1.1.103emscluster0210.1.1.104emscluster0310.1.1.105......
  • docker-swarm test
    DockerService(服务)是用于定义和管理单个容器服务的概念。 DockerCompose,它是用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是不能在分布式多机器上使用; Dockerswarm,它构建了docker集群,并且可以通过dockerservice在不同集群节点上运行容器服务,但是缺点......
  • [Python] 通过pymongo连接docker中并开启了副本集的mongodb数据库
    需要指定directConnection=true&authSource=atp-test参数,,否则会报连接副本集超时。在PyMongo中,directConnection参数可以决定客户端是否直接连接到MongoDB服务器,而不是自动发现所有的副本集成员。当directConnection设置为true时,客户端将只连接到MongoDB连接字符......
  • docker安装
    yuminstall-yyum-utils安装docker仓库:yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum-yinstalldocker-ce配置镜像加速器,登录到阿里云......
  • docker源
    目前docker发现不能拉取镜像,找到了一些可用的镜像源(2024年8月仍可用)使用方法:修改文件/etc/docker/daemon.json(如果不存在则创建),修改JSON文件更改为以下内容然后保存。{"registry-mirrors":["https://dockerhub.icu","https://docker.chenby.cn","https:......
  • centos8.5安装docker
    1、设置docker-ce配置文件[root@localhost~]#sudovi/etc/yum.repos.d/docker-ce.repo2、在docker-ce.repo文件中添加以下内容:[docker-ce]name=DockerCEStable-$basearchbaseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/$basearch/stable/gpgcheck......
  • 介绍Docker仓库
    仓库(Repository)是集中存放镜像的地方。一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址dl.dockerpool.com......
  • 介绍Docker容器
    容器是Docker又一核心概念。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。进入Docker容器在使用-d参数时,容器启动后会进入后台。某些时候需要进......