在 Debian 上将 Metabase 作为服务与 Nginx 一起运行

对于那些无法(或不愿)在其基础设施中使用 Docker 的人来说,仍然需要一种简单的方法来设置和部署 Metabase 生产环境。在基于 Debian 的系统上,这意味着将 Metabase 注册为一个可以启动/停止/卸载的服务。

注意:这只是一个基础指南,旨在帮助您入门。任何人都可以从此开始,根据其系统需求进行操作,并应遵循设置和保护其服务器其余部分的最佳实践。

前提条件

本指南的核心假设

  • 您将使用 metabase.jar 文件运行 Metabase
  • 您的服务器上已运行 nginxpostgres(或其他受支持的数据库)
  • 您将使用环境变量配置 Metabase 实例
  • 您在服务器上具有 sudo 访问权限

创建一个非特权用户来运行 Metabase,并授予该用户对应用程序和日志的访问权限

出于安全原因,我们希望 Metabase 以非特权用户身份运行。我们将此用户简称为 metabase。此外,我们还将创建稍后用于 Metabase 日志记录和配置的文件,并为我们的非特权用户应用正确的安全设置。

sudo groupadd -r metabase
sudo useradd -r -s /bin/false -g metabase metabase
sudo chown -R metabase:metabase </your/path/to/metabase/directory>
sudo touch /var/log/metabase.log
sudo chown syslog:adm /var/log/metabase.log
sudo touch /etc/default/metabase
sudo chmod 640 /etc/default/metabase

创建 Metabase 服务

每个服务都需要一个脚本,告诉 systemd 如何管理它以及它支持哪些功能。服务通常注册在 /etc/systemd/system/<servicename>。因此,Metabase 服务应位于 /etc/systemd/system/metabase.service

Metabase 服务文件

创建 /etc/systemd/system/metabase.service 服务文件并在编辑器中打开它

sudo touch /etc/systemd/system/metabase.service
sudo <your-editor> /etc/systemd/system/metabase.service

/etc/systemd/system/metabase.service 中,将可配置项(例如 <some-var-name>)替换为适合您系统的值。下面的 Metabase 脚本附有额外注释,可帮助您了解各项用途。

[Unit]
Description=Metabase server
After=syslog.target
After=network.target

[Service]
WorkingDirectory=</your/path/to/metabase/directory/>
ExecStart=/usr/bin/java --add-opens java.base/java.nio=ALL-UNNAMED -jar </your/path/to/metabase/directory/>metabase.jar
EnvironmentFile=/etc/default/metabase
User=metabase
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=metabase
SuccessExitStatus=143
TimeoutStopSec=120
Restart=always

[Install]
WantedBy=multi-user.target

创建 syslog 配置

接下来,我们需要创建一个 syslog 配置,以确保 systemd 能够正确处理日志。

sudo touch /etc/rsyslog.d/metabase.conf
sudo <your-editor> /etc/rsyslog.d/metabase.conf

if $programname == 'metabase' then /var/log/metabase.log
& stop

重启 syslog 服务以加载新配置。

sudo systemctl restart rsyslog.service

Metabase 环境变量环境变量提供了一种很好的方式,可以在服务器上自定义和配置 Metabase 实例。在 Debian 系统上,服务通常期望在 etc/default/<service-name> 内部伴随配置。

环境变量提供了一种很好的方式来在您的服务器上自定义和配置您的 Metabase 实例。在 Debian 系统上,服务通常期望在以下位置拥有配套的配置文件:etc/default/<service-name>

Metabase 配置文件

在您的编辑器中打开 /etc/default/metabase 环境配置文件

sudo <your-editor> /etc/default/metabase

/etc/default/metabase 中,将可配置项(例如 <some-var-name>)替换为适合您系统的值。一些 Metabase 配置具有可用选项,其中一些如下所示,以 | 符号分隔

MB_PASSWORD_COMPLEXITY=<weak|normal|strong>
MB_PASSWORD_LENGTH=<10>
MB_JETTY_HOST=<0.0.0.0>
MB_JETTY_PORT=<12345>
MB_DB_TYPE=<postgres|mysql|h2>
MB_DB_DBNAME=<your_metabase_db_name>
MB_DB_PORT=<5432>
MB_DB_USER=<your_metabase_db_user>
MB_DB_PASS=<ssshhhh>
MB_DB_HOST=<localhost>
MB_EMOJI_IN_LOGS=<true|false>
# any other env vars you want available to Metabase

最后步骤

在基于 Debian 的系统上将 Metabase 设置为服务最棒的地方在于,您可以确信它会在每次系统启动时自动运行。我们只需再完成几个快速步骤,即可完成服务注册并让 Metabase 启动运行。

确保您的数据库已准备就绪

如果您正在运行 postgres 或其他数据库,您需要确保已按照数据库系统的说明为 Metabase 创建了数据库,以及一个可以访问该数据库的用户。这些值应与您在 Metabase 配置中为 MB_DB_TYPEMB_DB_DBNAMEMB_DB_USERMB_DB_PASS 环境变量设置的值匹配。如果您的数据库未正确配置,Metabase 将无法启动。

确保 nginx 已设置为代理 Metabase 请求

深入了解 nginx 的配置超出了本指南的范围,但这里提供了一个简单的 nginx.conf 文件,可以帮助您快速启动和运行。

注意:下面的 nginx.conf 假定您正在接受端口 80 上的入站流量并希望将请求代理到 Metabase,并且您的 Metabase 实例配置为在 localhost 的端口 3000 上运行。您可能需要关注几个代理指令,因此您应该在官方 nginx 文档中进一步查看它们。

# sample nginx.conf
# proxy requests to Metabase instance
server {
  listen 80;
  listen [::]:80;
  server_name your.domain.com;
  location / {
    proxy_pass http://127.0.0.1:3000;
  }
}

注册您的 Metabase 服务

现在,是时候向 systemd 注册我们的 Metabase 服务了,这样它将在系统启动时自动启动。我们还将确保日志文件由服务运行 metabase.jar 的非特权用户创建并拥有。

sudo systemctl daemon-reload
sudo systemctl start metabase.service
sudo systemctl status metabase.service

在这里确认无误后,启用该服务在启动时自动运行。

sudo systemctl enable metabase.service

启动、停止或重启 Metabase

现在,无论何时您需要启动、停止或重启 Metabase,您只需执行以下操作:

sudo systemctl start metabase.service
sudo systemctl stop metabase.service
sudo systemctl restart metabase.service

阅读其他Metabase 版本的文档。

© . All rights reserved.