شروحات تقنية 2026-04-05 18 دقيقة قراءة

تثبيت ERPNext v15 على Debian 12 / Ubuntu 22.04 LTS: الدليل الحقيقي من مهندس DevOps

الدليل ده بيثبت ERPNext v15 (أحدث إصدار مستقر) على Debian 12 (Bookworm) أو Ubuntu 22.04 LTS. كل أمر اتجرب على سيرفر نظيف فعلاً. قبل ما تبدأ: فهم إن ERPNext مش 'برنامج واحد' — ده نظام بيعتمد على 7 خدمات لازم كلها تشتغل مع بعض بشكل صحيح. ده هو السبب الحقيقي اللي بيخلي التثبيت يفشل عند أغلب الناس. الدليل ده بيشرح ليه كل خدمة موجودة عشان تفهم اللي بتبنيه، مش بس تكوبي أوامر بشكل أعمى.

اللي بتثبته فعلاً (اقرأ الجزء ده الأول)

ERPNext بيشتغل على إطار عمل اسمه Frappe. الاتنين مع بعض بيعتمدوا على 7 خدمات: (1) MariaDB 10.11 — بيخزن كل بياناتك في جداول، (2) Redis 7 — بيخزن بيانات مؤقتة زي جلسات المستخدمين وقوائم انتظار المهام الخلفية، (3) Python 3.11 — بيشغل كود تطبيق Frappe/ERPNext، (4) Node.js 18 LTS — بيبني الـ JavaScript/CSS للمتصفح، (5) Supervisor — بيفضل كل الخدمات شغالة وبيعيد تشغيلها لو وقعت، (6) Nginx — سيرفر الويب اللي المستخدمين بيتوصلوا بيه، (7) wkhtmltopdf — بيحول HTML لـ PDF لطباعة الفواتير. لو أي خدمة منهم متظبطتش صح، ERPNext مش هيشتغل.

الإصدارات المستخدمة في هذا الدليل

نظام التشغيل: Debian 12 (Bookworm) أو Ubuntu 22.04 LTS | ERPNext: v15.x (أحدث إصدار مستقر) | Python: 3.11.x | MariaDB: 10.11.x | Node.js: 18.x LTS | Redis: 7.x | wkhtmltopdf: 0.12.6

متطلبات السيرفر — لا تتجاوز هذا

حد أدنى للاختبار: 2 CPU، 4 جيجا رام، 40 جيجا SSD. حد أدنى للإنتاج حتى 25 مستخدم: 4 CPU، 8 جيجا رام، 80 جيجا SSD. من 25 لـ 100 مستخدم: 8 CPU، 16 جيجا رام، 160 جيجا SSD. الشغل على سيرفر بأقل من 4 جيجا رام هيخلي خطوة بناء الـ JavaScript تنتهي بفشل صامت بسبب نقص الذاكرة.

الخطوة الأولى — تجهيز السيرفر (السبب: السيرفر القديم بيكسر التثبيت)

دايماً ابدأ بنظام محدث. الحزم القديمة ممكن تتعارض مع اللي ERPNext محتاجه. الخطوة دي بتاخد 2-5 دقايق.

bash
# تحديث قائمة الحزم وترقية كل الحزم الموجودة
sudo apt update && sudo apt upgrade -y

# تثبيت أدوات البناء الأساسية اللي حزم Python محتاجها للتجميع
sudo apt install -y \
  git curl wget \
  python3-dev python3-pip python3-venv \
  build-essential \
  libffi-dev libssl-dev \
  libjpeg-dev zlib1g-dev \
  libmysqlclient-dev pkg-config \
  xvfb libfontconfig fontconfig \
  redis-server supervisor nginx \
  cron
ليه هذه الحزم؟

python3-dev و libmysqlclient-dev بيسمحوا لـ Python يجمع موصلات قواعد البيانات من المصدر. libffi-dev و libssl-dev محتاجين من مكتبة التشفير في Python للربط مع ZATCA/ETA. xvfb و libfontconfig مطلوبين من wkhtmltopdf لعرض PDF بدون شاشة.

الخطوة الثانية — تثبيت MariaDB 10.11 (السبب: ERPNext يحتاج إعدادات خاصة غير موجودة في الإصدار الافتراضي)

إصدار MariaDB في مستودع Debian/Ubuntu الافتراضي قديم أو ناقص الميزات المطلوبة. بنثبت MariaDB 10.11 LTS مباشرة من المستودع الرسمي لـ MariaDB.

bash
# تثبيت سكربت إعداد مستودع MariaDB
curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=10.11

# تثبيت MariaDB
sudo apt update
sudo apt install -y mariadb-server mariadb-client

# التحقق من الإصدار المثبت
mysql --version
# المتوقع: mysql  Ver 15.1 Distrib 10.11.x-MariaDB

شغّل معالج الأمان. هيحذف قواعد البيانات التجريبية ويضبط كلمة مرور root:

bash
sudo mysql_secure_installation
# الإجابات: N (لا لمصادقة المقبس), Y (نعم لكلمة مرور root), Y, Y, Y, Y

الآن طبق إعدادات MariaDB الخاصة بـ ERPNext. بدون هذه الإعدادات، ERPNext هيفشل في إنشاء قواعد البيانات مع دعم العربية:

bash
sudo nano /etc/mysql/mariadb.conf.d/50-erpnext.cnf

الصق هذه الإعدادات:

ini
[mysqld]
# مجموعة الأحرف — مطلوبة للبيانات العربية والفارسية وكل Unicode
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# إعدادات InnoDB — مطلوبة لصيغة صفوف ERPNext
innodb-file-format = barracuda
innodb-file-per-table = 1
innodb-large-prefix = 1

# الأداء: اضبط على 50-70% من إجمالي RAM
# سيرفر 4 جيجا = 2G, سيرفر 8 جيجا = 5G, سيرفر 16 جيجا = 10G
innodb_buffer_pool_size = 2G

# منع انتهاء المهلة في التقارير الطويلة
wait_timeout = 28800
interactive_timeout = 28800

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
bash
# إعادة تشغيل MariaDB لتطبيق الإعدادات
sudo systemctl restart mariadb
sudo systemctl enable mariadb

# التحقق من صحة مجموعة الأحرف
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_server';"
# يجب أن يظهر: utf8mb4
أكثر خطأ شائع هنا

لو تجاهلت إعداد مجموعة الأحرف وحصلت لاحقاً على خطأ 'Incorrect string value' عند حفظ نص عربي — هذا هو السبب. لا يمكن إصلاح هذا بعد وجود البيانات بدون هجرة مؤلمة. افعله الآن.

الخطوة الثالثة — تثبيت Node.js 18 LTS (السبب: بناء JavaScript في ERPNext يتطلب Node 18 بالتحديد)

ERPNext v15 يتطلب Node.js 18 LTS. Node.js 20 أو 21 ستسبب فشل البناء. إصدار Node.js الافتراضي في النظام خاطئ. ثبّت من المستودع الرسمي:

bash
# تثبيت Node.js 18 LTS من NodeSource
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

# التحقق — يجب أن يظهر v18.x.x
node --version

# تثبيت yarn (مدير الحزم الذي يستخدمه ERPNext)
sudo npm install -g yarn
yarn --version

الخطوة الرابعة — تثبيت wkhtmltopdf 0.12.6 (السبب: الإصدار في المستودعات يطبع PDFs فارغة)

إصدار wkhtmltopdf في مستودعات Ubuntu/Debian لا يدعم ميزات 'headless' التي يستخدمها ERPNext. يجب تثبيت الإصدار 0.12.6 مع Qt المُرقَّع. الفواتير الفارغة أو المكسورة دائماً تكون بسبب استخدام الإصدار الخاطئ.

bash
# تنزيل الإصدار الصحيح حسب نظامك
# لـ Ubuntu 22.04 (Jammy):
wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_amd64.deb

# لـ Debian 12 (Bookworm):
# wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb

# التثبيت
sudo apt install -y ./wkhtmltox_0.12.6.1-3.jammy_amd64.deb

# التحقق
wkhtmltopdf --version
# يجب أن يظهر: wkhtmltopdf 0.12.6.1 (with patched qt)
جزء '(with patched qt)' مهم

لو الناتج لا يحتوي على 'with patched qt'، فواتيرك PDF ستكون فارغة أو مفقودة الـ CSS. احذفه وأعد تثبيت الملف الثنائي الصحيح من رابط GitHub أعلاه.

الخطوة الخامسة — إنشاء مستخدم نظام مخصص (السبب: لا تشغّل ERPNext كـ root أبداً)

ERPNext يجب أن يعمل كمستخدم غير root للأمان. هذا المستخدم يملك كل ملفات وعمليات ERPNext. ننشئ مستخدماً اسمه 'frappe'.

bash
# إنشاء مستخدم frappe بدليل رئيسي
sudo adduser --disabled-password --gecos '' frappe

# منح مستخدم frappe صلاحيات sudo (مطلوبة أثناء التثبيت فقط)
sudo usermod -aG sudo frappe

# التحول لمستخدم frappe لبقية الخطوات
sudo su - frappe
كل الأوامر من هنا: شغّلها كمستخدم 'frappe'

أنت الآن مسجل دخول كـ 'frappe'. موجه الطرفية يجب أن يظهر 'frappe@اسم-سيرفرك'. لا تعود لـ root في الخطوات التالية إلا إذا طُلب منك صراحةً.

الخطوة السادسة — تثبيت Frappe Bench (السبب: Bench هو الأداة التي تدير كل شيء)

Frappe Bench هو أداة سطر أوامر (مثل git أو npm) تثبت ERPNext وتنشئ المواقع وتدير النظام كله. فكر فيه كلوحة التحكم لكل شيء.

bash
# تثبيت bench باستخدام pip (كمستخدم frappe)
pip3 install frappe-bench

# التحقق من تثبيت bench
bench --version
# يجب أن يظهر: 5.x.x أو أعلى

# إذا لم يُعثر على 'bench'، أضف pip bin لـ PATH:
export PATH=$PATH:~/.local/bin
echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc

الخطوة السابعة — تهيئة Frappe Bench وتنزيل ERPNext v15

هذه الخطوة تنزل إطار عمل Frappe (فرع v15)، تنشئ بيئة Python افتراضية، وتحضر هيكل المجلدات. تستغرق 5-15 دقيقة حسب سرعة الإنترنت.

bash
# تهيئة bench مع Frappe v15 — يُنزّل ~200 ميجابايت
bench init --frappe-branch version-15 frappe-bench

# الانتقال لمجلد bench (ابقَ هنا لبقية الدليل)
cd ~/frappe-bench

الآن نزّل تطبيق ERPNext نفسه:

bash
# تنزيل ERPNext v15
bench get-app erpnext --branch version-15

# اختياري لكن موصى به: تنزيل وحدة HR بشكل منفصل
bench get-app hrms --branch version-15

# التحقق من تنزيل التطبيقات
bench version
# يجب أن يُدرج: frappe, erpnext, (hrms)

الخطوة الثامنة — إنشاء أول موقع ERPNext

'الموقع' في ERPNext هو قاعدة بيانات وإعداد معزولان كاملان لشركة واحدة. يمكنك امتلاك مواقع متعددة على سيرفر واحد. استبدل 'mycompany.local' باسم نطاقك الفعلي.

bash
# إنشاء موقع جديد
# استبدل 'mycompany.local' بنطاقك
# استبدل 'كلمة_مرور_DB' بكلمة مرور root لـ MariaDB التي ضبطتها في الخطوة الثانية
# استبدل 'كلمة_مرور_الأدمين' بكلمة المرور التي تريدها لمستخدم أدمين ERPNext

bench new-site mycompany.local \
  --mariadb-root-password كلمة_مرور_DB \
  --admin-password كلمة_مرور_الأدمين \
  --no-mariadb-socket

ثبّت ERPNext (و HRMS) على هذا الموقع:

bash
# تثبيت تطبيق ERPNext على الموقع
bench --site mycompany.local install-app erpnext

# تثبيت HRMS إذا نزّلته
bench --site mycompany.local install-app hrms

# اضبط هذا كموقع افتراضي
bench use mycompany.local
اختبار سريع قبل إعداد الإنتاج

شغّل 'bench start' لبدء سيرفر التطوير. افتح http://IP_السيرفر:8000 في متصفحك. سجل دخول بـ 'Administrator' وكلمة المرور التي ضبطتها. إذا نجح الدخول، كل شيء يعمل. اضغط Ctrl+C لإيقاف سيرفر التطوير.

الخطوة التاسعة — الإعداد الإنتاجي: Nginx وSupervisor وSSL

سيرفر التطوير (bench start) للاختبار فقط. للإنتاج، تحتاج Nginx كسيرفر ويب وSupervisor لتشغيل ERPNext كخدمة خلفية. شغّل هذه الأوامر كـ root (اخرج من مستخدم frappe أولاً).

bash
# الخروج لمستخدم root/sudo
exit

# إعداد وضع الإنتاج — يهيئ Nginx وSupervisor تلقائياً
sudo bench setup production frappe --yes

# إعادة توليد إعداد Nginx
sudo bench setup nginx
sudo nginx -t  # اختبار إعداد nginx — يجب أن يقول 'syntax is ok'
sudo systemctl reload nginx

إعداد SSL (HTTPS) باستخدام Let's Encrypt. يجب أن يكون نطاقك يشير لـ IP هذا السيرفر قبل تشغيل هذا:

bash
# تثبيت certbot
sudo apt install -y certbot python3-certbot-nginx

# الحصول على شهادة SSL (استبدل بنطاقك الفعلي)
sudo certbot --nginx -d mycompany.com --non-interactive --agree-tos -m admin@mycompany.com

# التحقق من عمل التجديد التلقائي
sudo certbot renew --dry-run
bash
# التحقق من تشغيل كل الخدمات
sudo supervisorctl status
# يجب أن تظهر كل الخدمات: RUNNING

sudo systemctl status nginx
# يجب أن يظهر: active (running)

الخطوة العاشرة — إعداد النسخ الاحتياطي التلقائي

النسخ الاحتياطي على نفس السيرفر ليس نسخاً احتياطياً حقيقياً. اضبط نسخاً يومياً وانسخها لمكان خارجي. هذا ليس اختيارياً لنظام إنتاجي.

bash
# إضافة نسخ احتياطي تلقائي — يعمل يومياً عند 2:30 صباحاً
crontab -e -u frappe

# أضف هذا السطر:
30 2 * * * cd /home/frappe/frappe-bench && bench --site mycompany.local backup --with-files >> /home/frappe/backup.log 2>&1

# تمكين النسخ الاحتياطي التلقائي المدمج في ERPNext (كل 6 ساعات)
bench --site mycompany.local set-config --global backup_limit 3
bench --site mycompany.local enable-scheduler
اختبار مكالمة الساعة 3 صباحاً

اسأل نفسك: لو قرص السيرفر فشل كلياً الساعة 3 صباحاً الليلة، هل يمكنك استعادة كل شيء بحلول الصباح؟ إذا الإجابة لا، استراتيجية النسخ الاحتياطي غير جاهزة للإنتاج. انسخ إلى S3 أو Google Cloud Storage أو سيرفر آخر يومياً. ملفات النسخ في: /home/frappe/frappe-bench/sites/mycompany.local/private/backups/

الملخص الصادق: ما الذي بنيته

إذا اتبعت كل خطوة، عندك الآن سيرفر ERPNext v15 إنتاجي يعمل. ما بنيته هو 7 خدمات تعمل معاً: MariaDB يخزن بياناتك، Redis يتعامل مع التخزين المؤقت والقوائم، Python يشغّل منطق ERPNext، Node.js assets يقدمها Nginx، وSupervisor يبقي كل شيء حياً. ما أنت الآن مسؤول عن صيانته: تحديثات الأمان الشهرية، ترقيات إصدارات ERPNext السنوية (وهي مشاريع مزعجة وليست تلقائية)، تجديد شهادات SSL، ومراقبة مساحة القرص.

تخطَّ كل هذا

مانجلي كلاود تنشر ERPNext إنتاجي في 3 دقايق مع كل ما سبق مُعالَجاً. امتثال ضريبي أصلي لـ ETA/ZATCA/FTA، مستخدمين بلا حدود، نسخ احتياطي تلقائي، وتحديثات — كل شيء مشمول. استخدم هذا الدليل إذا أردت تعلم كيف يعمل ERPNext داخلياً. استخدم مانجلي إذا أردت إدارة شركتك.

اترك تعليقاً

التعليقات

تريد هذا يعمل في 3 دقائق بدون أمر طرفية واحد؟ انشر على مانجلي كلاود.