لماذا تستضيف Typesense ذاتيًا على خادم VPS
تحتسب خدمات البحث المُدارة (Algolia وغيرها) التكلفة لكل استعلام ولكل مستند مُفهرَس: وترتفع الفاتورة بسرعة بمجرد أن يكبر كتالوجك. يقدّم Typesense بحثًا فوريًا (زمن استجابة p95 دون 50 ميلي ثانية) مع التسامح مع الأخطاء المطبعية والترتيب حسب الصلة، وكل ذلك في ملف تنفيذي واحد دون JVM. وبنشره على خادمك الـVPS الخاص، تحدّد تكلفة شهرية قابلة للتوقّع، وتُبقي فهارس مستخدميك خارج سحابة طرف ثالث، ويمكنك وضع نسختك أقرب ما يكون إلى تطبيقك لتقليل زمن استجابة الشبكة.
ما الذي تكسبه بشكل ملموس
- تكلفة ثابتة بدلًا من فوترة لكل استعلام تنفجر مع حركة المرور
- زمن استجابة أدنى بوضع Typesense على الشبكة الخاصة نفسها لتطبيقك
- التسامح مع الأعطال والبحث أثناء الكتابة (typo-tolerance) دون ضبط معقّد
- بيانات الفهرس وسجلات البحث محفوظة على بنيتك التحتية
- بصمة ذاكرة مخفّضة: لا JVM، وعملية واحدة فقط للإشراف عليها
- واجهة REST بسيطة ومفاتيح API محدودة النطاق (search-only / admin) لتأمين الواجهة الأمامية
متطلبات واقعية
يُحمّل Typesense فهارسه في الذاكرة: احسب حجم ذاكرة RAM وفقًا لحجم مجموعتك. لكتالوج يصل إلى بضع مئات الآلاف من المستندات، يكفي خادم VPS بمعالجين افتراضيين (2 vCPU) و4 غيغابايت من ذاكرة RAM بسهولة. احتسب 8 غيغابايت عند تجاوز المليون مستند أو للحقول المتجهية (البحث الدلالي). خصّص قرص SSD لاستمرارية البيانات، مع تثبيت Docker وDocker Compose، بالإضافة إلى نطاق فرعي من نوع search.yourdomain.com يشير إلى عنوان IP الخاص بالخادم.
النشر خطوة بخطوة
تجهيز خادم VPS وDocker
حدّث النظام، وثبّت Docker وإضافة Compose، ثم أنشئ مجلدًا مخصّصًا: mkdir -p /opt/typesense/data. ستستضيف وحدة التخزين هذه الفهارس المحفوظة على قرص SSD.
تعريف الخدمة بمفتاح API قوي
في ملف docker-compose.yml، أعلن عن صورة typesense/typesense:0.25.2، واربط /opt/typesense/data:/data، واعرض المنفذ 8108 محليًا فقط (127.0.0.1:8108)، ومرّر --api-key عبر متغير مُولَّد بواسطة openssl rand -base64 32.
التشغيل والتحقق من السلامة
ابدأ بـ docker compose up -d ثم اختبر: يجب أن يعيد curl http://127.0.0.1:8108/health القيمة {"ok":true}. ثم أنشئ أول مجموعة عبر واجهة REST للتحقق من الفهرسة.
وضع وكيل عكسي + SSL
اضبط Nginx (أو Caddy) لعرض search.yourdomain.com نحو 127.0.0.1:8108. مع Caddy، تولّد كتلة بسيطة reverse_proxy 127.0.0.1:8108 شهادة Let's Encrypt تلقائيًا؛ ومع Nginx، استخدم certbot --nginx.
عزل مفاتيح API
لا تنشر أبدًا مفتاح الإدارة (admin) في جهة المتصفح. أنشئ مفتاحًا محدود النطاق search-only (actions: documents:search) ولا تعرض سواه في واجهتك الأمامية بلغة JavaScript.
أتمتة النسخ الاحتياطية
جدوِل تنفيذ docker exec لنقطة النهاية /operations/snapshot أو ملف tar لوحدة التخزين /opt/typesense/data يُدفع كل ليلة إلى تخزين كائني بعيد.
يكفي تفعيل عقدة واحدة في الوضع الدائم لمعظم المشاريع، لكن إن أصبح بحثك حرجًا، فأنشئ عنقود Raft من 3 عقد (--nodes) عبر 3 خوادم VPS لتحقيق التوافر العالي: يتولى Typesense النسخ المتماثل بنفسه ويحوّل القيادة (leader) تلقائيًا عند حدوث عطل، دون موازِن أحمال على مستوى التطبيق في جهة الكتابة.