کانتینرها¶
بررسی اجمالی¶
هر ساخت در کانتینر اختصاصی خود ایزوله میشود (کانتینر 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 میتوانید قطعه کد/تابع/متدی را که میخواهید اشکالزدایی کنید فعال کنید.