配置Superset
配置
为了配置你的应用,你需要创建superset_config.py
文件,增加到你的PYTHONPATH
下。如果你的应用是使用docker-compose安装的,替代的配置是需要的,更多的细节在https://github.com/apache/superset/tree/master/docker#readme查看。
下面是在文件里可以设置的参数:
# Superset特有的配置
ROW_LIMIT = 5000
SUPERSET_WEBSERVER_PORT = 8088
# Flask应用构建配置
# 你的应用密钥将用于安全登录回话cookie和在数据库里加密敏感信息
# 确保更改这个密钥为了你部署时使用一个安全的密钥
# 你可以使用`openssl rand -base64 42`创建一个更安全的密钥
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
# SQLAlchemy连接你的后台数据库
# 连接数据库的连接存储在superset的元数据里(slices,连接,表,仪表盘, ...)
#注意:连接到数据源的连接,你可以通过Web页面直接进行管理
SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/superset.db'
# Flask-WTF的CSRF标识
WTF_CSRF_ENABLED = True
# 增加不需要CSRF保护的站点
WTF_CSRF_EXEMPT_LIST = []
# 一个一年有效期的CSRF令牌
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365
# 设置这个API密钥来使用Mapbox的可视化
MAPBOX_API_KEY = ''
所有的参数和默认值都定义在https://github.com/apache/superset/blob/master/superset/config.py,你可以在本地的superset_config.py
里修改它。
管理员想要通过这个了解哪些可以本地配置或者默认值是哪些。
因为superset_config.py
作为Flask配置模块,所以它能修改Flask配置,也可以修改Flask扩展,例如:flask-wtf
, flask-caching
, flask-migrate
,
和 flask-appbuilder
。Superset使用的Web框架-Flask,提供了许多的配置,
可以从Flask App Builder Documentation获得更多的关于如何配置它的信息。
确保下面的修改了:
SQLALCHEMY_DATABASE_URI
: 默认存储在 ~/.superset/superset.dbSECRET_KEY
: 一个长的随机字符串
如果你想要某个站点免除CSRF(例如,你正在运行一个自定义认证站点),你可以把该站点增加到WTF_CSRF_EXEMPT_LIST
:
WTF_CSRF_EXEMPT_LIST = [‘’]
使用生产级别的元数据存储
Superset默认数据使用SQLite,它是简单的,它是容易上手的(不需要安装)。但是,对于生产环境,你应该在一个独立的主机或容器上使用一个不同的数据库引擎。
Supeset支持下面的数据库引擎/版本:
Database Engine | Supported Versions |
---|---|
PostgreSQL | 10.X, 11.X, 12.X, 13.X, 14.X |
MySQL | 5.X |
使用下面的数据库驱动和连接字符串:
Database | PyPI package | Connection String |
---|---|---|
PostgreSQL | pip install psycopg2 | postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name> |
MySQL | pip install mysqlclient | mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name> |
SQLite | No additional library needed | sqlite:// |
为了配置Superset元存储,可以通过在superset_config
文件里的SQLALCHEMY_DATABASE_URI
配置项来修改连接字符串。
运行在一个WSGI HTTP服务器
当你在NGINX或Apache上运行Superset时,我们推荐使用同步模式的Gunicorn。这样能提高并发水平,而且它是容易安装和配置的。 请参考你更喜欢的技术文档去设置能让在你的环境中能运行的更好的Flask WSGI应用。
-w 10 \
-k gevent \
--worker-connections 1000 \
--timeout 120 \
-b 0.0.0.0:6666 \
--limit-request-line 0 \
--limit-request-field_size 0 \
--statsd-host localhost:8125 \
"superset.app:create_app()"
参考Gunicorn文档来获得更多的信息。请注意:开发模式的Web服务器(superset run
或flask run
)是不适合生产使用的。
如果你没有使用Gunicorn,你可以在superset_config.py
文件通过设置COMPRESS_REGISTER = False
来禁用flask-compress
。
使用负载均衡器的配置
如果你在使用负载均衡或者代理服务器(例如:NGINX或者ELB在AWS上)之后运行superset,你可能需要集成健康检查终端,这是为了让你的负载均衡器知道你的superset实例正在运行。
如果web服务器正在运行,在/health
会返回一个包含“OK”的200响应。
如果负载均衡器插入X-Forwarded-For/X-Forwarded-Proto
数据头,你应该在superset配置文件 (superset_config.py
)增加ENABLE_PROXY_FIX = True
,来提取和使用数据头。
如果反向代理使用了SSL加密,则需要增加X-Forwarded-Proto
。对于Apache服务器可以通过如下设置:
RequestHeader set X-Forwarded-Proto "https"
自定义OAuth2配置
除了FAB支持的提供者 (GitHub, Twitter, LinkedIn, Google, Azure, etc),它是容易连接到一个带有OAuth2支持“code”授权的认证服务的Superset,
确保 使用pip安装了Authlib
。
首先,在superset_config.py
配置授权
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
{ 'name':'egaSSO',
'token_key':'access_token', # Name of the token in the response of access_token_url
'icon':'fa-address-card', # Icon for the provider
'remote_app': {
'client_id':'myClientId', # Client Id (Identify Superset application)
'client_secret':'MySecret', # Secret for this Client Id (Identify Superset application)
'client_kwargs':{
'scope': 'read' # Scope for the Authorization
},
'access_token_method':'POST', # HTTP Method to call access_token_url
'access_token_params':{ # Additional parameters for calls to access_token_url
'client_id':'myClientId'
},
'access_token_headers':{ # Additional headers for calls to access_token_url
'Authorization': 'Basic Base64EncodedClientIdAndSecret'
},
'api_base_url':'https://myAuthorizationServer/oauth2AuthorizationServer/',
'access_token_url':'https://myAuthorizationServer/oauth2AuthorizationServer/token',
'authorize_url':'https://myAuthorizationServer/oauth2AuthorizationServer/authorize'
}
}
]
# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True
# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = "Public"
然后,创建一个继承了SupersetSecurityManager
的CustomSsoSecurityManager
类,重写oauth_user_info
方法。
import logging
from superset.security import SupersetSecurityManager
class CustomSsoSecurityManager(SupersetSecurityManager):
def oauth_user_info(self, provider, response=None):
logging.debug("Oauth2 provider: {0}.".format(provider))
if provider == 'egaSSO':
# As example, this line request a GET to base_url + '/' + userDetails with Bearer Authentication,
# and expects that authorization server checks the token, and response with user details
me = self.appbuilder.sm.oauth_remotes[provider].get('userDetails').data
logging.debug("user_data: {0}".format(me))
return { 'name' : me['name'], 'email' : me['email'], 'id' : me['user_name'], 'username' : me['user_name'], 'first_name':'', 'last_name':''}
...
这个文件必须和superset_config.py同目录,文件名必须是
custom_sso_security_manager.py。最后,增加下面的两行内容到
superset_config.py`:
from custom_sso_security_manager import CustomSsoSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager
注意
当配置OAuth2认证提供者后访问URL是
https://<superset-webserver>/oauth-authorized/<provider-name>
。例如, 对于以上配置的访问URL是https://<superset-webserver>/oauth-authorized/egaSSO
。如果OAuth2认证服务器支持OpenID Connect 1.0, 你可以配置他的配置文档URL,可以只提供
api_base_url
,access_token_url
,authorize_url
和其他的必须选项例如:user info endpoint, jwks uri等. 示例:OAUTH_PROVIDERS = [
{ 'name':'egaSSO',
'token_key':'access_token', # Name of the token in the response of access_token_url
'icon':'fa-address-card', # Icon for the provider
'remote_app': {
'client_id':'myClientId', # Client Id (Identify Superset application)
'client_secret':'MySecret', # Secret for this Client Id (Identify Superset application)
'server_metadata_url': 'https://myAuthorizationServer/.well-known/openid-configuration'
}
}
]
Flask应用请求钩子配置
FLASK_APP_MUTATOR
是你环境中的配置函数,它接受一个应用对象,而且它可以在任何时候被修改。例如, 增加 FLASK_APP_MUTATOR
到你的
superset_config.py
文件,来设置会话过期时间为24小时:
from flask import session
from flask import Flask
def make_session_permanent():
'''
Enable maxAge for the cookie 'session'
'''
session.permanent = True
# 设置会话最大的市场为 24小时
PERMANENT_SESSION_LIFETIME = timedelta(hours=24)
def FLASK_APP_MUTATOR(app: Flask) -> None:
app.before_request_funcs.setdefault(None, []).append(make_session_permanent)
特性标志
为了支持不同的用户,Superset默认没有启用一些特性。例如,一些用户可能有严格的安全限制,而其他用户可能没有。所以,Superset允许用户通过配置开启或关闭一些特性。 对于特性使用者来说,你可以在Superset里增加增加可选的功能,但是,这个只会影响到一部分用户。
你可以在superset_config.py
里使用标志开启或关闭特性:
FEATURE_FLAGS = {
'CLIENT_CACHE': False,
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
'PRESTO_EXPAND_DATA': False,
}
可以在RESOURCES/FEATURE_FLAGS.md找到特性标志列表。
更换SECRET_KEY
如果你想要更换SECRET_KEY(更改存在的secret key),请按照以下步骤操作。
增加新的SECRET_KEY和PREVIOUS_SECRET_KEY到superset_config.py
:
PREVIOUS_SECRET_KEY = 'CURRENT_SECRET_KEY' # The default SECRET_KEY for deployment is '21thisismyscretkey12eyyh'
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
然后运行 superset re-encrypt-secrets