本教程将指导您如何设置一个生产环境就绪的 Meilisearch 实例。以下说明使用运行 Debian 的 DigitalOcean 服务器,但也适用于任何运行 Linux 发行版的托管服务。

Meilisearch Cloud 是在生产环境中运行 Meilisearch 的推荐方式。

系统要求

  • 运行 Debian 12 的 DigitalOcean 服务器
  • 用于连接该机器的 SSH 密钥对

DigitalOcean 提供了详细的文档说明如何使用 SSH 连接服务器

第一步:安装 Meilisearch

通过 SSH 登录您的服务器,更新可用软件包列表,并安装 curl

apt update
apt install curl -y

在生产环境中使用最新版本的软件包是良好的安全实践。

接下来,使用 curl 下载并运行 Meilisearch 命令行安装程序:

# 通过脚本安装最新版 Meilisearch
curl -L https://install.meilisearch.com | sh

Meilisearch 安装程序是一组脚本,确保您将获得适合您系统的正确二进制文件。

接下来,您需要使二进制文件在系统的任何位置都可访问。将二进制文件移动到 /usr/local/bin

mv ./meilisearch /usr/local/bin/

现在 Meilisearch 已安装在您的系统中,但尚未公开可访问。

第二步:创建系统用户

以 root 身份运行应用程序会带来不必要的安全风险。为防止这种情况,为 Meilisearch 创建一个专用用户:

useradd -d /var/lib/meilisearch -s /bin/false -m -r meilisearch

然后为新用户授予 Meilisearch 二进制文件的所有权:

chown meilisearch:meilisearch /usr/local/bin/meilisearch

步骤 3:创建配置文件

在安装 Meilisearch 并完成数据安全保护的第一步后,您需要设置一个基础配置文件。

首先,创建 Meilisearch 用于存储数据的目录:

mkdir /var/lib/meilisearch/data /var/lib/meilisearch/dumps /var/lib/meilisearch/snapshots
chown -R meilisearch:meilisearch /var/lib/meilisearch
chmod 750 /var/lib/meilisearch

本教程中,您将在 Droplet 的本地磁盘上创建这些目录。如果使用额外的块存储设备,请在该设备上创建这些目录。

接下来,下载默认配置文件到 /etc 目录:

curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > /etc/meilisearch.toml

最后,更新 meilisearch.toml 文件中的以下行,使 Meilisearch 使用您之前创建的目录来存储数据,并将 MASTER_KEY 替换为一个 16 字节的字符串:

env = "production"
master_key = "MASTER_KEY"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"

请记住选择一个安全的 master key,并避免将其暴露在公开可访问的位置。

至此,您已完成 Meilisearch 实例的配置。

步骤 4:将 Meilisearch 作为服务运行

在 Linux 环境中,服务是一种可以在操作系统启动时启动并在后台持续运行的进程。如果程序因任何原因停止运行,Linux 会立即重启该服务,有助于减少停机时间。

4.1. 创建服务文件

服务文件是告诉操作系统如何运行程序的文本文件。

运行以下命令在 /etc/systemd/system 目录下创建服务文件:

cat << EOF > /etc/systemd/system/meilisearch.service
[Unit]
Description=Meilisearch
After=systemd-user-sessions.service

[Service]
Type=simple
WorkingDirectory=/var/lib/meilisearch
ExecStart=/usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml
User=meilisearch
Group=meilisearch
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

4.2. 启用并启动服务

服务文件准备就绪后,使用 systemctl 激活服务:

systemctl enable meilisearch
systemctl start meilisearch

systemctl enable 命令告诉操作系统在每次启动时自动运行该服务。systemctl start 则立即启动 Meilisearch 服务。

通过检查服务状态确认一切正常运行:

systemctl status meilisearch

您应该会看到确认服务正在运行的消息:

 meilisearch.service - Meilisearch
   Loaded: loaded (/etc/systemd/system/meilisearch.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2023-04-10 14:27:49 UTC; 1min 8s ago
 Main PID: 14960 (meilisearch)

步骤 5:安全加固并完成设置

此时,Meilisearch 已安装并运行。它还受到保护,可以避免意外崩溃和系统重启的影响。

下一步是使您的实例可以公开访问。

5.1. 使用 Nginx 创建反向代理

反向代理是一种处理外部世界与应用程序之间所有通信的应用程序。在本教程中,您将使用 Nginx 作为反向代理来接收外部 HTTP 请求并将其重定向到 Meilisearch。

首先,在您的机器上安装 Nginx:

apt-get install nginx -y

接着,删除默认的配置文件:

rm -f /etc/nginx/sites-enabled/default

Nginx 附带了一组默认设置(例如其默认的 HTTP 端口),这些设置可能会与 Meilisearch 产生冲突。

创建一个新的配置文件来指定反向代理设置:

cat << EOF > /etc/nginx/sites-enabled/meilisearch
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    location / {
        proxy_pass  http://localhost:7700;
    }
}
EOF

最后,启用 Nginx 服务:

systemctl daemon-reload
systemctl enable nginx
systemctl restart nginx

现在您的 Meilisearch 实例已可公开访问。

5.2. 启用 HTTPS

目前唯一剩下的问题是 Meilisearch 仅通过 HTTP 处理请求,没有任何额外的安全措施。这是一个严重的安全漏洞,可能导致攻击者访问您的数据。

本教程假设您已拥有一个注册域名,并且已正确配置其 DNS 的 A 记录 指向您的 DigitalOcean droplet 的 IP 地址。更多信息请参阅 DigitalOcean DNS 文档

使用 certbot 在您的服务器上配置启用 HTTPS。

首先,在系统上安装所需软件包:

sudo apt install certbot python3-certbot-nginx -y

接着运行 certbot:

certbot --nginx

输入您的电子邮件地址,同意服务条款,并选择您的域名。当询问是否要自动重定向 HTTP 流量时,选择选项 2: Redirect

Certbot 将完成 Nginx 的配置。完成后,所有到您服务器的流量都将使用 HTTPS,您已完成 Meilisearch 实例的安全加固。

您的安全证书需要每 90 天续订一次。Certbot 会自动安排续订。运行以下测试命令验证该流程是否已就位:

sudo certbot renew --dry-run

如果该命令没有返回错误,则表示您已成功在 Nginx 服务器上启用了 HTTPS。

总结

您已完成了提供安全稳定服务的主要步骤。得益于反向代理、HTTPS 和 Meilisearch 内置安全密钥的组合,您的 Meilisearch 实例现在已在一个安全且可公开访问的环境中运行。