راهاندازی Meilisearch روی سرور اختصاصی و VPS: موتور جستوجوی سریع و متنباز برای سایت و فروشگاه شما

کادر جستوجوی داخلی سایت یا فروشگاه، یکی از بخشهایی است که کاربر زودتر از همه با آن سر و کار دارد. اگر جستوجوی سایت کند باشد یا نتایج نامرتبط نشان دهد، کاربر معمولاً قبل از پیدا کردن چیزی که دنبالش بوده، صفحه را میبندد. Meilisearch یک موتور جستوجوی متنباز است که دقیقاً برای همین مشکل طراحی شده: نصب ساده، پاسخدهی در حد میلیثانیه و تحمل غلط تایپی از ابتدا. در این مقاله مراحل راهاندازی Meilisearch روی سرور اختصاصی یا VPS، تنظیم آن به صورت سرویس systemd، امنسازی با ریورس پروکسی Nginx و اتصال آن به سایت یا فروشگاه را قدمبهقدم بررسی میکنیم.
چرا Meilisearch؟
قبل از رفتن سراغ نصب، بد نیست بدانیم Meilisearch چه تفاوتی با گزینههای دیگر دارد. دو رقیب اصلی آن Elasticsearch (متنباز، اما سنگین و پیچیده برای تنظیم) و Algolia (SaaS، سریع، اما هزینهبر و بدون کنترل روی داده) هستند.
Meilisearch بین این دو قرار میگیرد: کاملاً متنباز و قابل میزبانی روی زیرساخت خودتان، اما با تجربه نصب و استفادهای در حد چند دقیقه.
| ویژگی | Meilisearch | Elasticsearch | Algolia |
|---|---|---|---|
| مدل | متنباز، خودمیزبان | متنباز، خودمیزبان | SaaS، ابری |
| زمان نصب اولیه | چند دقیقه | چند ساعت (تنظیم JVM، کلاستر) | نیازی به نصب ندارد |
| تحمل غلط تایپی | پیشفرض، بدون تنظیم اضافه | نیاز به پلاگین/تنظیم دستی | پیشفرض |
| مصرف منابع | پایین | بالا (حافظه JVM) | ندارد (سمت سرویسدهنده) |
| هزینه ماهانه | فقط هزینه سرور | فقط هزینه سرور | بر اساس تعداد جستوجو |
| کنترل روی داده | کامل، روی سرور خودتان | کامل، روی سرور خودتان | داده در زیرساخت Algolia |
برای یک فروشگاه یا سایت محتوایی با چند هزار تا چند میلیون رکورد، Meilisearch معمولاً منابع کمتری نسبت به Elasticsearch مصرف میکند و برخلاف Algolia، داده هیچوقت سرور شما را ترک نمیکند.
پیشنیازها
برای یک نصب پایدار این موارد لازم است:
- یک سرور اختصاصی یا VPS با لینوکس (Ubuntu 22.04/24.04 یا Debian در این آموزش)
- حداقل ۱ گیگابایت RAM برای دیتاستهای کوچک؛ برای فروشگاههای با چند صد هزار محصول، ۴ گیگابایت یا بیشتر منطقیتر است
- دیسک SSD، چون Meilisearch ایندکس را روی دیسک نگه میدارد و سرعت I/O مستقیم روی سرعت ایندکسگذاری اثر دارد
- یک دامنه یا سابدامنه (مثل
search.example.com) برای قرار دادن پشت Nginx و HTTPS - دسترسی root یا sudo روی سرور
نصب Meilisearch
روش نصب با اسکریپت رسمی
سادهترین روش دانلود باینری رسمی است:
curl -L https://install.meilisearch.com | sh
این دستور آخرین نسخه پایدار را دانلود کرده و فایل اجرایی meilisearch را در پوشه فعلی قرار میدهد. برای دسترسی سراسری آن را به /usr/local/bin منتقل میکنیم:
sudo mv meilisearch /usr/local/bin/
sudo chmod +x /usr/local/bin/meilisearch
تولید Master Key
Meilisearch بدون کلید اصلی (master key) در حالت عمومی بدون محافظت اجرا میشود؛ یعنی هر کسی که آدرس سرور را بداند میتواند دادهها را بخواند یا تغییر دهد. یک کلید تصادفی بسازید:
openssl rand -base64 32
خروجی این دستور را جایی امن یادداشت کنید؛ در مرحله بعد در فایل سرویس استفاده میشود.
راهاندازی به صورت سرویس systemd
اجرای Meilisearch مستقیم در ترمینال فقط برای تست مناسب است؛ برای محیط عملیاتی باید به صورت سرویس systemd اجرا شود تا با ریاستارت سرور هم بالا بیاید (همین الگوی سرویس systemd پشت Nginx را در دیپلوی اپلیکیشن Go روی سرور اختصاصی و VPS هم میبینید). یک پوشه داده و کاربر اختصاصی ایجاد میکنیم:
sudo useradd -r -s /bin/false meilisearch
sudo mkdir -p /var/lib/meilisearch/data
sudo chown -R meilisearch:meilisearch /var/lib/meilisearch
سپس فایل سرویس را میسازیم:
sudo nano /etc/systemd/system/meilisearch.service
[Unit]
Description=Meilisearch
After=network.target
[Service]
Type=simple
User=meilisearch
Group=meilisearch
Environment=MEILI_MASTER_KEY=کلید_تولید_شده_خودتان
Environment=MEILI_ENV=production
Environment=MEILI_DB_PATH=/var/lib/meilisearch/data
Environment=MEILI_HTTP_ADDR=127.0.0.1:7700
ExecStart=/usr/local/bin/meilisearch
Restart=on-failure
[Install]
WantedBy=multi-user.target
نکته مهم همین MEILI_HTTP_ADDR=127.0.0.1:7700 است: سرویس فقط روی لوپبک گوش میدهد و از بیرون سرور قابل دسترسی نیست؛ دسترسی عمومی را در مرحله بعد از طریق Nginx میدهیم. حالا سرویس را فعال میکنیم:
sudo systemctl daemon-reload
sudo systemctl enable --now meilisearch
sudo systemctl status meilisearch
اگر وضعیت active (running) نمایش داده شود، سرویس بالا آمده و با هر ریاستارت سرور هم خودکار اجرا میشود.
امنسازی با Nginx و HTTPS
قرار دادن Meilisearch پشت Nginx دو فایده دارد: گواهی HTTPS روی دامنه خودتان، و امکان محدودسازی دسترسی (مثلاً فقط به مسیرهای جستوجو، نه به مسیرهای مدیریتی). یک فایل کانفیگ جدید میسازیم:
sudo nano /etc/nginx/sites-available/search.example.com
server {
listen 80;
server_name search.example.com;
location / {
proxy_pass http://127.0.0.1:7700;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
فایل را فعال و Nginx را ریلود میکنیم:
sudo ln -s /etc/nginx/sites-available/search.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
برای گواهی رایگان HTTPS از Certbot استفاده میکنیم (جزئیات بیشتر در نصب گواهی SSL رایگان با Let's Encrypt و Certbot):
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d search.example.com
Certbot خودش کانفیگ Nginx را برای HTTPS و تمدید خودکار گواهی اصلاح میکند. از این به بعد، هر درخواست به https://search.example.com از طریق Nginx به سرویس داخلی Meilisearch روی 127.0.0.1:7700 میرسد.
پیادهسازی جستوجو برای سایت یا فروشگاه

با سرویس بالا و در دسترس، حالا باید داده وارد آن کنیم. فرض کنیم یک فروشگاه با محصولات زیر داریم. ابتدا یک ایندکس میسازیم و کلید API مخصوص جستوجو (نه master key) تولید میکنیم:
curl -X POST 'https://search.example.com/indexes' \
-H "Authorization: Bearer کلید_master" \
-H 'Content-Type: application/json' \
--data '{ "uid": "products", "primaryKey": "id" }'
وارد کردن داده:
curl -X POST 'https://search.example.com/indexes/products/documents' \
-H "Authorization: Bearer کلید_master" \
-H 'Content-Type: application/json' \
--data '[
{ "id": 1, "name": "کفش ورزشی مردانه", "category": "پوشاک", "price": 1250000 },
{ "id": 2, "name": "کتاب آموزش پایتون", "category": "کتاب", "price": 320000 }
]'
و جستوجو:
curl -X POST 'https://search.example.com/indexes/products/search' \
-H "Authorization: Bearer کلید_جستوجو" \
-H 'Content-Type: application/json' \
--data '{ "q": "کفش ورزشی" }'
همین ساختار پایه، بدون هیچ تنظیم اضافهای، غلط تایپی را تحمل میکند و نتایج را بر اساس میزان ارتباط مرتب میکند. در گام بعدی میتوانید filterableAttributes و sortableAttributes را برای فیلتر دستهبندی و مرتبسازی بر اساس قیمت تنظیم کنید؛ این بخش در مستندات رسمی Meilisearch با جزئیات بیشتری پوشش داده شده است.
نکات امنیتی و نگهداری
چند نکته که در محیط عملیاتی اهمیت دارد:
- کلیدهای جداگانه برای خواندن و نوشتن: از طریق
/keysیک کلید با دسترسی فقطsearchبسازید و همان را در فرانتاند استفاده کنید؛ master key فقط باید سمت سرور بماند. - پشتیبانگیری منظم: Meilisearch دستور
POST /snapshotsبرای گرفتن اسنپشات دارد؛ این فایلها را روی یک دیسک یا سرور دیگر نگه دارید. - فایروال: پورت ۷۷۰۰ باید فقط از
127.0.0.1قابل دسترسی باشد؛ اگر سرویس از جای دیگری هم نیاز به دسترسی مستقیم دارد، آن را از طریق فایروال سرور (ufw یا nftables) محدود کنید، نه با باز گذاشتن پورت. - بهروزرسانی نسخه: Meilisearch نسخههای جدید را مرتب منتشر میکند؛ قبل از ارتقا در محیط عملیاتی، یک اسنپشات بگیرید.
انتخاب زیرساخت مناسب
عملکرد Meilisearch مستقیماً به منابع سرور بستگی دارد: ایندکسگذاری اولیه حافظه و CPU مصرف میکند، و سرعت پاسخدهی جستوجو به سرعت دیسک. اگر هنوز مطمئن نیستید کدام نوع مجازیسازی VPS مناسب شماست، تفاوت VPS KVM و OpenVZ را هم ببینید. برای فروشگاههای کوچک تا متوسط، یک VPS ابری آریانت با دیسک SSD و امکان ارتقای سریع منابع، نقطه شروع مناسبی است. اگر حجم داده یا ترافیک جستوجو بالاست و به منابع اختصاصی بدون اشتراکگذاری با ماشینهای مجازی دیگر نیاز دارید، سرور اختصاصی آریانت گزینهای با کنترل کامل روی سختافزار است.
جمعبندی
راهاندازی Meilisearch روی سرور اختصاصی یا VPS، از دانلود باینری تا جستوجوی اولین کوئری، کمتر از یک ساعت زمان میبرد. نکتههای اصلی که نباید فراموش شوند: اجرا به صورت سرویس systemd برای پایداری، بستن دسترسی مستقیم به پورت ۷۷۰۰، قرار دادن سرویس پشت Nginx با HTTPS، و جداسازی کلید جستوجو از master key. با همین چند قدم، سایت یا فروشگاه شما به جستوجویی سریع و تحملپذیر نسبت به غلط تایپی مجهز میشود، بدون وابستگی به یک سرویس شخص ثالث.




