Metabase在Linux上推荐Docker部署,快速验证用docker run,生产环境需通过docker-compose配置PostgreSQL/MySQL元数据库;JAR包方式需OpenJDK 11+及合理JVM参数;systemd服务化保障长期稳定运行。

Metabase 在 Linux 上安装有三种主流方式:直接运行 JAR 包、Docker 容器部署、systemd 服务化部署。优先推荐 Docker 方式,省去 JDK 版本和内存配置踩坑;若需细粒度控制(如指定 MySQL 元数据库),JAR 包 + 环境变量更灵活。
用 docker run 一键启动(适合快速验证)
这是最不容易出错的入门方式,不依赖本地 JDK,镜像自带运行时环境。
docker run -d -p 3000:3000 -v metabase-data:/metabase-data --name metabase metabase/metabase- 首次启动会自动生成
/metabase-data/metabase.db(H2 嵌入式数据库),仅限测试,重启容器数据不丢 - 访问
http://localhost:3000进入初始化向导;后台日志可用docker logs -f metabase查看 - 注意:默认监听
0.0.0.0:3000,如果服务器有防火墙(如ufw或firewalld),需手动放行端口
用 docker-compose 配置元数据库(生产环境必需)
嵌入式 H2 数据库不支持并发写入,生产环境必须换成 PostgreSQL 或 MySQL。用 docker-compose.yml 显式声明连接参数,避免环境变量拼错。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 关键环境变量必须全大写且带
MB_DB_前缀,例如:MB_DB_TYPE=postgres、MB_DB_HOST=db(不能写成host或小写) -
MB_DB_CONNECTION_URI优先级高于其他MB_DB_*参数,但格式必须严格:PostgreSQL 示例为jdbc:postgresql://db:5432/metabase?user=metabase&password=xxx - volume 挂载路径要与容器内路径一致:
- ./data:/metabase-data中的/metabase-data是容器内固定路径,不可改 - 常见错误:
MB_DB_FILE和MB_DB_TYPE同时设置 → 启动失败;MySQL 连接时未加?useSSL=false&serverTimezone=UTC→ 报Could not create connection
用 java -jar 运行(需要手动管理 JDK 和内存)
这种方式对 Java 运行时要求明确,适合已有 JDK 环境或需定制 JVM 参数的场景。
- 必须使用
OpenJDK 11+,JDK 8 会报java.lang.UnsupportedClassVersionError;JDK 17+ 可能因模块限制需加--add-opens参数 - 启动命令示例:
java --add-opens java.base/java.nio=ALL-UNNAMED -Xmx4g -jar metabase.jar;-Xmx至少设为 2g,否则初始化时可能 OOM - 端口通过
MB_JETTY_PORT=8091控制,而非命令行参数;若修改了端口,记得同步调整防火墙和反向代理配置 - 配置 MySQL 元库时,
MB_DB_CONNECTION_URI中的用户名密码必须 URL 编码(如@要写成%40),否则解析失败
systemd 服务化部署(长期运行必须做)
裸跑 java -jar 或 docker run 在终端断开后容易退出,systemd 能保证开机自启、崩溃自动拉起。
- service 文件中
WorkingDirectory必须指向metabase.jar所在目录,否则找不到配置文件或写入metabase.db -
EnvironmentFile=/etc/default/metabase是最佳实践,把所有MB_*变量集中管理,避免硬编码在 service 文件里 -
Restart=always配合RestartSec=10可防频繁崩溃;但若 JVM 内存不足导致循环重启,需先调大-Xmx - 日志默认输出到 journal,用
journalctl -u metabase -f查看;若要落盘,得在ExecStart末尾加> /var/log/metabase.log 2>&1
真正麻烦的不是安装步骤,而是元数据库选型和网络可达性——H2 本地能跑通,不代表换成 PostgreSQL 就一定连得上;localhost 在容器里指容器自身,不是宿主机;外网访问时,MB_SITE_URL 必须设成真实域名或 IP,否则图表导出、邮件通知全失效。

















