تثبيت ERPNext v15 على Debian 12 / Ubuntu 22.04 LTS: الدليل الحقيقي من مهندس DevOps
الدليل ده بيثبت ERPNext v15 (أحدث إصدار مستقر) على Debian 12 (Bookworm) أو Ubuntu 22.04 LTS. كل أمر اتجرب على سيرفر نظيف فعلا. قبل ما تبدأ: فهم إن ERPNext مش 'برنامج واحد' — ده نظام بيعتمد على ٧ خدمات لازم كلها تشتغل مع بعض بشكل صحيح. ده هو السبب الحقيقي اللي بيخلي التثبيت بيفشل عند أغلب الناس. الدليل ده بيشرح ليه كل خدمة موجودة عشان بتفهم اللي بتبنيه، مش بس تكوبي أوامر بشكل أعمى.
اللي بتثبته فعلا (اقرأ الجزء ده الأول)
ERPNext بيشتغل على إطار عمل اسمه Frappe. الاتنين مع بعض بيعتمدوا على ٧ خدمات: (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 جيجا رام، ٤٠ جيجا SSD. حد أدنى للإنتاج حتى ٢٥ مستخدم: 4 CPU، 8 جيجا رام، 80 جيجا SSD. من 25 لـ 100 مستخدم: 8 CPU، 16 جيجا رام، 160 جيجا SSD. الشغل على سيرفر بأقل من ٤ جيجا رام هيخلي خطوة بناء الـ JavaScript بتنتهي بفشل صامت بسبب نقص الذاكرة.
الخطوة الأولى — تجهيز السيرفر (السبب: السيرفر القديم بيكسر التثبيت)
دايما ابدأ بنظام محدث. الحزم القديمة ممكن تتعارض مع اللي ERPNext محتاجه. الخطوة دي بتاخد 2-5 دقايق.
# تحديث قائمة الحزم وترقية كل الحزم الموجودة
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.
# تثبيت سكربت إعداد مستودع 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:
sudo mysql_secure_installation
# الإجابات: N (لا لمصادقة المقبس), Y (نعم لكلمة مرور root), Y, Y, Y, Y
دلوقتي طبق إعدادات MariaDB بتاعة ERPNext. من غير الإعدادات دي، ERPNext مش هيعرف بيعمل قواعد بيانات بدعم عربي:
sudo nano /etc/mysql/mariadb.conf.d/50-erpnext.cnf
الصق الإعدادات دي:
[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
# إعادة تشغيل 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 أو ٢١ ستسبب فشل البناء. إصدار Node.js الافتراضي في النظام خاطئ. ثبت من المستودع الرسمي:
# تثبيت 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 المرقع. الفواتير الفاضية أو المكسورة دايما سببها النسخة الغلط.
# تنزيل الإصدار الصحيح حسب نظامك
# لـ 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'، فواتيرك PDF ستكون فارغة أو مفقودة الـ CSS. احذفه وأعد تثبيت الملف الثنائي الصحيح من رابط GitHub أعلاه.
الخطوة الخامسة — إنشاء مستخدم نظام مخصص (السبب: لا بتشغل ERPNext كـ root أبدا)
ERPNext لازم يشتغل بمستخدم مش root علشان الأمان. المستخدم ده بيملك كل ملفات وعمليات ERPNext. هنعمل مستخدم اسمه 'frappe'.
# إنشاء مستخدم frappe بدليل رئيسي
sudo adduser --disabled-password --gecos '' frappe
# منح مستخدم frappe صلاحيات sudo (مطلوبة أثناء التثبيت بس)
sudo usermod -aG sudo frappe
# التحول لمستخدم frappe لبقية الخطوات
sudo su - frappe
دلوقتي إنت داخل بـ 'frappe'. سطر الأوامر لازم يبان فيه 'frappe@اسم-سيرفرك'. ما ترجعش لـ root في الخطوات الجاية غير لما يتقالك صراحة.
الخطوة السادسة — تسطيب Frappe Bench (السبب: bench هو الأداة اللي بتدير كل حاجة)
Frappe Bench هو أداة سطر أوامر (زي git أو npm) تثبت ERPNext وتنشئ المواقع وتدير النظام كله. فكر فيه كلوحة التحكم لكل شيء.
# تثبيت 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 افتراضية، وبتجهز هيكل المجلدات. بتاخد من ٥ لـ ١٥ دقيقة حسب سرعة النت.
# تهيئة bench مع Frappe v15 — ينزل ~200 ميجابايت
bench init --frappe-branch version-15 frappe-bench
# الانتقال لمجلد bench (ابق هنا لبقية الدليل)
cd ~/frappe-bench
دلوقتي نزل تطبيق ERPNext نفسه:
# تنزيل 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' لاسم النطاق بتاعك.
# إنشاء موقع جديد
# استبدل 'mycompany.local' بنطاقك
# استبدل 'كلمة_مرور_DB' بكلمة مرور root لـ MariaDB اللي ضبطتها في الخطوة التانية
# استبدل 'كلمة_مرور_الأدمين' بكلمة المرور اللي تريدها لمستخدم أدمين ERPNext
bench new-site mycompany.local \
--mariadb-root-password كلمة_مرور_DB \
--admin-password كلمة_مرور_الأدمين \
--no-mariadb-socket
سطب ERPNext (و HRMS) على الموقع ده:
# تثبيت تطبيق 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 أولا).
# الخروج لمستخدم 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 السيرفر ده قبل ما تشغل الأمر:
# تثبيت certbot
sudo apt install -y certbot python3-certbot-nginx
# الحصول على شهادة SSL (استبدل بنطاقك الفعلي)
sudo certbot --nginx -d mycompany.com --non-interactive --agree-tos -m [email protected]
# التحقق من عمل التجديد التلقائي
sudo certbot renew --dry-run
# التحقق من تشغيل كل الخدمات
sudo supervisorctl status
# المفروض تظهر كل الخدمات: RUNNING
sudo systemctl status nginx
# المفروض يظهر: active (running)
Nginx و Supervisor و SSL دي بالظبط الحتة اللي بتقع الساعة ٢ بالليل. احنا شايلينها عنك.
شوف احنا بنشغل إيه بالظبطالخطوة العاشرة — إعداد النسخ الاحتياطي التلقائي
النسخة الاحتياطية اللي على نفس السيرفر مش نسخة احتياطية أصلا. ظبط نسخة يومية وانقلها لمكان بره. ده مش اختياري لنظام شغال إنتاج.
# إضافة نسخ احتياطي تلقائي — بيعمل يوميا عند 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
اسأل نفسك: لو قرص السيرفر باظ خالص الساعة ٣ الفجر النهاردة، تقدر ترجع كل حاجة قبل الصبح؟ لو الإجابة لأ، يبقى خطة النسخ الاحتياطي بتاعتك مش جاهزة للإنتاج. انسخ يوميا على S3 أو Google Cloud Storage أو سيرفر تاني. ملفات النسخ في: /home/frappe/frappe-bench/sites/mycompany.local/private/backups/
الباك أب اللي على نفس السيرفر مش باك أب. عندنا باك أب يومي بره السيرفر في كل الباقات.
انقل نسختي على مانجليالملخص الصريح: إنت بنيت إيه
لو مشيت على كل خطوة، بقى عندك دلوقتي سيرفر ERPNext v15 شغال إنتاج. اللي بنيته ده ٧ خدمات شغالة مع بعض: MariaDB بيخزن بياناتك، Redis بيمسك الكاش والطوابير، Python بيشغل منطق ERPNext، أصول Node.js بيقدمها nginx، وsupervisor بيخلي كل ده عايش. واللي بقى عليك تصينه: تحديثات الأمان الشهرية، وترقيات نسخ ERPNext السنوية (ودي مشاريع موجعة مش حاجة أوتوماتيك)، وتجديد شهادات SSL، ومتابعة مساحة القرص.
مانجلي كلاود بينشرلك ERPNext إنتاجي في ٣ دقايق وكل اللي فات ده متظبط. امتثال ضريبي أصلي لـ ETA/ZATCA/FTA، مستخدمين بلا حدود، نسخ احتياطي أوتوماتيكي، وتحديثات — كل ده جوه الاشتراك. استخدم الدليل ده لو عايز بتفهم ERPNext من جوه. استخدم مانجلي لو عايز تدير شركتك.
مسطب ERPNext عندك؟ ابعتلنا الباك أب واحنا نرفعهولك على مانجلي ببلاش. لو ملقتش فرق، خد الباك أب بتاعك وامشي.
انقل نسختك ببلاش
سيب تعليقك