نشر Docker Odoo: إعداد حاوية جاهزة للإنتاج

انشر Odoo في حاويات Docker للإنتاج. الدليل الكامل يغطي تكوين Docker Compose، وإعداد PostgreSQL، والوكيل العكسي Nginx، وSSL، والنسخ الاحتياطية، والقياس.

E

ECOSIRE Research and Development Team

فريق ECOSIRE

5 مارس 20264 دقائق قراءة887 كلمات

نشر Docker Odoo: إعداد حاوية جاهزة للإنتاج

**أصبح Docker طريقة النشر القياسية لـ Odoo في بيئات الإنتاج، مع أكثر من 10 ملايين صورة Odoo Docker يتم سحبها على Docker Hub. ** يوفر النشر في حاويات بيئات قابلة للتكرار، وقياسًا سهلاً، ونسخًا احتياطية مبسطة، وفصلًا نظيفًا بين مثيلات Odoo. يغطي هذا الدليل إعداد Docker Odoo الكامل الجاهز للإنتاج.

الوجبات الرئيسية

  • يقوم Docker Compose بتنسيق Odoo وPostgreSQL وNginx كخدمات متصلة
  • تضمن وحدات التخزين المستمرة بقاء البيانات بعد إعادة تشغيل الحاوية وتحديثاتها
  • يتعامل الوكيل العكسي Nginx مع إنهاء SSL والتخزين المؤقت للملفات الثابتة وموازنة التحميل
  • تحمي النسخ الاحتياطية الآلية من فقدان البيانات بأقل قدر من التدخل اليدوي

نظرة عامة على الهندسة المعمارية

يتكون نشر Odoo Docker للإنتاج من ثلاث خدمات أساسية:

  1. خادم تطبيق Odoo: حاوية Odoo التي تقوم بتشغيل خادم الويب ومنطق التطبيق
  2. قاعدة بيانات PostgreSQL: حاوية قاعدة بيانات مخصصة لتخزين كافة بيانات Odoo
  3. وكيل Nginx العكسي: يتعامل مع طبقة المقابس الآمنة (SSL)، ويقدم الملفات الثابتة، ويطلب الوكلاء إلى Odoo

تشمل الخدمات الاختيارية Redis (للتخزين المؤقت وتخزين الجلسة)، وحاوية النسخ الاحتياطي (تفريغ قاعدة البيانات الآلية)، والمراقبة (Prometheus + Grafana).


تكوين تكوين عامل الميناء

أساس النشر هو ملف docker-compose.yml يحدد جميع الخدمات:

version: "3.8"

services:
  odoo:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
      - "8072:8072"
    volumes:
      - odoo-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    environment:
      - HOST=db
      - PORT=5432
      - USER=odoo
      - PASSWORD=odoo_db_password
    restart: unless-stopped

  db:
    image: postgres:16
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=odoo_db_password
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - postgres-data:/var/lib/postgresql/data/pgdata
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - odoo
    restart: unless-stopped

volumes:
  odoo-data:
  postgres-data:

ملف تكوين Odoo

أنشئ config/odoo.conf باستخدام الإعدادات المحسنة للإنتاج:

[options]
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
admin_passwd = your_strong_admin_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_db_password
db_name = production_db
dbfilter = ^production_db$
list_db = False
proxy_mode = True
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_time_cpu = 600
limit_time_real = 1200
log_level = warn

شرح الإعدادات الرئيسية:

  • proxy_mode = True: مطلوب عند التشغيل خلف Nginx للتعامل بشكل صحيح مع الترويسات المُعاد توجيهها
  • workers = 4: عدد العمليات المنفذة (القاعدة الأساسية: عاملان لكل نواة وحدة المعالجة المركزية)
  • max_cron_threads = 2: مواضيع مخصصة للإجراءات المجدولة
  • list_db = False: يمنع إدراج قاعدة البيانات في صفحة تسجيل الدخول (الأمان)
  • dbfilter: يقيد الوصول إلى قاعدة بيانات واحدة

تكوين الوكيل العكسي لـ Nginx

upstream odoo {
    server odoo:8069;
}
upstream odoochat {
    server odoo:8072;
}

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    client_max_body_size 200m;
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    location /websocket {
        proxy_pass http://odoochat;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

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

    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }
}

استراتيجية النسخ الاحتياطي

النسخ الاحتياطي الآلي لقاعدة البيانات

قم بإنشاء برنامج نصي احتياطي يتم تشغيله يوميًا عبر cron:

#!/bin/bash
BACKUP_DIR=/backups/odoo
DATE=$(date +%Y%m%d_%H%M%S)
docker exec odoo-db pg_dump -U odoo production_db | gzip > $BACKUP_DIR/odoo_$DATE.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

النسخ الاحتياطي لمخزن الملفات

يوجد مخزن ملفات Odoo (المستندات والمرفقات التي تم تحميلها) في المجلد odoo-data. قم بعمل نسخة احتياطية بجانب قاعدة البيانات:

docker run --rm -v odoo-data:/data -v /backups:/backup alpine \
  tar czf /backup/odoo-filestore_$DATE.tar.gz /data

##تشديد الأمن

  • قم بتغيير admin_passwd الافتراضي في odoo.conf إلى كلمة مرور عشوائية قوية
  • قم بتعيين list_db = False لمنع تعداد قاعدة البيانات
  • استخدم dbfilter لتقييد الوصول إلى قاعدة البيانات بقاعدة بيانات واحدة
  • تشغيل الحاويات كمستخدمين غير جذريين حيثما أمكن ذلك
  • حافظ على تحديث صور Docker بتصحيحات الأمان
  • استخدم أسرار Docker أو ملفات متغيرات البيئة (وليس كلمات المرور المضمنة)
  • تقييد الوصول إلى شبكة الحاويات باستخدام شبكات Docker

الأسئلة المتداولة

س: كم عدد المستخدمين المتزامنين الذين يمكنهم التعامل مع حاوية Odoo واحدة؟

مع 4 عمال، تتعامل حاوية Odoo مع ما يقرب من 20-30 مستخدمًا متزامنًا بشكل مريح. للحصول على مستوى أعلى من التزامن، قم بزيادة عدد العاملين (محدود بوحدة المعالجة المركزية/ذاكرة الوصول العشوائي) أو قم بنشر حاويات Odoo متعددة خلف موازن التحميل.

س: كيف يمكنني تحديث Odoo في Docker؟

اسحب الصورة الجديدة، وأوقف الحاوية الحالية، وقم بتشغيل الصورة الجديدة باستخدام وحدات التخزين الموجودة. تحتفظ وحدات التخزين الدائمة ببياناتك ومخزن الملفات عبر تحديثات الصور.

س: هل يجب علي استخدام صورة Odoo Docker الرسمية أو إنشاء نسخة خاصة بي؟

الصورة الرسمية تعمل لعمليات النشر القياسية. أنشئ صورة مخصصة عندما تحتاج إلى حزم Python محددة، أو تبعيات النظام للوحدات النمطية المخصصة، أو وحدات المجتمع المثبتة مسبقًا.

س: كيف يمكنني التعامل مع Odoo Enterprise في Docker؟

Odoo Enterprise غير متاح كصورة Docker عامة. قم بتثبيت دليل الوظائف الإضافية للمؤسسة كوحدة تخزين وقم بالإشارة إليه في تكوين addons_path. أنت بحاجة إلى اشتراك Odoo Enterprise صالح.


ما هو التالي

يمنحك نشر Docker بيئة إنتاج Odoo قابلة للتكرار والتوسع والصيانة. ابدأ بهذا التكوين واضبط عدد العاملين وحدود الذاكرة والتخزين المؤقت بناءً على أنماط الاستخدام الخاصة بك.

اتصل بـ ECOSIRE للحصول على مساعدة في نشر Odoo، أو استكشف خدمات دعم Odoo للاستضافة المُدارة.


تم النشر بواسطة ECOSIRE - مساعدة الشركات على التوسع باستخدام حلول برمجيات المؤسسات.

E

بقلم

ECOSIRE Research and Development Team

بناء منتجات رقمية بمستوى المؤسسات في ECOSIRE. مشاركة رؤى حول تكاملات Odoo وأتمتة التجارة الإلكترونية وحلول الأعمال المدعومة بالذكاء الاصطناعي.

الدردشة على الواتساب