تصفية قواعد بيانات متعددة بناءً على النطاق

14 مارس 2025 بواسطة
تصفية قواعد بيانات متعددة بناءً على النطاق
Administrator
لا توجد تعليقات بعد

تطابق النطاق الفرعي الأول في أودو باستخدام dbfilter

مقدمة:

في أودو، يمكن تشغيل عدة قواعد بيانات على نفس الخادم لخدمة عملاء أو فروع مختلفة باستخدام نظام التعددية المستأجرة (Multi-Tenancy). من الطرق الشائعة لاختيار قاعدة البيانات المناسبة هي استخدام النطاق الفرعي (Subdomain)، حيث يتم تحديد قاعدة البيانات تلقائيًا بناءً على النطاق الفرعي. في هذه المقالة، سنشرح كيفية تكوين dbfilter لاختيار قاعدة البيانات المناسبة باستخدام النطاق الفرعي، مع تقديم أمثلة عملية لتوضيح العملية.

.

كيف يعمل %d في dbfilter؟

في أودو، المتغير %d يمثل الجزء الأول من النطاق الفرعي. على سبيل المثال:

  • إذا كان النطاق الذي يتم الوصول إليه هو customer1.yourcompany.com، فإن %d = customer1
  • إذا كان النطاق هو sales.team.yourcompany.com، فإن %d = sales

عند استخدام dbfilter = ^%d$، سيحاول أودو البحث عن قاعدة بيانات تحمل نفس اسم الجزء الأول من النطاق الفرعي.

تكوين dbfilter في ملف odoo.conf

على النحو التالي:

[options]
dbfilter = ^%d$
no-database-list = True

🔹 يضمن هذا الإعداد أن أودو سيحاول فقط الوصول إلى قاعدة بيانات تطابق الجزء الأول من النطاق الفرعي. 🔹 يعمل
 no-database-list = True 
على إخفاء قائمة قواعد البيانات المتاحة، مما يعزز الأمان إذا لم يتم العثور على تطابق.

خطوات التنفيذ العملي

1. إنشاء قواعد البيانات

يجب أن تكون أسماء قواعد البيانات متطابقة مع النطاقات الفرعية المستخدمة.

مثال:

  • قاعدة بيانات باسم customer1
  • قاعدة بيانات باسم customer2
  • قاعدة بيانات باسم sales

2. ضبط إعدادات الـ DNS

يجب ضبط DNS بحيث توجه النطاقات الفرعية إلى خادم أودو.

مثال:

  • customer1.yourcompany.com → يوجه إلى عنوان الـ IP الخاص بخادم أودو
  • customer2.yourcompany.com → نفس عنوان الـ IP

3. إعادة تشغيل أودو

 بعد تعديل ملف odoo.conf، يجب إعادة تشغيل أودو لتطبيق التغييرات: 

sudo service odoo restart


أمثلة عملية

مثال 1: طلب قاعدة بيانات موجودة

  • النطاق الذي تم الوصول إليه: customer1.yourcompany.com
  • قواعد البيانات الموجودة: customer1, customer2, sales
  • النتيجة: سيتم توجيه المستخدم تلقائيًا إلى قاعدة البيانات customer1.

مثال 2: طلب لنطاق فرعي غير موجود

  • النطاق الذي تم الوصول إليه: unknown.yourcompany.com
  • قواعد البيانات الموجودة: customer1, customer2
  • النتيجة:
    • إذا كان --no-database-list معطلًا، فسيتم عرض شاشة اختيار قاعدة البيانات (ثغرة أمنية!).
    • إذا كان --no-database-list مفعّلًا، فستظهر رسالة خطأ "Database not found".

مثال 3: التعامل مع النطاق الذي يبدأ بـ www

  • النطاق الذي تم الوصول إليه: www.yourcompany.com
  • قواعد البيانات الموجودة: yourcompany, customer1
  • النتيجة: سيحاول أودو استخدام قاعدة بيانات باسم www، والتي قد لا تكون موجودة.
  • الحل:
    • تجنب استخدام www كنطاق فرعي.
    •      أو استخدم تعبيرًا منتظمًا Regex لتجاهلwww :

 dbfilter = ^(www\.)?%d$

تكوينات متقدمة

1. دمج النطاق الفرعي مع اسم ثابت

   إذا كنت تريد أن تبدأ جميع قواعد البيانات بـ client_، يمكنك تكوين dbfilter على النحو التالى   :


[options]
dbfilter = ^client_%d$

مثال:

  • customer1.yourcompany.com → قاعدة البيانات ستكون: client_customer1

2. التعامل مع النطاقات متعددة الأجزاء

إذا كان لديك نطاق مثل eu.customer1.yourcompany.com وتريد استخدام قاعدة بيانات باسم customer1_eu، فإن dbfilter = ^%d_%h$ لن يعمل بشكل مباشر.

🔹 أفضل حل هو إنشاء وحدة مخصصة لربط النطاقات الفرعية بقواعد البيانات ديناميكيًا.

نصائح أمنية مهمة

  1. 🔹 استخدم دائمًا --no-database-list

لمنع عرض قائمة قواعد البيانات عند فشل المطابقة:


[options]
dbfilter = ^%d$
no-database-list = True

  1. 🔹 تأكد من أن أسماء قواعد البيانات فريدة

تجنب استخدام أسماء غامضة قد تؤدي إلى تعارض البيانات.

  1. 🔹 اختبر الإعدادات قبل النشر

استخدم نطاقات اختبار مثل test.yourcompany.com قبل تطبيق الإعدادات على النطاقات الفعلية.

الخاتمة

يعد استخدام dbfilter في أودو طريقة فعالة لربط قواعد البيانات بالنطاقات الفرعية، مما يسهل إدارة العملاء أو الفروع المختلفة. باتباع الخطوات المذكورة أعلاه، يمكنك تحسين الأمان وتوفير تجربة مستخدم مخصصة بناءً على النطاق الذي يتم الوصول إليه.

💡 إذا كنت بحاجة إلى تخصيص إضافي، يمكنك دائمًا تطوير وحدة مخصصة لتوسيع وظيفة dbfilter وفقًا لاحتياجات مشروعك.


تسجيل الدخول حتى تترك تعليقاً