جميع المقالات

كيف تثبّت Odoo 19 على Ubuntu: يدويًا أو ببضع نقرات

دليل عملي لتثبيت Odoo 19 على خادم Ubuntu بمعايير الإنتاج: PostgreSQL وPython وwkhtmltopdf والإعدادات وsystemd وnginx وHTTPS، وكيف يتولى Cloud Buddy ذلك كله عنك.

بقلم Cloud Buddy · نُشر في · 7 دقائق للقراءة · تثبيت Odoo, Ubuntu, خادمك الخاص

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

يشرح هذا الدليل تثبيتًا نظيفًا للإصدار Odoo 19 على Ubuntu بالطريقة التي توصي بها وثائق Odoo نفسها (من الشيفرة المصدرية، داخل بيئة Python افتراضية، مع تشغيله عبر systemd)، إلى جانب تفاصيل الإنتاج التي يسهل نسيانها. وفي النهاية سترى كيف ينجز Cloud Buddy الأمر نفسه على خادمك ببضع نقرات.

Odoo علامة تجارية لشركة Odoo S.A. أما Cloud Buddy فخدمة مستقلة، غير تابعة لشركة Odoo S.A. ولا معتمدة منها.

قبل أن تبدأ

ستحتاج إلى:

  • خادم Ubuntu يمكنك الوصول إليه بصلاحيات root عبر SSH. يُعدّ Ubuntu 22.04 أو 24.04 بذاكرة لا تقل عن 2 غيغابايت بدايةً معقولة لفريق صغير؛ فالمزيد من المستخدمين يحتاج إلى مزيد من العمّال، والمزيد من العمّال يحتاج إلى مزيد من الذاكرة.
  • اسم نطاق (مثل erp.example.com) يشير سجل A الخاص به إلى العنوان العام للخادم، إذا كنت تريد HTTPS.
  • Python 3.10 أو أحدث. يأتي كلٌّ من Ubuntu 22.04 و24.04 بإصدار Python حديث بما يكفي.

كل ما يلي يُنفَّذ بصلاحيات root أو باستخدام sudo.

1. حزم النظام وPostgreSQL

حدّث الخادم، ثم ثبّت PostgreSQL والمكتبات التي تُبنى عليها حزم Python التي يستخدمها Odoo:

apt-get update && apt-get upgrade -y
apt-get install -y postgresql git python3-venv python3-dev build-essential \
  libpq-dev libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev libjpeg-dev zlib1g-dev

أنشئ مستخدم نظام مخصصًا لتشغيل Odoo، ودورًا مطابقًا له في PostgreSQL يستطيع إنشاء قواعد البيانات لكنه لا يملك صلاحيات المستخدم الفائق (superuser):

adduser --system --group --home /opt/odoo odoo
sudo -u postgres createuser --createdb odoo

ولأن الدور يحمل اسم مستخدم النظام نفسه، يتصل Odoo بقاعدة البيانات عبر المقبس المحلي (local socket) في PostgreSQL دون كلمة مرور.

2. wkhtmltopdf لتقارير PDF

يطبع Odoo الفواتير وعروض الأسعار وسائر ملفات PDF عبر wkhtmltopdf. استخدم الإصدار 0.12.6.1 المبني مع Qt المعدَّل (patched Qt) من صفحة الإصدارات في مشروع wkhtmltopdf، لا الحزمة الأقدم الموجودة في أرشيف Ubuntu: فمن دون Qt المعدَّل تختفي الترويسات والتذييلات من ملفات PDF لديك.

3. Odoo 19 في بيئة افتراضية

استنسخ الفرع 19.0 وحده (فالتاريخ الكامل للمستودع يبلغ عدة غيغابايتات)، ثم ثبّت متطلبات Python الخاصة به داخل بيئة افتراضية خاصة بـ Odoo:

sudo -u odoo git clone --depth 1 --branch 19.0 https://github.com/odoo/odoo.git /opt/odoo/odoo
sudo -u odoo python3 -m venv /opt/odoo/venv
sudo -u odoo /opt/odoo/venv/bin/pip install -r /opt/odoo/odoo/requirements.txt
mkdir -p /opt/odoo/custom-addons /var/log/odoo && chown odoo: /opt/odoo/custom-addons /var/log/odoo

توضع وحداتك البرمجية الخاصة في /opt/odoo/custom-addons. أما مع Odoo Enterprise فتحتاج أيضًا إلى إضافات Enterprise (وهي تأتي مع اشتراك Odoo Enterprise من Odoo S.A.) في مجلد مستقل خاص بها ضمن مسار الإضافات.

4. ملف الإعدادات

أنشئ الملف /etc/odoo/odoo.conf بحيث لا يقرؤه سوى المستخدم odoo (chmod 640، ومالكه root:odoo):

[options]
admin_passwd = a-long-random-master-password
db_user = odoo
addons_path = /opt/odoo/odoo/addons,/opt/odoo/custom-addons
http_interface = 127.0.0.1
proxy_mode = True
list_db = False
workers = 3
max_cron_threads = 1
limit_memory_soft = 2147483648
limit_memory_hard = 2684354560
logfile = /var/log/odoo/odoo.log

أهم الأسطر في بيئة الإنتاج:

  • admin_passwd: كلمة المرور الرئيسية لمدير قواعد البيانات. لا تتركها أبدًا على قيمتها الافتراضية.
  • list_db = False: تُخفي قائمة اختيار قاعدة البيانات ومدير قواعد البيانات، فلا يستطيع أحد عرض قواعد البيانات أو نسخها احتياطيًا أو حذفها من صفحة تسجيل الدخول.
  • http_interface = 127.0.0.1 وproxy_mode = True: لا يستمع Odoo إلا محليًا خلف nginx، ويعتمد على nginx في معرفة عنوان الزائر وما إذا كان الاتصال عبر HTTPS.
  • workers: عندما تكون قيمة العمّال أكبر من صفر، يعمل Odoo بوضع تعدد العمليات. يقترح دليل Odoo نحو (عدد أنوية المعالج × 2) + 1 حدًّا أعلى، مقيّدًا بالذاكرة المتاحة: احسب نحو 150 ميغابايت للعامل الخفيف وما يصل إلى 1 غيغابايت للعامل الثقيل.

أضف قاعدة logrotate للملف /var/log/odoo/odoo.log، وإلا فسيملأ السجل القرص بصمت على مرّ الأشهر.

5. خدمة systemd

أنشئ الملف /etc/systemd/system/odoo.service:

[Unit]
Description=Odoo 19
After=network.target postgresql.service

[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/opt/odoo/venv/bin/python3 /opt/odoo/odoo/odoo-bin -c /etc/odoo/odoo.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target

ثم نفّذ systemctl daemon-reload && systemctl enable --now odoo، وتابع السجل باستخدام tail -f /var/log/odoo/odoo.log حتى يُظهر أن الخادم أصبح يستقبل الاتصالات.

6. nginx وHTTPS

ثبّت nginx وcertbot (apt-get install -y nginx certbot python3-certbot-nginx)، ثم ضع Odoo خلف nginx. عند تشغيل العمّال، تمر الدردشة المباشرة والإشعارات عبر /websocket، الذي تخدمه عملية gevent المنفصلة في Odoo على المنفذ 8072:

upstream odoo { server 127.0.0.1:8069; }
upstream odoo_ws { server 127.0.0.1:8072; }

server {
    listen 80;
    server_name erp.example.com;
    client_max_body_size 100m;

    location /websocket {
        proxy_pass http://odoo_ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
    }

    location / {
        proxy_pass http://odoo;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
    }
}

اختبر الإعدادات باستخدام nginx -t، وأعد تحميل nginx، ثم نفّذ certbot --nginx -d erp.example.com للحصول على شهادة Let's Encrypt مجانية تتجدد تلقائيًا. وأخيرًا، افتح المنفذين 80 و443 في جدار الحماية (ufw allow 'Nginx Full')، وأبقِ SSH مفتوحًا، ولا تكشف أبدًا المنفذ 8069 أو 8072 أو منفذ PostgreSQL رقم 5432 على الإنترنت.

7. أنشئ قاعدة البيانات، ثم اعتنِ بها

افتح https://erp.example.com، وأنشئ قاعدة بياناتك بإدخال البريد الإلكتروني وكلمة المرور للمسؤول، والدولة (وعلى أساسها تُثبَّت حزمة التوطين المالي المناسبة)، والتطبيقات التي تحتاجها. بهذا يكتمل التثبيت. أما الجزء الذي لا ينتهي فهو التشغيل والصيانة:

  • النسخ الاحتياطية يوميًا، محفوظة في مكان آخر غير الخادم، مع استعادتها بين حين وآخر للتأكد من أنها تعمل.
  • التحديثات الأمنية لنظام Ubuntu، ومراجعة من يستطيع تسجيل الدخول عبر SSH.
  • المراقبة: هل يستجيب Odoo؟ هل يمتلئ القرص؟ هل تتجدد الشهادة؟
  • الترقية إلى إصدار Odoo التالي قبل انتهاء دعم إصدارك.

أو: دع Cloud Buddy يتولى ذلك على خادمك

كل ما سبق هو ما يفعله مثبّت Cloud Buddy على خادمك الخاص، إضافة إلى التشغيل والصيانة بعد ذلك. اربط خادمك بأمر واحد، وانقر Install Odoo، واختر 19.0 (أو 17.0 أو 18.0 أو 20.0)، وإصدار Community أو Enterprise، ونطاقك، واللغة، والدولة، والتطبيقات، ثم راجع الخطة:

  • تثبيت أصلي أو عبر Docker: تثبيت أصلي مع systemd كما في الخطوات أعلاه، عندما يكون إصدار Python على الخادم حديثًا بما يكفي؛ وإلا فصورة Odoo الرسمية في Docker.
  • تحديد الموارد: عدد العمّال وحدود الذاكرة وخيوط cron تُحسب بناءً على معالج الخادم وذاكرته ونسخ Odoo الأخرى العاملة عليه، مع عرض طريقة الحساب.
  • إصلاحات يجريها تلقائيًا: ملف ذاكرة تبادل عندما تكون الذاكرة غير كافية، وتنظيف القرص، واختيار الاسم والمنافذ المتاحة التالية عندما تكون التي اخترتها مستخدمة، وتثبيت PostgreSQL وnginx وcertbot عندما لا تكون موجودة.
  • محصَّن افتراضيًا: كلمة مرور رئيسية عشوائية تُخزَّن بصيغة مجزّأة (hashed)، وقائمة قواعد البيانات معطّلة، ومستخدم نظام ودور PostgreSQL خاصّان به، وتدوير السجلات.
  • HTTPS بمجرد جاهزية DNS: إذا لم يكن نطاقك يشير إلى الخادم بعد، يعمل Odoo على عنوان الخادم، وتُضاف الشهادة تلقائيًا بمجرد أن يشير النطاق إليه.

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

جرّب سير العمل على مستودعك الخاص

اختر العمّال والتخزين وبيئات التجهيز التي تحتاجها، وسيُبنى فرعك الأول خلال دقائق.

عرض الأسعار · تحدّث معنا