تخطي للذهاب إلى المحتوى

كيف تُعدّ النسخ الاحتياطي التلقائي في أودو (Odoo 17 و18 و19)

Odoo Online وOdoo.sh وخادمك الخاص: ما الذي تنسخه احتياطياً، وكيف تؤتمته، وكيف تختبر الاستعادة
4 نوفمبر 2026 بواسطة
كيف تُعدّ النسخ الاحتياطي التلقائي في أودو (Odoo 17 و18 و19)
NavyBits Co.

شرحت نسخة سابقة من هذا المقال وحدة النسخ الاحتياطي التلقائي التي طوّرها Yenthe على Odoo 10 و11، بما في ذلك تثبيت paramiko على Windows. أما هذه النسخة فمخصّصة لـ Odoo 17 و18 و19، وتشرح ما يجب أن تحتويه النسخة الاحتياطية الصالحة، وما يتولّاه عنك Odoo Online وOdoo.sh، وكيف تؤتمت النسخ الاحتياطي على خادمك الخاص، وكيف تتحقق من أن النسخة تُستعاد فعلاً.

ما يجب أن تحتويه النسخة الاحتياطية لأودو

تتوزّع كل قاعدة بيانات أودو على مكانين. فـ PostgreSQL يحفظ السجلات من عملاء وفواتير وحركات مخزون وإعدادات ومستخدمين، أما المرفقات والملفات الأخرى، كفواتير المورّدين الممسوحة ضوئياً وصور المنتجات وملفات PDF للفواتير المرسلة، فتُحفظ افتراضياً في filestore، وهو مجلد على القرص يحمل اسم قاعدة البيانات.

تفريغ PostgreSQL وحده يعيد كل بند من بنود الفواتير، لكن المرفقات تضيع ويعرض أودو صوراً معطّلة ومستندات مفقودة. فالنسخة الاحتياطية الكاملة هي قاعدة البيانات مع الـ filestore الخاص بها، تؤخذان في الوقت نفسه تقريباً وتُحفظان على جهاز غير الخادم الذي تحميانه.

Odoo Online

على Odoo Online، تتولّى أودو النسخ الاحتياطي. وتصف اتفاقية مستوى الخدمة للاستضافة السحابية لديها نسخاً احتياطية كاملة يومية، يُحتفظ بـ 14 منها لثلاثة أشهر على الأقل (يومياً لأسبوع، وأسبوعياً لأربعة أسابيع، ثم شهرياً)، وتُنسخ على ثلاثة أجهزة على الأقل في مراكز بيانات مختلفة.

ويمكنك مع ذلك الاحتفاظ بنسخة خاصة بك، قبل تغيير كبير مثلاً. اذهب إلى odoo.com/my/databases، وسجّل الدخول بصفتك مدير قاعدة البيانات، واستخدم Download Backup على قاعدة بياناتك لتحصل على ملف ZIP. وإن كان هذا الخيار معطّلاً، فقاعدة البيانات أكبر من أن تُنزَّل من المدير، وعلى دعم أودو أن يرسلها إليك. ومن الشاشة نفسها يمكنك نسخ قاعدة بيانات للاختبار، وخيار For testing purposes مفعّل افتراضياً فيعطّل الرسائل الإلكترونية والمدفوعات والإجراءات الخارجية الأخرى على النسخة.

Odoo.sh

بحسب توثيق Odoo.sh، تُنسخ قاعدة بيانات الإنتاج احتياطياً كل يوم، ويحتفظ Odoo.sh بسبع نسخ يومية وأربع أسبوعية وثلاث شهرية. وتشمل كل نسخة تفريغ قاعدة البيانات والـ filestore والسجلات والجلسات.

يعرض تبويب Backups في فرع الإنتاج النسخ المحفوظة على خادم الإنتاج، وهي تغطّي نحو شهر (النسخ اليومية والأسبوعية). أما النسخ الشهرية فموجودة على خوادم نسخ احتياطي مخصّصة، وتطلبها من دعم أودو حين تحتاج إلى استعادة إحداها أو تنزيلها. ومن المفيد أن تعرف بعض التفاصيل قبل اليوم الذي تحتاجها فيه:

  • لا نسخ احتياطية تلقائية لفروع staging والتطوير. ويمكنك أخذ نسخة يدوية من فرع staging، أما فروع التطوير فلا يمكن نسخها احتياطياً إطلاقاً.
  • تُحفظ النسخ اليدوية من الإنتاج أو staging ثلاثة أيام، بحدّ أقصى خمس نسخ في اليوم.
  • يضيف Odoo.sh نسخة احتياطية تلقائية حين تدمج commit يغيّر إصدار وحدة في __manifest__.py أو الاعتماديات في requirements.txt. والدمج الآخر لا يطلق نسخة، لذلك خذ نسخة يدوية قبل أي تغيير يقلقك.
  • ومن التبويب نفسه يمكنك تنزيل نسخة أو استعادتها أو استيراد قاعدة بيانات. واستعادة نسخة الإنتاج في فرع staging هي الطريقة الآمنة للتمرّن على تحديث أو لاسترجاع سجلات حذفها أحدهم خطأً، وقواعد بيانات staging محيَّدة، فلن ترسل رسائل إلى عملائك.

أودو على خادمك الخاص (Community أو Enterprise)

على خادمك الخاص، النسخ الاحتياطي مسؤوليتك. ويطلب دليل النشر في أودو نسخاً احتياطية يومية لقواعد البيانات والـ filestore، تُنقل إلى خادم أرشفة بعيد لا يمكن الوصول إليه من خادم أودو نفسه. فإن أصاب الخادمَ برنامجُ فدية أو أمرٌ نُفّذ بلا انتباه، سقطت معه النسخ المحفوظة إلى جانبه.

مدير قواعد البيانات، للنسخ اليدوية من حين لآخر

في /web/database/manager، يطلب زر Backup كلمة المرور الرئيسية (admin_passwd في ملف إعدادات أودو) ويعرض صيغتين. صيغة zip تشمل الـ filestore وهي التي يجب أن تختارها، إذ تُستعاد من الشاشة نفسها ويستطيع Odoo.sh استيرادها. أما صيغة pg_dump custom format فتحتوي على قاعدة البيانات وحدها.

لا تترك المدير متاحاً على خادم مكشوف للإنترنت، فتوثيق أودو يصفه بأنه أداة للتطوير والعروض التجريبية لم تُصمَّم للإنتاج أو لقواعد البيانات الكبيرة. عطّله بـ list_db = False وحدّد لأودو قاعدة البيانات التي يخدمها بـ db_name أو dbfilter، أو احجب على الـ reverse proxy كل عنوان يبدأ بـ /web/database. وإن كان لا بد من إبقائه متاحاً، فاستبدل بكلمة المرور الرئيسية الافتراضية كلمة طويلة عشوائية.

[options]
list_db = False
dbfilter = ^mycompany$

سكربت cron ليلي مع pg_dump والـ filestore

يقع الـ filestore تحت data_dir الخاص بأودو، في filestore/<database>. وإن لم يحدّد ملف الإعدادات data_dir، فالقيمة الافتراضية ~/.local/share/Odoo في المجلد الرئيسي للمستخدم الذي يعمل أودو باسمه. ومع حزمة Debian/Ubuntu الرسمية يكون هذا المستخدم odoo ومجلده الرئيسي /var/lib/odoo، فيصبح المسار /var/lib/odoo/.local/share/Odoo/filestore/<database>.

يفترض السكربت أدناه أن PostgreSQL يعمل على الخادم نفسه وأن مستخدم النظام odoo يستطيع الاتصال بقاعدة البيانات، وهكذا تُعدّ الحزمة الأمور. غيّر DB إلى اسم قاعدة بياناتك.

#!/bin/bash
# /usr/local/bin/odoo-backup: nightly backup of one Odoo database and its filestore
set -euo pipefail
umask 027

DB="mycompany"
FILESTORE="/var/lib/odoo/.local/share/Odoo/filestore/$DB"
DEST="/var/backups/odoo"
KEEP_DAYS=14
STAMP="$(date +%F_%H%M)"

# 1. The database (custom format, compressed, restored with pg_restore)
pg_dump --format=custom --file="$DEST/${DB}_${STAMP}.dump" "$DB"

# 2. The filestore, right after
tar -czf "$DEST/${DB}_${STAMP}_filestore.tar.gz" -C "$FILESTORE" .

# 3. Remove local copies older than KEEP_DAYS
find "$DEST" -maxdepth 1 -type f -name "${DB}_*" -mtime +"$KEEP_DAYS" -delete

ثبّته، وأنشئ مجلد النسخ الاحتياطي، وشغّله مرة واحدة يدوياً:

sudo install -d -o odoo -g backup -m 2750 /var/backups/odoo
sudo install -o root -g root -m 755 odoo-backup /usr/local/bin/odoo-backup
sudo -u odoo /usr/local/bin/odoo-backup    # first run by hand, then check the files

ثم جدوِله في ساعة هادئة:

# /etc/cron.d/odoo-backup  (minute hour day month weekday user command)
30 2 * * * odoo /usr/local/bin/odoo-backup >> /var/log/odoo/backup.log 2>&1

تُفرَّغ قاعدة البيانات أولاً ثم يُنسخ الـ filestore مباشرة بعدها، فتكون نسخة الملفات حديثة على الأقل بقدر السجلات التي تشير إليها. ويُنتج pg_dump لقطة متّسقة فيما يواصل المستخدمون عملهم، ويجب أن يكون إصداره مساوياً للإصدار الرئيسي لخادم PostgreSQL لديك أو أحدث منه. ويشير توثيق pg_dump في PostgreSQL نفسه إلى أنه يناسب الحالات البسيطة، أما لقاعدة بيانات كبيرة أو شديدة الانشغال فانظر في الأرشفة المستمرة التي تتيح الاستعادة إلى نقطة زمنية محددة.

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

# crontab on the backup machine
15 4 * * * rsync -a backupuser@odoo-server:/var/backups/odoo/ /srv/backups/odoo/

وحدة OCA Database Auto-Backup

الوحدة التي شرحتها النسخة القديمة من هذا المقال موجودة الآن في مستودع server-tools لدى OCA باسم auto_backup، مع فروع لـ 17.0 و18.0 و19.0 (وتصنّفها OCA بمستوى Beta). وتضيف إجراءً مجدولاً يومياً وشاشة تحت Settings > Technical > Database Structure > Automated Backups (في وضع المطوّر)، تختار فيها مجلداً محلياً أو خادم SFTP بعيداً (بكلمة مرور أو مفتاح خاص، مع زر Test SFTP Connection)، وصيغة zip أو pg_dump، وعدد أيام النسخ التي تحتفظ بها. ويُبلَّغ متابعو إعداد النسخ الاحتياطي حين تفشل نسخة. وتحتاج الوحدة إلى حزم Python التالية على الخادم: paramiko وpysftp وcryptography.

ويذكر ملف README الخاص بها حدّين. فالنسخ الاحتياطي يتوقف حين يُضبط list_db = False، لذلك إن استخدمت الوحدة فاحمِ مدير قواعد البيانات على مستوى الـ proxy. وفي قواعد البيانات الأكبر قد تتوقف النسخة في منتصفها لأنها تعمل داخل أودو فتصطدم بحدود الخادم. ولأي شيء يتجاوز قاعدة بيانات صغيرة نفضّل سكربت cron أعلاه.

اختبر الاستعادة على نسخة لا تستطيع مراسلة أحد

لا تعرف إن كانت النسخة الاحتياطية تعمل إلا حين تستعيدها، وأسوأ وقت لتكتشف ذلك هو صباح اليوم الذي يتعطّل فيه الخادم. لذلك استعد نسخة بانتظام، مرة في الشهر مثلاً، وبعد أي تغيير في السكربت أو الخادم. استخدم جهازاً منفصلاً أو على الأقل اسماً مختلفاً لقاعدة البيانات، وسجّل الدخول، وافتح بعض السجلات التي تحمل مرفقات، وتحقّق من أن آخر الفواتير توافق وقت أخذ النسخة.

# On a test server, as the odoo user
createdb mycompany_test
pg_restore --no-owner --dbname=mycompany_test mycompany_2026-11-04_0230.dump
mkdir -p /var/lib/odoo/.local/share/Odoo/filestore/mycompany_test
tar -xzf mycompany_2026-11-04_0230_filestore.tar.gz \
    -C /var/lib/odoo/.local/share/Odoo/filestore/mycompany_test
odoo neutralize -c /etc/odoo/odoo.conf -d mycompany_test

عند التثبيت من المصدر يكون الأمر odoo-bin، أما الحزمة فتثبّته باسم odoo. نفّذ خطوة neutralize قبل أن تشغّل أودو على النسخة، وإلا شغّلت قاعدة البيانات المستعادة إجراءاتها المجدولة وأرسلت رسائل حقيقية إلى عملاء حقيقيين. التحييد يوقف الإجراءات المجدولة والرسائل الصادرة ومزامنة المصارف ومزوّدي الدفع وطرق التوصيل ورموز IAP، ويخفي الموقع عن محركات البحث، ويعرض شريطاً أحمر كي لا يخلط أحد بين النسخة وبيئة الإنتاج.

وحين تستعيد ملف zip من مدير قواعد البيانات، فعّل Neutralize واختر This database is a copy، فيعطي أودو النسخة معرّف UUID خاصاً بها ولا تختلط قاعدتا البيانات. والأمر odoo-bin db load -n يفعل الشيء نفسه لنسخ zip. أما طريقة pg_restore اليدوية أعلاه فتحتفظ بمعرّف UUID الخاص بالإنتاج، وهذا مقبول لاختبار سريع تحذف قاعدته بعده.

متى تطلب المساعدة

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

وإن أردت رأياً ثانياً أولاً، احجز مكالمة مجانية مدتها 30 دقيقة وأخبرنا كيف يُستضاف أودو لديك اليوم.

كيف تُعدّ النسخ الاحتياطي التلقائي في أودو (Odoo 17 و18 و19)
NavyBits Co. 4 نوفمبر 2026
شارك هذا المنشور
علامات التصنيف
راسلنا على واتسابوكيل ذكي يردّ على مدار الساعة
احجز مكالمة مجانية