لماذا تستضيف MongoDB ذاتيًا على خادم VPS
يفرض MongoDB Atlas الفوترة لكل عنقود ولكل غيغابايت ولكل عملية، ويقيّد بعض الميزات خارج المستويات المميزة. بنشر MongoDB على خادم VPS الخاص بك، تنشئ replica set كاملاً لتحقيق التوافر العالي، وتفعّل المحلّل (profiler) والفهارس التي تريدها، وتحتفظ بمستنداتك على بنية تحتية تتحكم فيها. وهذا مناسب لتطبيق Node.js/Express، أو خلفية لتسجيل السجلّات، أو كتالوج منتجات بهيكل متغيّر، أو أي نظام يتطور فيه المخطط بسرعة. ومع WiredTiger كمحرّك تخزين وتحديد مناسب لحجم RAM لمجموعة العمل (working set)، يقدّم خادم VPS أداءً مماثلاً تمامًا لنسخة مُدارة، بجزء بسيط من التكلفة.
الفوائد الملموسة لـ MongoDB مُستضاف ذاتيًا
- replica set كامل (أساسي + ثانويات) عبر عدة خوادم VPS لتحقيق التوافر العالي.
- فهارس ومحلّل دون قيود: مركّبة، وجزئية، وTTL، وجغرافية مكانية، ونص كامل.
- تحكم في ذاكرة WiredTiger المؤقتة للحفاظ على مجموعة العمل في الذاكرة.
- لا فوترة لكل عملية ولا حسب حجم العنقود: اشتراك VPS يمكن التنبؤ به.
- نسخ احتياطية عبر
mongodumpأو لقطات وحدة التخزين، حسب حجم بياناتك. - سيادة على البيانات ووصول كامل إلى سجلّات الخادم ومقاييسه وتهيئته.
المتطلبات المادية والبرمجية
يستفيد MongoDB من ذاكرة RAM لذاكرته المؤقتة WiredTiger: اسعَ إلى أن تكون قادرًا على احتواء مجموعة العمل فيها (البيانات والفهارس التي يكثر الوصول إليها). لمشروع تطوير أو تطبيق صغير، يناسب معالجان افتراضيان (2 vCPU) و4 غيغابايت من RAM مع 40 غيغابايت من SSD. أما للإنتاج مع replica set، فخصّص 4 vCPU و8 غيغابايت من RAM لكل عقدة، ومن الأمثل ثلاثة خوادم VPS منفصلة (خادم أساسي، وثانويان، أو حَكَم (arbiter) للنِصاب). على الصعيد البرمجي: Ubuntu 22.04/24.04 LTS، وDocker وCompose v2، ووحدة تخزين دائمة لـ /data/db، ونظام ملفات XFS الذي يوصي به MongoDB لـ WiredTiger. ويفيد وجود نطاق (مثل: mongo.myapp.com) إذا كنت تكشف الوصول عبر TLS.
نشر MongoDB باستخدام Docker في بيئة الإنتاج
تهيئة خادم VPS
ثبّت Docker، وعطّل Transparent Huge Pages (توصية من MongoDB)، وأغلق المنفذ 27017 نحو الخارج باستخدام ufw deny 27017. إن MongoDB دون مصادقة ومكشوفًا على الإنترنت هدف فوري لبرمجيات الفدية.
تعريف ملف docker-compose.yml
أعلن عن خدمة mongo:7، وركّب وحدة تخزين على /data/db، ومرّر MONGO_INITDB_ROOT_USERNAME وMONGO_INITDB_ROOT_PASSWORD عبر .env. أضف الأمر --auth لفرض المصادقة منذ بدء التشغيل.
إنشاء مستخدمي التطبيق
بعد docker compose up -d، اتصل باستخدام docker compose exec mongo mongosh، ثم أنشئ مستخدمًا مخصصًا لقاعدة بياناتك بدور readWrite فقط. احتفظ بحساب root للإدارة فقط، لا للتطبيق أبدًا.
تفعيل replica set
لتحقيق التوافر العالي، شغّل كل عقدة بـ --replSet rs0، ثم هيّئ باستخدام rs.initiate() مع سرد الأعضاء. يوفّر replica set تجاوز الفشل التلقائي ويتيح القراءة من الثانويات (readPreference: secondary).
تأمين الوصول عن بُعد بـ TLS
إذا اتصل تطبيق خارجي، فعّل TLS بشهادة Let's Encrypt مركّبة داخل الحاوية (--tlsMode requireTLS)، واستخدم المفتاح الداخلي (--keyFile) لمصادقة أعضاء replica set فيما بينهم.
الفهرسة والنسخ الاحتياطي
أنشئ فهارسك باستخدام db.collection.createIndex() مع تحليل الاستعلامات عبر explain(). جدوِل mongodump يوميًا أو، للأحجام الكبيرة، لقطات متسقة لوحدة التخزين، وأرشفها خارج خادم VPS.
فعّل المحلّل في الوضع البطيء (db.setProfilingLevel(1, { slowms: 100 })) لالتقاط الاستعلامات التي تتجاوز 100 مللي ثانية، ثم قارن النتائج بـ explain('executionStats'): تأتي معظم مشكلات أداء MongoDB من فهرس مفقود يفرض COLLSCAN. أما للسلاسل الزمنية (السجلّات والمقاييس)، فاستفد من مجموعات time-series الأصلية في MongoDB 5+: فهي تضغط البيانات تلقائيًا وتقلّل البصمة على القرص بشكل مذهل.