在 Debian 上以服务形式通过 nginx 运行 Metabase

对于那些在其基础设施中不(或不能)使用 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 conf

接下来,我们需要创建一个 syslog conf 以确保 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 配置文件

在编辑器中打开您的 /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 实例配置为在端口 3000localhost 上运行。您可能关心几个代理指令,因此您应该在 官方 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的文档。