在生產環境中執行自行託管的 Meilisearch 專案
本教學將引導您設定可於生產環境中使用的 Meilisearch 執行個體。這些說明使用執行 Debian 的 DigitalOcean 虛擬伺服器,但應與執行 Linux 發行版的任何託管服務相容。
注意
Meilisearch Cloud 是在生產環境中執行 Meilisearch 的建議方式。
需求
- 執行 Debian 12 的 DigitalOcean 虛擬伺服器
- 用於連線至該機器的 SSH 金鑰配對
提示
DigitalOcean 有關於 如何使用 SSH 連線至虛擬伺服器 的詳細文件。
步驟 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
在本教學中,您是在虛擬伺服器的本機磁碟中建立目錄。如果您正在使用其他區塊儲存空間,請在那裡建立這些目錄。
接下來,將預設設定下載到 /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"
請記住選擇一個安全的主金鑰,並避免將其暴露在公開可存取的位置。
您現在已設定 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 實例現在在安全且可公開存取的環境中啟動並執行。