أوامر Bench في ERPNext: كل أمر موضح من مهندس DevOps
bench هو أداة سطر الأوامر التي تتحكم في كل شيء داخل تثبيت ERPNext. فكر فيه مثل git: كما أن في git الأوامر commit وpush وpull وmerge، ففي bench الأوامر update وmigrate وrestore وdeploy. التوثيق الرسمي يسرد الأوامر فقط؛ أما هذا الدليل فيشرح ما يفعله كل أمر فعلاً، ومتى تستخدمه، وما الذي قد ينكسر — لتفهم الأداة بدل نسخ أوامر لا تفهمها.
قبل كل شيء: كيف يعمل bench (اقرأ هذا مرة واحدة)
Bench أداة Python. حين تشغّل 'bench update' لا يحدث سحر: يشغّل git pull في كل مجلد تطبيق، ويتحقق إن تغيرت متطلبات Python، ويشغّل سكربتات ترحيل قاعدة البيانات، ويعيد بناء أصول JavaScript. فهم ذلك يعني أنك، عند فشل شيء، تعرف أي خطوة فشلت ولماذا. وكل أوامر bench يجب تشغيلها من داخل مجلد frappe-bench (~/frappe-bench) كمستخدم frappe. أما تشغيلها كـ root أو من المجلد الخاطئ فسيفشل أو يسبب مشاكل صلاحيات.
# دائماً ابدأ هنا قبل تشغيل أوامر bench
cd ~/frappe-bench
# تحقق أنك في المكان الصحيح
pwd
# المتوقع: /home/frappe/frappe-bench
# تحقق أنك مستخدم frappe
whoami
# المتوقع: frappe
أوامر إدارة المواقع
'الموقع' في ERPNext هو قاعدة بيانات وإعداد معزولان — شركة واحدة. وهذه الأوامر تدير دورة حياة المواقع.
# إنشاء موقع جديد
# ماذا يفعل: ينشئ قاعدة بيانات MariaDB جديدة، ويشغل كل الترحيلات، وينشئ مستخدم أدمين
# متى تستخدمه: عند إعداد شركة/مستأجر جديد على الخادم نفسه
bench new-site mycompany.com \
--mariadb-root-password DB_ROOT_PASS \
--admin-password ADMIN_PASS \
--no-mariadb-socket
# سرد كل المواقع على هذا الـ bench
bench --site all list-apps
# تعيين موقع افتراضي (يوفر كتابة --site في كل أمر)
bench use mycompany.com
# تمكين وضع الصيانة (يحجب وصول المستخدمين)
# متى تستخدمه: قبل التحديثات أو الترحيلات لمنع تغيير البيانات
bench --site mycompany.com set-maintenance-mode on
bench --site mycompany.com set-maintenance-mode off
# مسح البيانات المخزنة مؤقتاً
# متى تستخدمه: بعد تغييرات الإعداد غير المنعكسة، أو بعد التحديثات
bench --site mycompany.com clear-cache
bench --site mycompany.com clear-website-cache
# خطر: حذف موقع نهائياً (لا استرداد ممكن)
# ماذا يفعل: يحذف قاعدة البيانات بالكامل ويزيل كل الملفات
bench drop-site mycompany.com --root-password DB_ROOT_PASS
bench drop-site يحذف قاعدة البيانات بالكامل. لا سلة مهملات ولا تراجع. وإذا شغّلته دون نسخة احتياطية، اختفت بياناتك نهائياً. خذ دائماً نسخة احتياطية وتحقق منها قبل تشغيل drop-site.
أوامر إدارة التطبيقات
ERPNext مبني من 'تطبيقات': Frappe (إطار العمل)، وERPNext (التطبيق الرئيسي)، وHRMS (وحدة الموارد البشرية)، وتطبيقاتك المخصصة. وهذه الأوامر تدير التطبيقات المثبتة على الـ bench.
# تنزيل تطبيق من GitHub على هذا الـ bench
# ماذا يفعل: git clone للمستودع في apps/
bench get-app erpnext --branch version-15
bench get-app hrms --branch version-15
# تنزيل تطبيق مخصص من مستودع خاص
bench get-app https://github.com/yourcompany/custom-app.git
# تثبيت تطبيق على موقع محدد (يضيف جداوله لقاعدة البيانات)
# ماذا يفعل: يشغل كل سكربتات الترحيل لهذا التطبيق على هذا الموقع
bench --site mycompany.com install-app erpnext
bench --site mycompany.com install-app hrms
# سرد كل التطبيقات المثبتة على موقع
bench --site mycompany.com list-apps
# إلغاء تثبيت تطبيق من موقع (يحذف بياناته — لا رجعة)
bench --site mycompany.com uninstall-app hrms --yes
# إزالة تطبيق من bench بالكامل (يزيل مجلد الكود)
bench remove-app hrms
get-app ينزّل الكود على الخادم. install-app يفعّله على موقع محدد وينشئ جداول قاعدة البيانات. uninstall-app يلغيه من موقع ويمسح بياناته منه. remove-app يزيل الكود تماماً من الخادم. وقد يكون التطبيق منزّلاً (بعد get-app) دون أن يكون مثبتاً على أي موقع.
أوامر النسخ الاحتياطي والاستعادة — أهم ما ستستخدمه
هذه أهم الأوامر. فإذا احتجت يوماً إلى استعادة بياناتك، فهي ما ستستخدمه. تمرّن على الاستعادة قبل أن تحتاجها وقت الأزمة.
# نسخة احتياطية كاملة (قاعدة البيانات + كل الملفات المرفوعة)
# ماذا يفعل: mysqldump لقاعدة البيانات + tar لمجلد الملفات
# ملفات النسخ مخزنة في: sites/mycompany.com/private/backups/
bench --site mycompany.com backup --with-files
# نسخة احتياطية لقاعدة البيانات فقط (أسرع، بدون مرفقات الملفات)
bench --site mycompany.com backup
# سرد النسخ الاحتياطية الموجودة
ls -lh sites/mycompany.com/private/backups/
# استعادة من نسخة احتياطية
# ماذا يفعل: يسقط ويعيد إنشاء قاعدة البيانات، ثم يستورد النسخة
bench --site mycompany.com restore \
sites/mycompany.com/private/backups/20260405_020000-mycompany_com-database.sql.gz
# استعادة مع الملفات
bench --site mycompany.com restore \
sites/mycompany.com/private/backups/20260405_020000-mycompany_com-database.sql.gz \
--with-private-files \
sites/mycompany.com/private/backups/20260405_020000-mycompany_com-private-files.tar.gz \
--with-public-files \
sites/mycompany.com/private/backups/20260405_020000-mycompany_com-public-files.tar.gz
من مستخدم frappe، ضع هذا في الـ crontab (crontab -e): 30 2 * * * cd /home/frappe/frappe-bench && bench --site mycompany.com backup --with-files >> /home/frappe/backup.log 2>&1
أوامر قاعدة البيانات والترحيل
# تشغيل ترحيلات قاعدة البيانات المعلقة
# ماذا يفعل: يطبق أي ملفات patch جديدة لم تعمل بعد
# متى تستخدمه: بعد التحديثات، وبعد تثبيت تطبيقات جديدة
bench --site mycompany.com migrate
# فتح وحدة تحكم MariaDB للـ SQL المباشر
bench --site mycompany.com mariadb
# فتح وحدة تحكم Python مع سياق Frappe
# ماذا يفعل: Python REPL مع frappe.db وfrappe.get_doc وما إلى ذلك
bench --site mycompany.com console
# التحقق من الموقع بحثاً عن أخطاء وتناقضات
bench --site mycompany.com doctor
# إعادة بناء فهرس البحث
# متى تستخدمه: بعد ترحيل البيانات أو حين تكون نتائج البحث ناقصة
bench --site mycompany.com rebuild-global-search
عند تشغيل 'bench mariadb' تحصل على وصول SQL مباشر. وأمر UPDATE أو DELETE خاطئ يتجاوز كل تحققات ERPNext ويمكنه إتلاف بيانات محاسبتك بشكل دائم. اختبر SQL دائماً على نسخة من قاعدة البيانات، لا على الإنتاج مباشرة. وابدأ دائماً بـ SELECT قبل UPDATE أو DELETE.
لا تريد حفظ الأوامر ولا إدارة الخوادم؟ ادفع كودك عبر Git ويتولى مانجلي نشره على قاعدة بياناتك المعزولة ونطاقك الخاص، دون SSH ودون سهر على الخوادم — جرّب مجاناً.
ابدأ مجاناًأوامر التحديث والبناء
# تحديث كامل: سحب الكود + تشغيل الترحيلات + إعادة بناء الأصول
bench update
# سحب الكود فقط (بدون ترحيل، بدون إعادة بناء الأصول)
bench update --pull
# تطبيق الترحيلات فقط (بدون سحب كود)
bench update --patch
# إعادة بناء أصول JavaScript/CSS
bench build
# بناء للإنتاج (مصغر، أبطأ في البناء لكن أسرع في التقديم)
bench build --production
# تحويل كل التطبيقات لفرع مختلف
bench switch-to-branch version-15 frappe erpnext hrms
# التحقق من الإصدارات الحالية لكل التطبيقات المثبتة
bench version
أوامر الإنتاج وإدارة الخدمات
# إعداد الإنتاج الأولي (شغل كـ root/sudo بعد التثبيت)
# ماذا يفعل: ينشئ إعداد Supervisor وNginx ويضبط خدمات systemd
sudo bench setup production frappe
# إعادة توليد إعداد Nginx (شغل كـ root بعد إضافة مواقع جديدة)
sudo bench setup nginx
sudo nginx -t # اختبر الإعداد قبل إعادة التحميل
sudo systemctl reload nginx
# إعادة توليد إعداد Supervisor
sudo bench setup supervisor
sudo supervisorctl reload
# إعادة تشغيل كل خدمات bench
bench restart
# بديل: إعادة التشغيل عبر Supervisor مباشرة (كـ root)
sudo supervisorctl restart all
sudo supervisorctl status
# إيقاف/بدء خدمات فردية
sudo supervisorctl stop frappe-schedule:frappe-schedule
sudo supervisorctl start frappe-schedule:frappe-schedule
أوامر إدارة المستخدمين
# إعادة ضبط كلمة مرور المسؤول
# متى تستخدمه: حين تكون محجوباً خارج النظام
bench --site mycompany.com set-admin-password كلمة_المرور_الجديدة
# إضافة مستخدم System Manager جديد من سطر الأوامر
bench --site mycompany.com add-system-manager [email protected] \
--first-name Ahmed \
--last-name Hassan
# تعطيل مستخدم (يمنع الدخول، ولا يحذف البيانات)
bench --site mycompany.com disable-user [email protected]
# تمكين مستخدم
bench --site mycompany.com enable-user [email protected]
أوامر المجدول والمهام الخلفية
ERPNext يشغّل مهاماً في الخلفية: إرسال البريد، وإنشاء الفواتير الدورية، وتشغيل النسخ الاحتياطي المجدول. ولو المجدول متوقف، كل ده بيقف في صمت — من غير رسالة خطأ ومن غير ما يلاحظ أحد، لحد ما عميل يسأل عن فاتورة لم تصله. الأوامر دي بتقول لك هل هو شغال أصلاً.
# حالة المجدول
bench --site mycompany.com scheduler status
# تفعيل المجدول (مطلوب بعد التثبيت، أو لو اتوقف يدوياً)
bench --site mycompany.com enable-scheduler
# إيقاف المجدول (مفيد وقت الصيانة لإيقاف المهام الخلفية)
bench --site mycompany.com disable-scheduler
# تشغيل مهمة مجدولة بعينها يدوياً (للاختبار)
bench --site mycompany.com run-patch erpnext.patches.v15_0.some_patch_name
# عرض المهام المعلقة
bench --site mycompany.com show-pending-jobs
أوامر التشخيص والسجلات
لما يحصل خطأ، السجل هو المكان الوحيد اللي بيقول لك حصل إيه بالظبط. تابعه وهو بيتكتب بدل ما تخمّن.
# متابعة سجل الأخطاء لحظياً
tail -f ~/frappe-bench/logs/frappe.log
# متابعة أخطاء العمال الخلفيين
tail -f ~/frappe-bench/logs/worker.error.log
# متابعة سجل خادم الويب
tail -f ~/frappe-bench/logs/web.error.log
# تشغيل خادم التطوير (يعيد التحميل تلقائياً مع تغيير الكود)
# تحذير: لا تستخدمه على سيرفر الإنتاج إطلاقاً
bench start
# تشغيل اختبارات وحدة بعينها
bench --site mycompany.com run-tests --module erpnext.accounts
بطاقة المرجع السريع (اطبعها وعلّقها)
الأوامر العشرة التي ستستخدمها فعلاً كل أسبوع:
# 1. خذ نسخة احتياطية
bench --site mycompany.com backup --with-files
# 2. طبق التحديثات (التحديثات الصغيرة)
bench update --pull
# 3. أعد تشغيل كل الخدمات بعد التحديث
bench restart
# 4. تحقق أن كل شيء يعمل
bench --site mycompany.com doctor
# 5. امسح الكاش حين لا ينعكس شيء
bench --site mycompany.com clear-cache
# 6. أعد ضبط كلمة مرور الأدمين
bench --site mycompany.com set-admin-password كلمة_جديدة
# 7. فعل وضع الصيانة للتحديثات
bench --site mycompany.com set-maintenance-mode on
# 8. تحقق من حالة الخدمات
sudo supervisorctl status
# 9. تحقق من الإصدار الحالي
bench version
# 10. راقب الأخطاء في الوقت الفعلي
tail -f ~/frappe-bench/logs/frappe.log
سيب تعليقك