หัวข้อขั้นสูง¶
ส่วนนี้ครอบคลุมฟีเจอร์ขั้นสูงของ Odoo.sh ที่เกี่ยวข้องกับ คอนเทนเนอร์, Git submodules และ การดำเนินการตามกำหนดเวลา.
คอนเทนเนอร์¶
แต่ละบิลด์จะถูกแยกการทำงานไว้ในคอนเทนเนอร์ของตัวเอง (คอนเทนเนอร์เนมสเปซของ Linux) ระบบพื้นฐานคือระบบที่ใช้ Ubuntu ซึ่งได้รับการติดตั้งดีเพนเดนซีที่จำเป็นทั้งหมดของ Odoo รวมถึงแพ็กเกจที่มีประโยชน์และใช้งานทั่วไป
หากโปรเจกต์ของคุณต้องการ ดีเพนเดนซีของ Python เพิ่มเติม หรือเวอร์ชันที่ใหม่กว่า คุณสามารถกำหนดไฟล์ requirements.txt ไว้ที่รูทของสาขาของคุณเพื่อระบุรายการเหล่านั้น แพลตฟอร์มจะตรวจสอบให้แน่ใจว่าดีเพนเดนซีเหล่านี้ได้รับการติดตั้งในคอนเทนเนอร์ของคุณแล้ว
ดูเพิ่มเติม
สำหรับตัวอย่างที่เป็นรูปธรรม โปรดดู ไฟล์ requirements.txt ของ Odoo Community
Note
ไฟล์ requirements.txt ของ โมดูลย่อย จะถูกนำมาพิจารณาด้วยเช่นกัน โดยแพลตฟอร์มจะค้นหาไฟล์ดังกล่าวในโฟลเดอร์หลักของแต่ละโฟลเดอร์ที่มีโมดูล Odoo
โครงสร้างไดเร็กทอรี¶
เนื่องจากคอนเทนเนอร์ใช้ระบบ Ubuntu โครงสร้างไดเรกทอรีจึงเป็นไปตาม Filesystem Hierarchy Standard.
ดูเพิ่มเติม
ไดเรกทอรีที่เกี่ยวข้องกับ Odoo.sh มีดังต่อไปนี้:
.
├── home
│ └── odoo
│ ├── backup.daily
│ ├── 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
│ └── 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
└── usr
├── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX standard libraries
├── local
│ └── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX third-party libraries
└── usr
└── bin
└── pythonX.X Python X.XX executable
เชลล์ฐานข้อมูล¶
ขณะเข้าถึงคอนเทนเนอร์ผ่านเชลล์ คุณสามารถเข้าถึงฐานข้อมูลได้โดยใช้คำสั่ง psql
odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.
odoo-master-1=>
Warning
โปรดใช้ ธุรกรรม เสมอ (เช่น BEGIN (...) COMMIT / ROLLBACK) เมื่อคำสั่ง SQL ก่อให้เกิดการเปลี่ยนแปลง (เช่น UPDATE, DELETE, ALTER ฯลฯ) โดยเฉพาะอย่างยิ่งสำหรับฐานข้อมูลการผลิตของคุณ กลไกธุรกรรมเปรียบเสมือนตาข่ายนิรภัยในกรณีที่มีข้อผิดพลาดเกิดขึ้น คุณเพียงแค่ต้องย้อนกลับ (rollback) การเปลี่ยนแปลงเพื่อนำฐานข้อมูลของคุณกลับสู่สถานะก่อนหน้า
อย่าลืมคอมมิตหรือย้อนกลับธุรกรรม ธุรกรรมที่เปิดค้างไว้อาจล็อกเรกคอร์ดในตารางของคุณ และฐานข้อมูลที่กำลังทำงานอยู่อาจต้องรอจนกว่าเรกคอร์ดเหล่านั้นจะถูกปล่อย ซึ่งอาจส่งผลให้เซิร์ฟเวอร์ค้างไปอย่างไม่มีกำหนด
นอกจากนี้ ให้ใช้ฐานข้อมูลสเตจจิ้งของคุณในการทดสอบคำสั่งก่อนเสมอ ซึ่งจะช่วยเพิ่มตาข่ายนิรภัยให้กับคุณอีกชั้น
Example
คุณลืมกำหนดเงื่อนไข WHERE ในกรณีเช่นนี้ คุณสามารถย้อนกลับ (rollback) เพื่อยกเลิกการเปลี่ยนแปลงที่ไม่ต้องการได้:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK
จากนั้น ให้เขียนคำสั่งใหม่แล้วคอมมิตการเปลี่ยนแปลง:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-master-1=> COMMIT;
COMMIT
เรียกใช้เซิร์ฟเวอร์ Odoo¶
คุณสามารถเริ่มอินสแตนซ์ของเซิร์ฟเวอร์ Odoo ได้จากเชลล์ของคอนเทนเนอร์ คุณจะไม่สามารถเข้าถึงได้จากภายนอกผ่านเว็บเบราว์เซอร์ แต่คุณสามารถทำสิ่งต่อไปนี้ได้ เช่น:
ใช้ Odoo shell:
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 --without-demo=all --stop-after-initTip
อาร์กิวเมนต์
--without-demo=allจะป้องกันไม่ให้มีการโหลดข้อมูลสาธิตสำหรับทุกโมดูลอาร์กิวเมนต์
--stop-after-initจะปิดการทำงานของอินสแตนซ์เซิร์ฟเวอร์ทันทีหลังจากการดำเนินการเสร็จสมบูรณ์
อัปเดตโมดูล:
odoo-bin -u sale --stop-after-init
รันการทดสอบสำหรับโมดูล:
odoo-bin -i sale --test-enable --log-level=test --stop-after-init
ดูเพิ่มเติม
หากต้องการค้นหาพาธ addons ที่ Odoo.sh ใช้เพื่อรันเซิร์ฟเวอร์ของคุณ ให้ค้นหา "odoo: addons paths" ในบันทึก (~/logs/odoo.log)
2025-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 18.0
2025-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2025-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/18.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']
Warning
การดำเนินการที่คุณทำบนอินสแตนซ์เซิร์ฟเวอร์ Odoo นั้นไม่ได้แยกเดี่ยว การเปลี่ยนแปลงจะมีผลกับฐานข้อมูล อย่าลืมทำการทดสอบในฐานข้อมูลสเตจจิ้งของคุณเสมอ
การดีบักใน Odoo.sh¶
Note
การดีบักบิลด์ Odoo.sh ไม่ได้แตกต่างจากการดีบักแอป Python อื่น ๆ มากนัก ดังนั้น เป้าหมายของส่วนนี้คือการครอบคลุมลักษณะเฉพาะและข้อจำกัดของแพลตฟอร์ม Odoo.sh โดยถือว่าคุณทราบวิธีใช้งานดีบักเกอร์อยู่แล้ว
คุณสามารถใช้ pdb, pudb หรือ ipdb เพื่อดีบักโค้ดบน Odoo.sh ได้ เนื่องจากเซิร์ฟเวอร์ทำงานอยู่นอกเชลล์ คุณจึงไม่สามารถเปิดใช้งานดีบักเกอร์ได้โดยตรงจากส่วนแบ็กเอนด์ของ Odoo เนื่องจากจำเป็นต้องมีเชลล์ในการทำงาน
pdb ได้รับการติดตั้งเป็นค่าเริ่มต้นในทุกคอนเทนเนอร์
Tip
หากต้องการใช้ pudb หรือ ipdb จำเป็นต้องติดตั้งผ่านทางใดทางหนึ่งต่อไปนี้:
อย่างถาวรโดยการเพิ่ม
pudbหรือipdbลงในไฟล์requirements.txtของโปรเจกต์ของคุณ หรือชั่วคราว (เฉพาะในบิลด์ปัจจุบันเท่านั้น) โดยการรันคำสั่งที่เกี่ยวข้อง:
pip install pudb --user
pip install ipdb --user
หากต้องการเรียกใช้งานดีบักเกอร์ ให้เพิ่มโค้ดต่อไปนี้ลงในโค้ดที่คุณต้องการดีบัก:
import sys if sys.__stdin__.isatty(): import pdb; pdb.set_trace()
Note
เงื่อนไข
sys.__stdin__.isatty()เป็นวิธีแก้ปัญหาชั่วคราวสำหรับการตรวจสอบว่าคุณกำลังรัน Odoo จากเชลล์หรือไม่จากนั้นให้บันทึกไฟล์และรัน Odoo shell:
odoo-bin shell
ใช้ Odoo shell เพื่อเรียกใช้งานโค้ดที่คุณต้องการดีบัก
โมดูลย่อย¶
Git submodules ช่วยให้คุณสามารถเชื่อมโยง repository ภายนอกเข้ากับโปรเจกต์ของคุณได้โดยตรงโดยไม่ต้องคัดลอกและวางโค้ด ซึ่งช่วยเพิ่มความคล่องตัวในการปรับใช้ด้วยการโคลน dependencies ควบคู่ไปกับ codebase หลักของคุณ คุณสามารถควบคุมเวอร์ชั่นได้อย่างแม่นยำโดยเลือก branch ที่ต้องการและปักหมุด commit revision ที่เจาะจงเพื่ออัปเดตได้ทุกเมื่อที่คุณต้องการ
บน Odoo.sh แพลตฟอร์มจะตรวจหา submodule โดยอัตโนมัติและเพิ่มเข้าไปยังพาธ addons ของคุณสำหรับการติดตั้งฐานข้อมูล โดยมีเงื่อนไขว่าคุณต้อง:ref:กำหนดค่า deploy key ในการตั้งค่าโปรเจ็กต์และที่เก็บของคุณ <odoo-sh/settings/submodules> เมื่อรวมที่เก็บข้อมูลส่วนตัว
การเพิ่มโมดูลย่อย¶
Note
ในปัจจุบัน ยังไม่สามารถเพิ่มที่เก็บข้อมูลแบบ ส่วนตัว ด้วย Odoo.sh ได้ อย่างไรก็ตาม คุณสามารถทำได้ด้วย Git
จากมุมมอง สาขา ของโปรเจ็กต์ Odoo.sh ให้เลือกสาขาที่คุณต้องการเพิ่ม submodule
ที่มุมขวาบน ให้คลิก โมดูลย่อย จากนั้นคลิก รันบน Odoo.sh.
ในกล่องโต้ตอบ ให้กรอกข้อมูลต่อไปนี้:
URL ของที่เก็บ: URL SSH ของที่เก็บ
Tip
บน GitHub ให้คลิก โคลน เลือก SSH และคัดลอก URL
สาขา: สาขาเฉพาะที่ควรใช้
พาธ: โฟลเดอร์ที่ควรเพิ่มโมดูลย่อยลงไปในสาขาของคุณ
ในเทอร์มินัล ในโฟลเดอร์ที่โคลนพื้นที่เก็บข้อมูล Git ของคุณ ให้ชำระเงินสาขาที่คุณต้องการเพิ่มโมดูลย่อย:
git checkout <branch>
เพิ่มโมดูลย่อย:
git submodule add -b <branch> <git@yourprovider.com>:<username/repository.git> <path>
<git@yourprovider.com>:<username/repository.git>: URL SSH ของที่เก็บที่คุณต้องการเพิ่มเป็นโมดูลย่อย
<branch>: สาขาที่คุณต้องการใช้ในที่เก็บด้านบน
<path>: โฟลเดอร์ที่คุณต้องการเพิ่มโมดูลย่อยนี้
คอมมิตและพุชการเปลี่ยนแปลง:
git commit -a && git push -u <remote> <branch><remote>: รีโปซิทอรีที่คุณต้องการพุชการเปลี่ยนแปลงของคุณ สำหรับการตั้งค่า Git มาตรฐาน ค่านี้คือ origin
<branch>: สาขาที่คุณต้องการพุชการเปลี่ยนแปลงของคุณ ซึ่งมักจะเป็นสาขาที่คุณเช็คเอาต์ในขั้นตอนแรก
Tip
เมื่อเพิ่มรีโปซิทอรีที่มีหลายโมดูล คุณอาจต้องการละเว้นบางโมดูลหากมีการติดตั้งโมดูลเหล่านั้นโดยอัตโนมัติ ในการดำเนินการดังกล่าว ให้ใส่เครื่องหมาย . นำหน้าโฟลเดอร์ซับโมดูลของคุณ (เช่น .folder) แพลตฟอร์มจะละเว้นโฟลเดอร์นี้ และคุณสามารถเลือกเฉพาะโมดูลที่ต้องการได้โดยการสร้าง ลิงก์สัญลักษณ์ ไปยังโมดูลเหล่านั้นจากโฟลเดอร์อื่น
การดำเนินการตามกำหนดเวลา¶
บนแพลตฟอร์ม Odoo.sh การดำเนินการตามกำหนดเวลาจะทำงานแตกต่างจากเซิร์ฟเวอร์ Odoo ทั่วไปเล็กน้อย และทำงานแบบพยายามอย่างเต็มความสามารถ (best-effort) เนื่องจากอาจมีลูกค้าหลายรายอยู่บนเซิร์ฟเวอร์เดียวกัน และลูกค้าแต่ละรายจะได้รับการรับประกันการจัดสรรทรัพยากรของเซิร์ฟเวอร์อย่างเป็นธรรม ดังนั้น จึงไม่สามารถรับประกันเวลาการทำงานที่แน่นอนสำหรับการดำเนินการตามกำหนดเวลาได้
Important
อย่าคาดหวังให้การดำเนินการตามกำหนดเวลาใดๆ ทำงานบ่อยกว่าทุกห้านาที
เนื่องจากเวลาในการทำงานของแอ็คชั่นตามกำหนดการมีจำกัด จึงแนะนำให้ตรวจสอบว่าแอ็คชั่นตามกำหนดการของคุณ:
ทำงานกับข้อมูลชุดเล็ก ๆ
ยืนยันการทำงานหลังจากประมวลผลแต่ละชุดเสร็จแล้ว เพื่อว่าหากถูกขัดจังหวะด้วยข้อจำกัดด้านเวลา จะไม่ต้องเริ่มต้นใหม่
มีคุณสมบัติ idempotent กล่าวคือต้องไม่ก่อให้เกิดผลข้างเคียง หากถูกเรียกใช้งานบ่อยกว่าที่คาดไว้
การเปลี่ยนแปลงที่อยู่ IP¶
Odoo.sh แจ้งให้ผู้ดูแลระบบโครงการทราบเกี่ยวกับการเปลี่ยนแปลงที่อยู่ IP นอกจากนี้ เมื่อที่อยู่ IP ของอินสแตนซ์การใช้งานจริงมีการเปลี่ยนแปลง จะมีการส่งคำขอ HTTP GET ไปยังเส้นทาง /_odoo.sh/ip-change โดยรวมที่อยู่ IP ใหม่เป็นพารามิเตอร์สตริงแบบสอบถาม (ใหม่) พร้อมกับที่อยู่ IP ก่อนหน้านี้เป็นพารามิเตอร์เพิ่มเติม (เก่า)
กลไกนี้ช่วยให้สามารถทริกเกอร์การดำเนินการที่กำหนดเองเพื่อตอบสนองต่อการเปลี่ยนแปลงที่อยู่ IP (เช่น การส่งอีเมล, การติดต่อกับ API ของไฟร์วอลล์, การกำหนดค่าออบเจ็กต์ฐานข้อมูล ฯลฯ)
ด้วยเหตุผลด้านความปลอดภัย เส้นทาง /_odoo.sh/ip-change จะสามารถเข้าถึงได้จากภายในแพลตฟอร์มเท่านั้น และจะส่งกลับการตอบสนอง 403 หากเข้าถึงผ่านวิธีการอื่น
นี่คือตัวอย่างการนำไปปฏิบัติแบบหลอก:
class IPChangeController(http.Controller):
@http.route('/_odoo.sh/ip-change', auth='public')
def ip_change(self, old=None, new=None):
_logger.info("IP address changed from %s to %s", old, new)
# Then perform whatever action is required for your use case, e.g., update an
# ir.config_parameter, send an email, contact an external firewall service's API, ...
return 'ok'