在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 -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配置文件

在您的编辑器中打开您的/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服务

现在,我们需要将Metabase服务注册到systemd,以便在系统启动时启动。我们还将确保我们的日志文件被创建并由运行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版本的文档。

想要改进这些文档? 提出更改。