在生产环境中运行自托管的 Meilisearch 项目
本教程将指导你完成生产就绪的 Meilisearch 实例的设置。这些说明使用运行 Debian 的 DigitalOcean Droplet,但应与运行 Linux 发行版的任何托管服务兼容。
注意
Meilisearch Cloud 是在生产环境中运行 Meilisearch 的推荐方式。
要求
- 运行 Debian 12 的 DigitalOcean Droplet
- 用于连接到该机器的 SSH 密钥对
提示
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 密钥,并避免在公开可访问的位置暴露它。
你现在已经配置了你的 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 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:重定向
。
Certbot 将完成 Nginx 的配置。完成后,所有到您服务器的流量都将使用 HTTPS,并且您已完成保护您的 Meilisearch 实例。
您的安全证书必须每 90 天续订一次。Certbot 会自动安排续订。运行测试以验证此过程是否到位
sudo certbot renew --dry-run
如果此命令未返回任何错误,则您已在 Nginx 服务器中成功启用 HTTPS。
结论
您已遵循提供安全稳定服务的主要步骤。由于反向代理、HTTPS 和 Meilisearch 内置安全密钥的结合使用,您的 Meilisearch 实例现在在一个安全且公开可访问的环境中启动并运行。