在生产环境中运行自托管的 Meilisearch 项目

    本教程将指导您设置一个可用于生产环境的 Meilisearch 实例。这些说明使用运行 Debian 的 DigitalOcean Droplet,但应与任何运行 Linux 发行版的托管服务兼容。

    注意

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

    要求

    提示

    DigitalOcean 提供了关于如何使用 SSH 连接到 Droplet的详细文档。

    步骤 1:安装 Meilisearch

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

    apt update
    apt install curl -y
    

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

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

    # Install Meilisearch latest version from the script
    curl -L https://install.meilisearch.com | sh
    

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

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

    mv ./meilisearch /usr/local/bin/
    

    Meilisearch 现在已安装在您的系统中,但它不是公开可访问的。

    步骤 2:创建系统用户

    以 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 已安装并正在运行。它还受到保护,可防止最终崩溃和系统重启。

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

    提示

    如果所有发送到 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  https://127.0.0.1:7700;
        }
    }
    EOF
    

    最后,启用 Nginx 服务

    systemctl daemon-reload
    systemctl enable nginx
    systemctl restart nginx
    

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

    5.2. 启用 HTTPS

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

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

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

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

    sudo apt install certbot python3-certbot-nginx -y
    

    接下来,运行 certbot

    certbot --nginx
    

    输入您的电子邮件地址,同意条款和条件,然后选择您的域名。当提示您是否要自动重定向 HTTP 流量时,请选择选项 2:重定向

    Certbot 将完成配置 Nginx。完成后,所有到您服务器的流量都将使用 HTTPS,并且您将完成保护您的 Meilisearch 实例。

    您的安全证书必须每 90 天续订一次。Certbot 会自动安排续订。运行测试以验证此过程是否到位

    sudo certbot renew --dry-run
    

    如果此命令没有返回任何错误,则说明您已成功在 Nginx 服务器中启用了 HTTPS。

    结论

    您已按照主要步骤提供安全稳定的服务。现在,借助反向代理、HTTPS 和 Meilisearch 的内置安全密钥的组合,您的 Meilisearch 实例已在一个安全且可公开访问的环境中启动并运行。