كثير من مديري Odoo يظنّون أن أخذ نسخة احتياطية يعني تصدير قاعدة البيانات فقط — ثم يكتشفون وقت الكارثة أن المرفقات والصور والملفات كلها مفقودة. السبب أن نسخ Odoo الاحتياطي الصحيح يتكوّن من جزأين لا جزء واحد: قاعدة PostgreSQL و مجلد filestore الذي يخزّن الملفات خارج القاعدة. في هذا الدليل نشرح نسخ Odoo الاحتياطي عمليًا بأوامر حقيقية جرّبناها على خادم مرام، ثم نضع خطة استعادة مُختبرة تضمن ألا تفقد بياناتك.

نسخ Odoo الاحتياطي = قاعدة PostgreSQL + مجلد filestore معًا
نسخة Odoo الكاملة جزآن: قاعدة PostgreSQL ومجلد filestore — نسيان أحدهما يكسر الاستعادة.

لماذا نسخ Odoo الاحتياطي جزآن لا جزء واحد؟

يخزّن Odoo بياناته في مكانين: قاعدة PostgreSQL تحوي الجداول والسجلات والإعدادات والمستخدمين، ومجلد filestore يحوي الملفات الثنائية (المرفقات، صور المنتجات، مستندات PDF، ملفات العملاء) المخزّنة على القرص خارج القاعدة لتخفيف حجمها. لذلك فإن نسخ Odoo الاحتياطي الذي يأخذ القاعدة فقط ينتج نسخة تبدو سليمة، لكن عند الاستعادة تظهر المرفقات مكسورة والصور مفقودة.

القاعدة الذهبية: أي نسخة Odoo لا تحوي الجزأين (PostgreSQL + filestore) هي نسخة ناقصة. والأخطر أنك قد لا تكتشف النقص إلا وقت الاستعادة الفعلية — بعد فوات الأوان.

الجزء الأول: قاعدة PostgreSQL

نأخذ القاعدة بأداة pg_dump بصيغة مضغوطة قابلة للاستعادة الانتقائية (custom format). استبدل yourdb باسم قاعدتك:

# نسخة قاعدة البيانات (صيغة custom مضغوطة)
sudo -u postgres pg_dump -Fc -d yourdb -f /backup/yourdb.dump

# تحقّق أن النسخة صالحة وتعرض جداولها
pg_restore -l /backup/yourdb.dump | grep -c 'TABLE DATA'

في اختبارنا الحقيقي على قاعدة Odoo 18، أنتج هذا الأمر ملفًا بحجم 12 ميجابايت، وأظهر فحص pg_restore -l وجود 616 جدول بيانات — أي أن النسخة كاملة وقابلة للاستعادة.

الجزء الثاني: مجلد filestore

مجلد filestore يعيش افتراضيًا في مسار بيانات Odoo، ويحمل اسم قاعدة البيانات نفسه. نأخذه بأرشيف tar:

# مسار الـ filestore الافتراضي (تثبيت الحزمة الرسمي)
/var/lib/odoo/.local/share/Odoo/filestore/yourdb

# أرشفة مجلد الـ filestore لقاعدتك
sudo tar czf /backup/filestore_yourdb.tar.gz 
  -C /var/lib/odoo/.local/share/Odoo/filestore yourdb
مكوّنا نسخ Odoo الاحتياطي بأحجام حقيقية مقاسة: قاعدة PostgreSQL وfilestore
من نسخة حقيقية أخذناها على خادم مرام: القاعدة 12MB، والـ filestore 8.3MB (1,288 ملفًا).

في اختبارنا احتوى الـ filestore على 1,288 ملفًا (13 ميجابايت خامًا)، ونتج عنه أرشيف مضغوط بحجم 8.3 ميجابايت. انتبه: اسم مجلد الـ filestore يطابق اسم القاعدة تمامًا — وهذا التطابق شرط أساسي عند الاستعادة.

طرق أخذ النسخة: واجهة Odoo مقابل سطر الأوامر

لديك مساران، لكلٍّ مكانه:

  • واجهة Odoo عبر /web/database/manager: تنتج ملف zip يحوي القاعدة والـ filestore معًا بضغطة زر — عملية للقواعد الصغيرة والمتوسطة. عيبها أنها تستهلك ذاكرة وتتعثّر مع القواعد الكبيرة جدًا.
  • سطر الأوامر (pg_dump + tar): الأنسب للقواعد الكبيرة وللأتمتة، ويمنحك تحكّمًا كاملًا ونسخًا انتقائية — وهو ما نوصي به للإنتاج الجادّ.

القاعدة العملية: استخدم الواجهة للنسخ اليدوية السريعة، وسطر الأوامر للأتمتة والقواعد الكبيرة. للمرجع الرسمي راجع توثيق Odoo للنسخ الاحتياطي وتوثيق pg_dump في PostgreSQL.

أتمتة نسخ Odoo الاحتياطي

النسخة اليدوية تُنسى؛ الأتمتة تحميك. سكربت بسيط يأخذ الجزأين معًا ويحفظهما بتاريخ اليوم:

#!/bin/bash
DB=yourdb
DATE=$(date +%F)
DEST=/backup/$DATE
mkdir -p $DEST
# 1) قاعدة البيانات
sudo -u postgres pg_dump -Fc -d $DB -f $DEST/$DB.dump
# 2) الـ filestore
tar czf $DEST/filestore_$DB.tar.gz 
  -C /var/lib/odoo/.local/share/Odoo/filestore $DB
# 3) احذف النسخ الأقدم من 14 يومًا
find /backup -maxdepth 1 -type d -mtime +14 -exec rm -rf {} ;

جدولها عبر cron لتعمل ليليًا، ثم — والأهم — انسخها خارج الخادم. نسخة على نفس الخادم تضيع مع الخادم. طبّق قاعدة 3-2-1 وارفع النسخ إلى تخزين خارجي مثل Wasabi S3. راجع استراتيجية النسخ الاحتياطي 3-2-1 ودليل تخزين الملفات والنسخ على Wasabi S3.

خطة الاستعادة (Restore) خطوة بخطوة

الاستعادة هي الاختبار الحقيقي لنسختك. الترتيب مهم، واسم القاعدة يجب أن يطابق مجلد الـ filestore:

خطة استعادة نسخ Odoo الاحتياطي بخمس خطوات
خمس خطوات للاستعادة الكاملة — والأهم اختبارها دوريًا.
# 1) أنشئ قاعدة فارغة بنفس الاسم الأصلي
sudo -u postgres createdb -O odoo yourdb
# 2) استعد قاعدة البيانات
sudo -u postgres pg_restore -d yourdb /backup/yourdb.dump
# 3) استعد الـ filestore إلى المسار نفسه
sudo tar xzf /backup/filestore_yourdb.tar.gz 
  -C /var/lib/odoo/.local/share/Odoo/filestore
# 4) اضبط الملكية للمستخدم odoo
sudo chown -R odoo:odoo /var/lib/odoo/.local/share/Odoo/filestore/yourdb
# 5) شغّل Odoo وتحقّق من المرفقات والبيانات
sudo systemctl start odoo

لماذا اسم القاعدة حاسم؟ لأن Odoo يربط كل قاعدة بمجلد filestore يحمل اسمها. لو استعدت القاعدة باسم مختلف، لن يجد Odoo مرفقاتها وتظهر مكسورة — حتى لو كان الـ filestore موجودًا. طابق الاسمين دائمًا.

أخطاء شائعة في نسخ Odoo الاحتياطي

  • نسيان الـ filestore: أشهر خطأ — نسخة قاعدة بلا مرفقات = استعادة نصفية.
  • عدم اختبار الاستعادة: نسخة لم تُختبَر ليست نسخة، بل أمل. اختبرها دوريًا على بيئة منفصلة.
  • اختلاف اسم القاعدة: استعادة باسم مختلف تكسر ربط الـ filestore بالمرفقات.
  • تجاهل توافق الإصدارات: استعادة قاعدة على إصدار Odoo أو PostgreSQL مختلف قد تفشل — وثّق الإصدارات مع كل نسخة.
  • حفظ النسخ محليًا فقط: بلا نسخة خارجية، تضيع بياناتك مع الخادم. طبّق 3-2-1.

من واقع مرام

من واقع مرام: جرّبنا نسخ Odoo الاحتياطي فعليًا على قاعدة Odoo 18 على خادم مرام: نتج عن pg_dump ملف قاعدة بـ 12 ميجابايت (616 جدولًا)، وعن أرشفة الـ filestore ملف بـ 8.3 ميجابايت (1,288 ملفًا) — الجزآن معًا هما النسخة الكاملة. القاعدة العملية: أتمِت الجزأين، انسخهما خارجيًا، واختبر الاستعادة دوريًا. على بنية سريعة وموثوقة تصبح هذه العملية روتينًا لا قلقًا. راجع أيضًا الدليل الكامل لخطة النسخ والتعافي من الكوارث ودراستنا قياس أداء Odoo وتحسين PostgreSQL.

الأسئلة الشائعة

ما مكوّنات نسخة Odoo الاحتياطية الكاملة؟

جزآن: قاعدة PostgreSQL (الجداول والبيانات والإعدادات) ومجلد filestore (المرفقات والصور والملفات). لا بد من أخذ الاثنين معًا، وإلا كانت الاستعادة ناقصة.

أين يقع مجلد filestore في Odoo؟

في تثبيت الحزمة الرسمي، المسار الافتراضي هو /var/lib/odoo/.local/share/Odoo/filestore/<اسم القاعدة>، ويحمل المجلد اسم قاعدة البيانات نفسه.

هل تكفي نسخة واجهة Odoo (zip)؟

نعم للقواعد الصغيرة والمتوسطة، لأنها تضم القاعدة والـ filestore معًا. لكنها قد تتعثّر مع القواعد الكبيرة جدًا؛ عندها استخدم pg_dump وtar عبر سطر الأوامر.

لماذا تظهر المرفقات مكسورة بعد الاستعادة؟

غالبًا لأنك استعدت القاعدة دون الـ filestore، أو استعدت القاعدة باسم مختلف عن اسم مجلد الـ filestore. طابق الاسمين واستعد الجزأين معًا.

كم مرة يجب أخذ النسخة واختبارها؟

خذ نسخة يومية آلية على الأقل للإنتاج، واحتفظ بنسخة خارجية (3-2-1)، واختبر الاستعادة على بيئة منفصلة دوريًا — فالنسخة غير المختبرة لا يُعتمد عليها.

الخلاصة

نسخ Odoo الاحتياطي الصحيح ليس تصدير قاعدة بيانات، بل حفظ جزأين معًا: PostgreSQL والـ filestore — ثم اختبار استعادتهما فعليًا. أتمِت العملية، انسخ خارجيًا بقاعدة 3-2-1، وطابق أسماء القواعد عند الاستعادة، وستنام مطمئنًا أن بيانات شركتك في أمان. والأساس لكل ذلك بنية موثوقة تجعل النسخ والاستعادة روتينًا سهلًا.

احمِ نسخك خارجيًا مع النسخ الخارجي من مرام