کانتینرها

بررسی اجمالی

هر ساخت در کانتینر اختصاصی خود ایزوله می‌شود (کانتینر namespace‌دار Linux).

پایه یک سیستم Ubuntu است که تمام وابستگی‌های موردنیاز Odoo و نیز بسته‌های پرکاربرد روی آن نصب شده‌اند.

اگر پروژهٔ شما نیازمند وابستگی‌های Python اضافی یا انتشارات جدیدتر است، می‌توانید یک فایل requirements.txt در ریشهٔ شاخه‌های خود تعریف کنید که آن‌ها را فهرست کند. پلتفرم نصب این وابستگی‌ها را در کانتینرهای شما به عهده می‌گیرد. مستندات pip requirements specifiers می‌تواند به شما در نوشتن یک فایل requirements.txt کمک کند. برای یک مثال عینی، فایل requirements.txt پروژهٔ Odoo را ببینید.

فایل‌های requirements.txt زیرماژول‌ها نیز در نظر گرفته می‌شوند. پلتفرم به دنبال فایل‌های requirements.txt در هر پوشه‌ای که شامل ماژول‌های Odoo است می‌گردد: نه در خود پوشهٔ ماژول، بلکه در پوشهٔ والد آن‌ها.

ساختار دایرکتوری

از آنجا که کانتینرها بر پایهٔ اوبونتو هستند، ساختار دایرکتوری آن‌ها از Linux Filesystem Hierarchy Standard پیروی می‌کند. Ubuntu's filesystem tree overview دایرکتوری‌های اصلی را توضیح می‌دهد.

در ادامه دایرکتوری‌های مرتبط Odoo.sh آمده است:

.
├── home
│    └── odoo
│         ├── src
│         │    ├── odoo                Odoo Community source code
│         │    │    └── odoo-bin       Odoo server executable
│         │    ├── enterprise          Odoo Enterprise source code
│         │    ├── themes              Odoo Themes source code
│         │    └── user                Your repository branch source code
│         ├── data
│         │    ├── filestore           database attachments, as well as the files of binary fields
│         │    └── sessions            visitors and users sessions
│         └── logs
│              ├── install.log         Database installation logs
│              ├── odoo.log            Running server logs
│              ├── update.log          Database updates logs
│              └── pip.log             Python packages installation logs
└── usr
     ├── lib
     │    ├── python2.7
     │         └── dist-packages       Python 2.7 standard libraries
     │    ├── python3
     │         └── dist-packages       Python 3 standard libraries
     │    └── python3.5
     │         └── dist-packages       Python 3.5 standard libraries
     ├── local
     │    └── lib
     │         ├── python2.7
     │         │    └── dist-packages  Python 2.7 third-party libraries
     │         └── python3.5
     │              └── dist-packages  Python 3.5 third-party libraries
     └── usr
          └── bin
               ├── python2.7           Python 2.7 executable
               └── python3.5           Python 3.5 executable

هر دو نسخهٔ Python 2.7 و 3.5 در کانتینرها نصب شده‌اند. با این حال:

  • اگر پروژهٔ شما برای استفاده از Odoo 10.0 پیکربندی شده باشد، سرور Odoo با Python 2.7 اجرا می‌شود.

  • اگر پروژهٔ شما برای استفاده از Odoo 11.0 یا بالاتر پیکربندی شده باشد، سرور Odoo با Python 3.5 اجرا می‌شود.

شل پایگاه داده

هنگام دسترسی به یک کانتینر از طریق شل، می‌توانید با استفاده از psql به پایگاه داده دسترسی داشته باشید.

odoo@odoo-addons-master-1.odoo.sh:~$ psql
psql (9.5.2, server 9.5.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

odoo-addons-master-1=>

مراقب باشید! برای هر دستور sql که منجر به تغییر می‌شود (UPDATE، DELETE، ALTER، ...)، به‌ویژه برای پایگاه دادهٔ تولیدی خود، از تراکنش‌ها (BEGIN...COMMIT/ROLLBACK) استفاده کنید.

مکانیزم تراکنش در صورت اشتباه شبکهٔ ایمنی شما است. به‌سادگی باید تغییرات خود را rollback کنید تا پایگاه دادهٔ خود را به وضعیت قبلی بازگردانید.

برای مثال، ممکن است فراموش کنید شرط WHERE خود را تعیین کنید.

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK

در چنین حالتی، می‌توانید با rollback تغییرات ناخواسته‌ای را که به‌اشتباه انجام داده‌اید بازگردانید و دستور را بازنویسی کنید:

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-addons-master-1=> COMMIT;
COMMIT

با این حال، فراموش نکنید که پس از انجام آن، تراکنش خود را یا commit کنید یا rollback. تراکنش‌های باز ممکن است رکوردهای جداول شما را قفل کنند و پایگاه دادهٔ در حال اجرای شما ممکن است منتظر آزادسازی آن‌ها بماند. این می‌تواند باعث hang شدن نامحدود سرور شود.

علاوه بر این، در صورت امکان ابتدا دستورات خود را روی پایگاه‌های داده staging آزمایش کنید. این کار یک لایهٔ ایمنی اضافی به شما می‌دهد.

اجرای یک سرور Odoo

می‌توانید یک نمونه‌ٔ سرور Odoo را از شل کانتینر راه‌اندازی کنید. نخواهید توانست از دنیای بیرون با یک مرورگر به آن دسترسی داشته باشید، اما برای مثال می‌توانید:

  • از شل Odoo استفاده کنید،

$  odoo-bin shell
>>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1)
>>> partner.name
'ASUSTeK'
>>> partner.name = 'Odoo'
>>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name
'Odoo'
  • یک ماژول را نصب کنید،

$  odoo-bin -i sale --stop-after-init
  • یک ماژول را به‌روزرسانی کنید،

$  odoo-bin -u sale --stop-after-init
  • آزمون‌های یک ماژول را اجرا کنید،

$  odoo-bin -i sale --test-enable --log-level=test --stop-after-init

در دستورات بالا، آرگومان:

  • --stop-after-init بلافاصله پس از تکمیل عملیات درخواستی شما، نمونهٔ سرور را خاموش می‌کند.

گزینه‌های بیشتری در دسترس است و در مستندات CLI به‌تفصیل شرح داده شده است.

می‌توانید مسیر addons مورد استفادهٔ Odoo.sh برای اجرای سرور خود را در لاگ‌ها (~/logs/odoo.log) بیابید. به دنبال «odoo: addons paths» بگردید:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 19.0
2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/19.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

مراقب باشید، به‌ویژه با پایگاه دادهٔ تولیدی خود. عملیاتی که با اجرای این نمونه‌ٔ سرور Odoo انجام می‌دهید ایزوله نیست: تغییرات در پایگاه داده اعمال خواهند شد. همیشه آزمایش‌های خود را در پایگاه‌های دادهٔ staging انجام دهید.

اشکال‌زدایی در Odoo.sh

اشکال‌زدایی یک ساخت Odoo.sh واقعاً تفاوت چندانی با یک اپلیکیشن Python دیگر ندارد. این مقاله فقط ویژگی‌ها و محدودیت‌های خاص پلتفرم Odoo.sh را توضیح می‌دهد و فرض می‌کند که شما از قبل می‌دانید چگونه از یک debugger استفاده کنید.

توجه

اگر هنوز نمی‌دانید چگونه یک برنامهٔ Python را اشکال‌زدایی کنید، دوره‌های مقدماتی متعددی به‌راحتی در اینترنت قابل یافتن است.

می‌توانید از pdb, pudb یا ipdb برای اشکال‌زدایی کد خود در Odoo.sh استفاده کنید. از آنجا که سرور خارج از یک shell اجرا می‌شود، نمی‌توانید debugger را مستقیماً از backend نمونهٔ Odoo خود راه‌اندازی کنید، زیرا debugger برای عملکرد به یک shell نیاز دارد.

  • pdb به‌صورت پیش‌فرض در هر کانتینری نصب است.

  • اگر می‌خواهید از pudb یا ipdb استفاده کنید، باید آن را قبلاً نصب کنید.

    برای این کار، دو گزینه دارید:

    • موقتی (فقط در ساخت فعلی):

      $  pip install pudb --user
      

      یا

      $  pip install ipdb --user
      
    • دائمی: pudb یا ipdb را به فایل requirements.txt پروژهٔ خود اضافه کنید.

سپس کدی را که می‌خواهید اشکال‌زدا را در آن فعال کنید ویرایش کنید و این را اضافه کنید:

import sys
if sys.__stdin__.isatty():
    import pdb; pdb.set_trace()

شرط sys.__stdin__.isatty() ترفندی است که تشخیص می‌دهد آیا Odoo را از شل اجرا کرده‌اید یا خیر.

فایل را ذخیره کنید و سپس Odoo Shell را اجرا کنید:

$ odoo-bin shell

در نهایت، از طریق Odoo Shell می‌توانید قطعه کد/تابع/متدی را که می‌خواهید اشکال‌زدایی کنید فعال کنید.

اسکرین‌شات کنسول که اجرای ``pdb`` در یک شل Odoo.sh را نشان می‌دهد.