📍 المقالة الرئيسية للمجموعة: Meilisearch 2026: الدليل الكامل.
خمس عشرة دقيقة للانتقال من VPS فارغ إلى Meilisearch إنتاج يمكن الوصول إليه عبر HTTPS، جاهز لفهرسة كتالوجك. هذا الدرس يفصل الإجراء الدقيق على Hetzner CX22 (4,51 يورو/شهر) عبر Coolify v4، PaaS مفتوح المصدر الذي يحول الاستضافة الذاتية إلى ضغطة فأر. الطريقة موثقة على تثبيتات في داكار والدار البيضاء ولاغوس وتونس.
المتطلبات
قبل البدء، تأكد من توفر VPS Hetzner CX22 أو OVH VPS-1 تحت Ubuntu 22.04 LTS أو Debian 12. يجب أن يكون Coolify v4 مثبتاً مسبقاً (راجع دليل Coolify إذا لم يكن كذلك). ستحتاج إلى اسم نطاق مع سجل DNS A يشير إلى الـ VPS (مثلاً search.votre-entreprise.com). المستوى المتوقع: متوسط. الوقت المقدر: 15 إلى 25 دقيقة.
الخطوة 1 — إنشاء DNS والانتشار
في لوحة تحكم DNS الخاصة بك (Cloudflare، OVH، Gandi، Namecheap)، أنشئ سجل A يشير من search.votre-entreprise.com إلى عنوان IP الخاص بـ VPS. ضع TTL على 300 ثانية لتسهيل أي تعديلات لاحقة. تحقق من الانتشار باستخدام الأمر التالي:
dig +short search.votre-entreprise.com
إذا كان Cloudflare في الواجهة، عطل الـ proxy (السحابة البرتقالية → رمادية) أثناء إصدار شهادة Let’s Encrypt. يمكنك إعادة تفعيلها بعد إصدار الشهادة بنجاح.
الخطوة 2 — إطلاق خدمة Meilisearch في Coolify
في واجهة Coolify الإدارية، اذهب إلى Resources → + New → Service. ابحث عن «Meilisearch» في الكتالوج. القالب الرسمي الذي تصونه فريق Coolify ينشر آخر إصدار مستقر (v1.10 وقت الكتابة) مع volume دائم مُكوَّن مسبقاً. أعطِ اسماً للخدمة: meilisearch-prod. اختر الخادم المستهدف (Hetzner CX22 الخاص بك) والمشروع (أنشئ «Production» إذا لم يكن موجوداً). انقر Continue.
الخطوة 3 — تكوين متغيرات البيئة
على شاشة التكوين، حدد متغيرات البيئة الأساسية للأمان والأداء. يجب توليد MEILI_MASTER_KEY بقوة عشوائية كافية لأنها تتحكم في كل شيء على المثيل. اكتبها فوراً في خزانة Vaultwarden (مجموعة «Infrastructure»). دونها، تفقد التحكم الإداري في المثيل بأكمله.
MEILI_ENV=production
MEILI_MASTER_KEY=قم-بتوليد-32-حرفاً-عشوائياً-على-الأقل
MEILI_DB_PATH=/data/data.ms
MEILI_DUMP_DIR=/data/dumps
MEILI_HTTP_PAYLOAD_SIZE_LIMIT=100MB
MEILI_LOG_LEVEL=INFO
MEILI_NO_ANALYTICS=true
لتوليد المفتاح، استخدم الأمر التالي على أي خادم Linux:
openssl rand -base64 48 | tr -d '/+=' | head -c 32
الخطوة 4 — النطاق و HTTPS
في تبويب Domains، أدخل https://search.votre-entreprise.com. Coolify يكوِّن reverse proxy الداخلي (Traefik 2.10) لإدارة شهادة Let’s Encrypt تلقائياً. فعِّل Force HTTPS لإعادة توجيه HTTP → HTTPS. المنفذ الداخلي هو 7700 افتراضياً، يقوم Coolify بتعيينه تلقائياً إلى 443 العام. لا حاجة لأي تكوين شبكة إضافي.
الخطوة 5 — النشر والتحقق
انقر Deploy. السجلات في الوقت الفعلي تظهر: pulling getmeili/meilisearch:v1.10، creating volume، requesting Let’s Encrypt certificate، service healthy. احسب 60 ثانية للنشر الأول. اختبار التشغيل:
curl https://search.votre-entreprise.com/health
# يعيد: {"status":"available"}
مع master key الخاص بك:
curl -H "Authorization: Bearer VOTRE_MASTER_KEY" \
https://search.votre-entreprise.com/version
# يعيد: {"pkgVersion":"1.10.0",...}
الخطوة 6 — إنشاء API key للقراءة فقط
master key يجب ألا يُستخدم أبداً في الواجهة الأمامية. أنشئ API key عاماً بنطاق search فقط. الاستجابة تحتوي على "key": "..." — هذا المفتاح هو الذي تضعه في كود Next.js أو Astro أو Vue الخاص بك. لا يستطيع سوى البحث للقراءة، أبداً تعديل الفهارس.
curl -X POST 'https://search.votre-entreprise.com/keys' \
-H 'Authorization: Bearer VOTRE_MASTER_KEY' \
-H 'Content-Type: application/json' \
--data '{
"description": "Frontend search-only key",
"actions": ["search"],
"indexes": ["*"],
"expiresAt": null,
"name": "frontend-public"
}'
الخطوة 7 — أول فهرس وأول وثيقة
الآن وقد أصبح Meilisearch فاعلاً ومؤمَّناً، لنُنشئ أول فهرس ونقوم بإدخال بعض الوثائق التجريبية المتعلقة بسوق إفريقي. سنستخدم منتجات صناعة تقليدية ملونة كبيانات اختبار:
curl -X POST 'https://search.votre-entreprise.com/indexes' \
-H 'Authorization: Bearer VOTRE_MASTER_KEY' \
-H 'Content-Type: application/json' \
--data '{ "uid": "products", "primaryKey": "id" }'
curl -X POST 'https://search.votre-entreprise.com/indexes/products/documents' \
-H 'Authorization: Bearer VOTRE_MASTER_KEY' \
-H 'Content-Type: application/json' \
--data '[
{"id":1,"title":"Pagne wax indigo Faso","price":12500,"category":"tissus"},
{"id":2,"title":"Bazin riche Mali","price":18000,"category":"tissus"},
{"id":3,"title":"Sac en cuir Touareg","price":35000,"category":"maroquinerie"}
]'
curl 'https://search.votre-entreprise.com/indexes/products/search' \
-H 'Authorization: Bearer VOTRE_API_KEY_SEARCH' \
-H 'Content-Type: application/json' \
--data '{ "q": "pagne" }'
الاستجابة تعيد الوثيقة 1 مع نقاط الصلة الخاصة بها. إذا كتبت «pagn» أو «pagnee»، يعيد Meilisearch الوثيقة 1 أيضاً بفضل التسامح الأصلي مع الأخطاء الإملائية. هذا السلوك يحدث دون أي تكوين إضافي.
الخطوة 8 — تكوين النسخ الاحتياطية
Cron يومي على VPS لإنشاء dump وإرساله إلى MinIO/B2. هذا الإجراء يحفظ كامل بيانات الفهارس بشكل قابل للاستعادة. اختبر الاستعادة شهرياً للتأكد من سلامة الإجراء.
0 3 * * * curl -X POST -H 'Authorization: Bearer MASTER_KEY' \
https://search.votre-entreprise.com/dumps && \
rclone copy /var/lib/coolify/services/meilisearch-prod/data/dumps \
b2-vaultwarden:meilisearch-backups/$(date +\%F)/
الأخطاء الشائعة
| الخطأ | السبب | الحل |
|---|---|---|
| 401 Unauthorized في كل مكان | رأس Authorization مشكَّل بشكل سيئ | تحقق من Bearer + المفتاح بدون مسافات طفيلية |
| 413 Payload Too Large | وثيقة > 100 ميغابايت | زيادة MEILI_HTTP_PAYLOAD_SIZE_LIMIT |
| Volume غير دائم | volume Coolify معين بشكل سيئ | تحقق في Storages أن /data معين |
| زمن استجابة > 200 مللي ثانية | RAM مشبعة | الانتقال إلى CCX13 (8 جيجابايت) |
| Master key مرئي في GitHub | دفع دون .env متجاهل |
إلغاء المفتاح، توليد جديد، دفع .gitignore |
| CORS يحظر الواجهة الأمامية | ترويسة Access-Control-Allow-Origin مفقودة |
تكوين Caddy/Traefik لإضافة CORS مناسبة |
التكيف مع السياق المغاربي وغرب إفريقيا
ثلاث تعديلات للشركات الإفريقية. زمن الاستجابة المقبول: ping 95 ميلي ثانية من Hetzner Falkenstein من داكار عبر كابل ACE جيد للبحث في التجارة الإلكترونية؛ للـ autocomplete على كل حرف، يتجنب الـ debounce على الواجهة الأمامية بـ 300 ميلي ثانية التشبع. الدفع لـ Hetzner: بطاقة Visa صادرة من CBAO أو BICIS أو Société Générale CI تعمل مباشرة. بطاقة Wave Business الافتراضية أيضاً. التخزين: 25 جيجابايت SSD مشمولة في CX22 تستوعب على نطاق واسع 5 ملايين وثيقة نموذجية (كتالوج المنتجات، المقالات).
دروس الإخوة في المجموعة
- دمج Meilisearch في Next.js — الخطوة المنطقية التالية في الواجهة الأمامية.
- المزامنة Postgres → Meilisearch عبر Drizzle ORM
الأسئلة المتكررة
Coolify أو docker-compose مباشرة؟ Coolify لـ 95% من الحالات (إدارة مركزية، HTTPS تلقائي، إعادة تشغيل، مراقبة). docker-compose مباشرة إذا كنت تفضل التحكم اليدوي وعندك أقل من 3 خدمات.
ما الحجم لـ 1 مليون وثيقة؟ Hetzner CCX13 (15 يورو/شهر، 8 جيجابايت RAM) يستوعب 1 إلى 2 مليون وثيقة بشكل مريح مع عمليات بحث < 50 ميلي ثانية.
كيفية المراقبة المستمرة للصحة؟ Uptime Kuma على نقطة النهاية /health كل 60 ثانية، تنبيه Telegram أو Discord إذا كانت الاستجابة مختلفة عن {"status":"available"}.
Master key مخترق — ماذا أفعل؟ أعد توليد MEILI_MASTER_KEY في Coolify، أعد النشر (يتم إبطال جميع الجلسات)، أعد إنشاء API keys المشتقة، حدّث الأسرار في الواجهة الأمامية.
للاستزادة
- 🔝 العودة للمرجع: الدليل الكامل Meilisearch 2026
- وثائق Meilisearch: meilisearch.com/docs