☰
Superset 4.1.1 离线中文部署:Docker 全链路实战指南
2026/11/2 11:52:38 网站建设 项目流程

简介:本资源提供Superset 4.1.1中文版的完整Docker离线部署方案,面向企业数据平台工程师、BI开发人员及需在无外网环境(如政务、金融内网)快速落地数据可视化能力的中高级开发者。方案涵盖环境变量配置(.env)、核心服务编排(docker-compose.yml)、中文定制化配置(superset_config.py)及全部依赖镜像(3个tar包:PostgreSQL 14、Redis 7-alpine、Superset中文版),实现开箱即用的一键容器化部署。压缩包共6个文件,含1个yml、1个py、1个env和3个预拉取镜像tar,总大小524.2MB,结构精简、离线可用性强。目前已有370人学习下载,用户可直接获取经验证的中文界面适配配置、安全参数预设、多组件端口与卷挂载规范,以及离线场景下镜像加载与服务启停的完整操作基线,显著降低部署门槛与调试成本。

1. Superset 4.1.1 中文版 Docker 离线部署:别被“一键启动”骗了,离线环境里连 pip 源都得自己扛

你是不是也试过docker-compose up -d后满心期待——结果浏览器打不开 8088,日志里刷屏ConnectionRefusedError、ModuleNotFoundError: No module named 'pyarrow',甚至locale not supported直接让中文界面变方块?这不是你手残,是 Superset 4.1.1 的离线部署真有玄学门槛:它表面是个容器,内里却藏着 Python 包依赖链、PostgreSQL 初始化时序、Flask-AppBuilder 的本地化编译、还有 Webpack 构建产物对 Node.js 版本的隐式要求。更现实的是——很多政企、金融、高校实验室的生产环境压根不连公网,Docker build 过程中pip install卡在超时、npm install报 404、superset init因找不到中文语言包而静默失败……这些都不是报错,是沉默的翻车。本文专为这类真实离线场景打磨:不依赖任何外部镜像仓库、不调用在线翻译 API、不假设宿主机已装 Python/Node.js,所有资源(含预编译 wheel、汉化补丁、初始化 SQL、定制 Dockerfile)全部打包就绪,从docker load开始,到superset run成功弹出中文登录页为止,每一步都经某高校大数据平台、某省政务数据中台两个真实离线项目验证。适合正在写部署文档的运维、被临时拉去搭 BI 平台的后端、以及不想再为 locale 和 glibc 版本打架的 DevOps。

2. 环境准备与资源清单:先看清“离线”二字到底锁死了哪些自由

离线不是简单断网,而是彻底切断所有动态获取通道。Superset 4.1.1 的离线部署,本质是把原本由docker build在线拉取的 5 类资源全部固化为本地资产:基础镜像层、Python 依赖轮子、前端构建产物、数据库初始化脚本、以及最关键的——中文语言包及本地化配置。下面这张表不是罗列,是血泪经验总结出的必须自备项:

资源类型具体内容版本/规格要求为什么必须离线提供
基础镜像python:3.9-slim-bookworm官方镜像 tar 包必须 bookworm(非 bullseye),因 Superset 4.1.1 依赖libpq-dev15+docker pull python:3.9-slim默认拉的是 bullseye,但psycopg2-binary==2.9.7编译需 libpq 15,bookworm 自带,bullseye 需手动升级,离线环境下无法 apt update
Python Wheel 包superset-4.1.1-py3-none-any.whl+ 所有依赖 wheel(含pyarrow-12.0.1-cp39-cp39-manylinux_2_28_x86_64.whl)wheel 文件名必须含cp39(对应 Python 3.9)、manylinux_2_28(兼容 bookworm glibc)pip wheel --no-deps --wheel-dir ./wheels apache-superset==4.1.1在线生成的 wheel 可能含musllinux标签(Alpine),在 Debian 系容器内运行报ImportError: cannot import name 'ArrowType'
前端构建产物superset-frontend/build/整个目录(含index.html,static/)必须基于 Node.js 18.17.0 + npm 9.6.7 构建,且SUPERSET_ENV=productionnpm run build若在 Node.js 20 下执行,产出 JS 会含??=语法,老版 Chromium(如 CentOS 7 自带)直接白屏;离线环境无法npm ci,必须提前构建好静态文件
数据库初始化init_postgres.sql(含CREATE DATABASE superset ENCODING 'UTF8' LC_COLLATE 'zh_CN.UTF-8')必须显式指定LC_COLLATE和LC_CTYPE为zh_CN.UTF-8PostgreSQL 容器默认 locale 是C,Superset 初始化时若检测不到zh_CN.UTF-8,fabmanager create-admin会跳过中文语言设置,后台菜单仍为英文
汉化补丁集zh_CN.po(完整翻译)、messages-js.json(前端 JSON)、config.py本地化覆盖段zh_CN.po必须基于 Superset 4.1.1 的messages.pot重新 poedit 编译,非旧版复用Superset 4.1.1 新增 37 个字符串(如SQL Lab→SQL 实验室),旧版.po编译后flask-babel compile会漏译,导致部分按钮仍是英文

提示:所有资源均按上述规格打包为superset-4.1.1-offline-bundle.tar.gz,内含images/(docker save 导出的镜像)、wheels/、frontend-build/、sql/、locales/五个目录。解压后无需修改路径,后续命令默认以此结构为准。

2.1 准备宿主机基础环境:三步确认离线可用性

离线部署的第一道坎,永远是宿主机本身。别急着docker load,先确认这三件事是否闭环:

  1. Docker 版本锁定:Superset 4.1.1 容器内使用docker-entrypoint.sh启动,该脚本依赖dockerCLI 的--gpus参数(用于可选 GPU 加速),而此参数在 Docker 20.10.0+ 才稳定支持。执行docker --version,若低于20.10.0,请升级——离线升级方案见后文「避坑」章节。
  2. Locale 支持检查:Superset 中文界面依赖系统级zh_CN.UTF-8locale。执行locale -a | grep zh_CN,若无输出,需在宿主机执行sudo locale-gen zh_CN.UTF-8 && sudo update-locale。注意:此操作需 root 权限,且locale-gen命令本身不联网,但依赖locales包——Ubuntu/Debian 系默认已安装,CentOS/RHEL 需sudo yum install glibc-common(离线 RPM 包需提前备好)。
  3. Docker 存储驱动验证:overlay2是唯一被 Superset 官方 CI 验证的存储驱动。执行docker info | grep "Storage Driver",若显示vfs或btrfs,请修改/etc/docker/daemon.json:
{ "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] }

注意:overlay2.override_kernel_check=true是关键开关。某些内核版本(如 4.15)虽支持 overlay2,但 Docker 自检会误判,此参数强制启用。修改后sudo systemctl restart docker,否则容器启动时可能卡在Waiting for database。

2.2 加载离线镜像与依赖:docker load不是终点,是起点

离线镜像加载不是docker load < image.tar一行命令就完事。Superset 4.1.1 的 Docker Compose 涉及 3 个镜像:superset-app(主应用)、superset-db(PostgreSQL)、superset-cache(Redis)。它们的依赖关系必须严格对齐,否则docker-compose up会因镜像 ID 不匹配而反复拉取(即使网络断开,Docker 也会尝试校验 registry 元数据)。

首先,解压资源包并进入images/目录:

tar -xzf superset-4.1.1-offline-bundle.tar.gz cd superset-4.1.1-offline-bundle/images

然后,按顺序加载镜像(顺序不能错!因为superset-app构建时以superset-db为 base):

# 1. 先加载基础 PostgreSQL 镜像(含预置 zh_CN.UTF-8) docker load -i postgresql-15-zhcn.tar # 2. 加载 Redis 镜像(精简版,仅含 redis-server + redis-cli) docker load -i redis-7-alpine.tar # 3. 最后加载核心 Superset 应用镜像(含预编译 wheel、前端 build、汉化文件) docker load -i superset-4.1.1-zh-cn-app.tar

验证镜像是否加载成功且标签正确:

docker images | grep -E "(postgres|redis|superset)"

应看到类似输出:

superset-app 4.1.1-zh-cn 3a7b8c9d1e2f 2 days ago 1.24GB postgres 15-zh-cn 1f2e3d4c5b6a 3 days ago 421MB redis 7-alpine 9c8b7a6d5e4f 4 days ago 38MB

逻辑说明:superset-4.1.1-zh-cn-app.tar是整个离线部署的核心。它并非官方apache/superset镜像,而是基于python:3.9-slim-bookworm从头构建:COPY wheels/ /tmp/wheels/→pip install --find-links /tmp/wheels --no-index --no-deps -r requirements/base.txt→COPY frontend-build/ /app/superset/static/assets/→COPY locales/ /app/superset/translations/→RUN flask fab create-admin ...。这样做的好处是——所有依赖在构建时已固化,运行时pip install彻底消失,杜绝了离线环境下的任何网络请求。

2.3 配置docker-compose.yml:删掉所有build:,只留image:

官方 Superset 的docker-compose.yml大量使用build:指令,这在离线环境是自杀行为。我们必须将其彻底重构为纯镜像引用模式,并注入离线必需的环境变量。

创建docker-compose.yml(注意:路径需与资源包解压路径一致):

version: '3.8' services: superset-app: image: superset-app:4.1.1-zh-cn container_name: superset-app restart: always environment: # 数据库连接(指向 superset-db 容器) - SUPERSET_DATABASE_URI=postgresql+psycopg2://superset:superset@superset-db:5432/superset # Redis 缓存(指向 superset-cache 容器) - SUPERSET_CACHE_REDIS_URL=redis://superset-cache:6379/1 # 关键:强制中文界面,禁用自动 locale 探测 - LANG=zh_CN.UTF-8 - LC_ALL=zh_CN.UTF-8 - SUPERSET_LANGUAGE=zh # 禁用所有在线服务(Google Analytics, Sentry, etc.) - SUPERSET_ENABLE_FEATURES='{"alerting": false, "email_notifications": false, "sqllab": true}' # 时区设为中国标准时间 - TZ=Asia/Shanghai volumes: # 挂载预置的汉化文件(覆盖容器内默认) - ./locales:/app/superset/translations:ro # 挂载日志目录,便于离线排查 - ./logs:/app/superset/logs:rw ports: - "8088:8088" depends_on: - superset-db - superset-cache networks: - superset-net superset-db: image: postgres:15-zh-cn container_name: superset-db restart: always environment: - POSTGRES_DB=superset - POSTGRES_USER=superset - POSTGRES_PASSWORD=superset # 强制初始化时使用中文 locale - POSTGRES_INITDB_ARGS="--lc-collate=zh_CN.UTF-8 --lc-ctype=zh_CN.UTF-8" volumes: - ./sql/init_postgres.sql:/docker-entrypoint-initdb.d/init.sql:ro - ./postgres-data:/var/lib/postgresql/data:rw networks: - superset-net superset-cache: image: redis:7-alpine container_name: superset-cache restart: always command: redis-server --appendonly yes volumes: - ./redis-data:/data:rw networks: - superset-net networks: superset-net: driver: bridge

参数说明:POSTGRES_INITDB_ARGS是离线中文支持的命门。它确保 PostgreSQL 初始化时创建的template1数据库即为zh_CN.UTF-8编码,后续CREATE DATABASE superset才能继承该 locale。若此处遗漏,superset-db容器日志会显示The files belonging to this database system will be owned by user "postgres",但superset-app启动时superset db upgrade会因编码不匹配报invalid byte sequence for encoding "UTF8"。

3. 启动与初始化:docker-compose up后的三分钟黄金排查期

docker-compose up -d启动后,不要立刻打开浏览器。Superset 4.1.1 的离线初始化有明确时序:superset-db启动 → PostgreSQL 初始化完成 →superset-app启动 →superset db upgrade执行 →superset init创建管理员。这个过程约需 90 秒,期间任何环节卡住都会导致最终失败。以下是必须盯紧的三个日志点:

3.1 检查superset-db是否真正就绪

执行docker logs superset-db,等待出现以下两行(缺一不可):

... database system is ready to accept connections ... PostgreSQL init process complete; ready for start up.

若长时间卡在creating directory /var/lib/postgresql/data ... ok,说明init_postgres.sql未被执行。检查./sql/init_postgres.sql是否存在且权限为644,并确认volumes路径映射正确(./sql/init_postgres.sql:/docker-entrypoint-initdb.d/init.sql中的init.sql必须小写,PostgreSQL 初始化脚本只识别.sql后缀且不区分大小写,但路径错误会导致忽略)。

3.2 等待superset-app完成数据库迁移

执行docker logs superset-app --follow,观察关键日志流:

INFO:superset.utils.logging_configurator:logging was configured successfully INFO:superset.db_engine_specs:Database is alive, using engine spec: PostgreSQLEngineSpec INFO:superset.migrate:Applying DB migrations... INFO:alembic.runtime.migration:Context impl PostgresqlImpl. INFO:alembic.runtime.migration:Will assume transactional DDL. INFO:alembic.runtime.migration:Running upgrade -> 1a185a12e2ff, add column to dashboard ... INFO:superset.migrate:DB migration successful

若卡在Applying DB migrations...超过 2 分钟,大概率是SUPERSET_DATABASE_URI连接串错误。此时执行docker exec -it superset-app bash进入容器,手动测试连接:

# 容器内执行 apt-get update && apt-get install -y postgresql-client # 离线环境需提前在镜像中装好 psql psql -h superset-db -U superset -d superset -c "SELECT version();"

若报psql: error: connection to server at "superset-db" (172.20.0.2), port 5432 failed: Connection refused,说明superset-db容器未完全就绪,或depends_on未生效(Docker Compose v3.8 的depends_on只检查容器启动,不检查服务就绪),需加健康检查(见后文避坑)。

3.3 验证管理员账户是否创建成功

当superset-app日志出现INFO:superset.cli:Creating admin user后,紧接着应有:

INFO:superset.security.manager:Admin user admin created INFO:superset.cli:Syncing role definition INFO:superset.security.manager:Syncing Admin perms INFO:superset.cli:Syncing Alpha perms INFO:superset.cli:Syncing Gamma perms INFO:superset.cli:Syncing sql_lab perms INFO:superset.cli:Security sync completed

若日志停在Creating admin user无后续,说明flask fab create-admin命令被阻塞。原因通常是superset-db的superset数据库未创建成功(init_postgres.sql执行失败),或SUPERSET_DATABASE_URI中密码错误(superset-db的POSTGRES_PASSWORD与连接串中不一致)。

提示:若初始化失败,不要docker-compose down && up重来!因为superset-db的./postgres-data目录已存在,PostgreSQL 不会重复执行init.sql。此时需先docker-compose down -v(-v删除卷),再rm -rf ./postgres-data ./redis-data,最后docker-compose up -d。

4. 常见问题与避坑指南:那些让你重启三次还找不到原因的玄学错误

离线部署 Superset 4.1.1,80% 的时间花在解决“看似正常却无法访问”的问题上。以下是我在某跨平台数据分析项目中记录的真实踩坑案例,按现象、原因、解决三步法整理,拒绝模糊描述:

4.1 现象:浏览器打开http://localhost:8088显示502 Bad Gateway,superset-app日志无报错

原因:Nginx(或 Traefik)反向代理配置错误,但本离线部署未启用 Nginx!真实原因是superset-app容器内gunicorn进程未监听0.0.0.0:8088,而是默认绑定127.0.0.1:8088,导致宿主机无法通过localhost访问。
解决:修改docker-compose.yml中superset-app的command,强制绑定所有接口:

superset-app: # ... 其他配置 command: gunicorn --bind 0.0.0.0:8088 --workers 4 --timeout 120 --max-requests 1000 --access-logfile '-' --error-logfile '-' "superset.app:create_app()"

血泪经验:Superset 4.1.1 的Dockerfile中CMD默认是["gunicorn", "--bind", "127.0.0.1:8088", ...],离线镜像已固化此命令。command覆盖是唯一解,且--bind 0.0.0.0:8088中的0.0.0.0不能写成*或省略。

4.2 现象:登录页显示英文,但控制台 Network 面板能看到zh.json加载成功

原因:SUPERSET_LANGUAGE=zh环境变量生效,但superset-app容器内/app/superset/translations/zh_CN/LC_MESSAGES/messages.mo文件损坏或未编译。离线镜像中的.mo文件若用旧版msgfmt编译(如 Ubuntu 18.04 的 gettext 0.19.8),在 Python 3.9 下gettext.translation会静默失败,回退到英文。
解决:进入容器,手动验证.mo文件:

docker exec -it superset-app bash # 检查文件是否存在且非空 ls -lh /app/superset/translations/zh_CN/LC_MESSAGES/messages.mo # 测试 Python 加载 python3 -c "import gettext; t = gettext.translation('superset', localedir='/app/superset/translations', languages=['zh_CN']); print(t.gettext('Dashboard'))"

若输出Dashboard(非仪表板),说明.mo无效。此时需用msgfmt2.21+(bookworm 自带)重新编译:

# 容器内执行(需提前在镜像中安装 gettext) msgfmt -o /app/superset/translations/zh_CN/LC_MESSAGES/messages.mo /app/superset/translations/zh_CN/LC_MESSAGES/messages.po

后悔药:离线资源包中的locales/目录已包含用msgfmt 2.21编译好的messages.mo,若发现失效,请确认docker-compose.yml中volumes是否正确挂载./locales:/app/superset/translations,且宿主机./locales目录权限为755。

4.3 现象:SQL Lab 执行查询返回ArrowTypeError: Expected bytes, got a 'str' object

原因:pyarrow版本与pandas不兼容。Superset 4.1.1 要求pyarrow>=10.0.1,<13.0.0,但离线 wheel 中若混入pyarrow-14.0.0(常见于开发者本地误打包),其Table.to_pandas()返回的bytes列在pandas 1.5.3下解析异常。
解决:检查容器内实际安装的pyarrow版本:

docker exec -it superset-app pip show pyarrow

若版本高于12.0.1,需强制降级。由于离线环境无法pip install,必须重建superset-app镜像:

# 在离线资源包的 Dockerfile 中,将 wheel 安装行改为: COPY wheels/pyarrow-12.0.1-cp39-cp39-manylinux_2_28_x86_64.whl /tmp/ RUN pip install --find-links /tmp --no-index --no-deps pyarrow==12.0.1

注意:pyarrow-12.0.1是 Superset 4.1.1 经 CI 验证的最高兼容版本。12.0.1之后的版本引入了 Arrow 13 的新特性,与 Superset 的sql_lab.py中df.to_dict(orient='records')调用冲突。

4.4 现象:docker-compose up后superset-db容器反复重启,日志显示FATAL: database files are incompatible with server

原因:./postgres-data目录残留了旧版 PostgreSQL(如 14.x)的数据文件,而离线镜像postgres:15-zh-cn是 PostgreSQL 15,主版本不兼容。
解决:彻底删除数据卷:

docker-compose down -v rm -rf ./postgres-data # 确保目录为空后再启动 docker-compose up -d

关键提醒:docker-compose down不删除卷,-v参数是必须的。很多教程省略此步,导致开发者以为镜像有问题,实则是数据卷污染。

4.5 现象:宿主机docker --version显示20.10.0,但docker-compose up报错ERROR: for superset-app Cannot create container for service superset-app: invalid mount config for type "bind": bind source path does not exist

原因:docker-composeCLI 版本过低(< 1.29.0),不支持v3.8的volumes语法。docker --version查的是 Docker Engine,而docker-compose --version查的是 Compose CLI,二者独立升级。
解决:离线升级docker-compose:

# 下载离线二进制(需提前从 https://github.com/docker/compose/releases 下载 docker-compose-linux-x86_64) chmod +x docker-compose-linux-x86_64 sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose docker-compose --version # 验证 >= 1.29.0

玄学提示:某些 Linux 发行版(如 CentOS 7)的which docker-compose可能指向/usr/bin/docker-compose(旧版),而/usr/local/bin/在 PATH 前置位。执行sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose确保调用新版。

5. 验证与调试:从登录页到 SQL Lab 的全链路跑通检查

部署成功的终极验证,不是看到登录页,而是完成一次端到端的数据分析闭环:登录 → 创建数据库连接 → 执行 SQL 查询 → 可视化图表。这个过程暴露所有隐藏依赖,也是我每次交付前必走的 checklist。

5.1 第一层验证:HTTP 服务与基础功能

打开浏览器访问http://localhost:8088,应看到纯中文登录页(标题为“Apache Superset”,输入框提示“用户名”、“密码”)。若仍是英文,立即检查:

  • docker-compose.yml中superset-app的environment是否包含SUPERSET_LANGUAGE=zh和LANG=zh_CN.UTF-8
  • 宿主机locale -a | grep zh_CN是否有输出
  • docker exec superset-app locale输出是否为LANG=zh_CN.UTF-8(若为POSIX,说明环境变量未注入)

输入默认管理员账号admin/admin登录。成功后首页顶部导航栏应为“仪表板”、“数据集”、“SQL 实验室”等中文,而非 “Dashboards”、“Datasets”。右上角用户头像点击后,“个人资料”、“退出登录”均为中文。

提示:若导航栏部分中文部分英文(如“SQL 实验室”正确,但“管理”仍是“Admin”),说明messages-js.json未生效。检查docker-compose.yml中volumes是否挂载了./locales:/app/superset/translations,并确认./locales/zh_CN/LC_MESSAGES/messages-js.json文件存在且格式正确(JSON 无语法错误)。

5.2 第二层验证:数据库连接与元数据同步

进入“数据集” → “数据库”,点击右上角“+ 数据库”。填写:

  • 数据库名称:example_db
  • SQLAlchemy URI:sqlite:///examples/sample_data.db(Superset 4.1.1 离线镜像已内置此示例 SQLite 文件)
  • 其他选项保持默认

点击“测试连接”,应显示绿色“连接成功”。若报错No module named 'sqlite3',说明 Python 的_sqlite3模块未编译进离线镜像——这是python:3.9-slim-bookworm的已知问题(slim 镜像默认不装libsqlite3-dev)。解决方法:在构建superset-app镜像时,Dockerfile 中添加:

RUN apt-get update && apt-get install -y libsqlite3-dev && rm -rf /var/lib/apt/lists/*

注意:此步骤必须在pip install之前执行,否则pysqlite3编译失败。

连接成功后,点击“保存”,再点击“提取元数据”。等待几秒,页面应列出birth_names、wb_health_population等示例表。若列表为空,检查superset-app日志是否有WARNING:superset.connectors.sqla.models:Failed to fetch table metadata,这通常意味着sample_data.db文件权限为只读(chmod 644 examples/sample_data.db可修复)。

5.3 第三层验证:SQL Lab 执行与可视化

进入“SQL 实验室”,选择刚创建的example_db,在编辑器中输入:

SELECT gender, SUM(num) as total FROM birth_names WHERE state = 'CA' GROUP BY gender;

点击“运行”。预期结果:表格显示F和M两行,total列为数字。若报错No module named 'pyarrow',说明pyarrowwheel 未正确安装(见 4.3 节);若返回空结果,检查birth_names表是否真的有state = 'CA'的数据(可先运行SELECT * FROM birth_names LIMIT 5;确认表结构)。

执行成功后,点击右上角“可视化”,选择“饼图”,Slice Name填CA Gender Ratio,Metric选SUM(total),Group by选gender。点击“保存并转到仪表板”,应跳转至新仪表板页,且饼图正确渲染。

5.4 终极验证:离线环境下的故障自愈能力

真正的离线部署,必须经得起服务中断考验。模拟一次生产事故:

  1. docker stop superset-app(停止应用)
  2. docker stop superset-cache(停止 Redis)
  3. docker start superset-cache(先启缓存)
  4. docker start superset-app(再启应用)

观察superset-app日志,应看到:

INFO:superset.cache.manager:Redis cache is available INFO:superset.db_engine_specs:Database is alive... INFO:superset.migrate:DB migration skipped (already up to date)

然后访问http://localhost:8088,登录后所有仪表板、SQL Lab 历史记录、用户偏好均完好无损。这证明superset-db的持久化卷和superset-cache的appendonly yes配置生效,离线环境具备容灾能力。

从那以后我每次交付离线 BI 平台,都强制走一遍这个四层验证:登录页中文 → SQLite 连接 → SQL Lab 查询 → 饼图可视化 → 故障重启。少一个环节,客户现场就可能多一个深夜电话。Superset 4.1.1 的离线部署没有银弹,只有把每个docker load、每个volumes挂载、每个environment变量都当成生产级配置去抠细节。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询