หัวข้อขั้นสูง

ส่วนนี้ครอบคลุมฟีเจอร์ขั้นสูงของ Odoo.sh ที่เกี่ยวข้องกับ คอนเทนเนอร์, Git submodules และ การดำเนินการตามกำหนดเวลา.

คอนเทนเนอร์

แต่ละบิลด์จะถูกแยกการทำงานไว้ในคอนเทนเนอร์ของตัวเอง (คอนเทนเนอร์เนมสเปซของ Linux) ระบบพื้นฐานคือระบบที่ใช้ Ubuntu ซึ่งได้รับการติดตั้งดีเพนเดนซีที่จำเป็นทั้งหมดของ Odoo รวมถึงแพ็กเกจที่มีประโยชน์และใช้งานทั่วไป

หากโปรเจกต์ของคุณต้องการ ดีเพนเดนซีของ Python เพิ่มเติม หรือเวอร์ชันที่ใหม่กว่า คุณสามารถกำหนดไฟล์ requirements.txt ไว้ที่รูทของสาขาของคุณเพื่อระบุรายการเหล่านั้น แพลตฟอร์มจะตรวจสอบให้แน่ใจว่าดีเพนเดนซีเหล่านี้ได้รับการติดตั้งในคอนเทนเนอร์ของคุณแล้ว

ดูเพิ่มเติม

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-init
    

    Tip

    • อาร์กิวเมนต์ --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
    

ดูเพิ่มเติม

เอกสารประกอบ CLI

หากต้องการค้นหาพาธ 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
    
  1. หากต้องการเรียกใช้งานดีบักเกอร์ ให้เพิ่มโค้ดต่อไปนี้ลงในโค้ดที่คุณต้องการดีบัก:

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

    Note

    เงื่อนไข sys.__stdin__.isatty() เป็นวิธีแก้ปัญหาชั่วคราวสำหรับการตรวจสอบว่าคุณกำลังรัน Odoo จากเชลล์หรือไม่

  2. จากนั้นให้บันทึกไฟล์และรัน Odoo shell:

    odoo-bin shell
    
  3. ใช้ Odoo shell เพื่อเรียกใช้งานโค้ดที่คุณต้องการดีบัก

    pdb ที่กำลังทำงานอยู่ในเชลล์ Odoo.sh

โมดูลย่อย

Git submodules ช่วยให้คุณสามารถเชื่อมโยง repository ภายนอกเข้ากับโปรเจกต์ของคุณได้โดยตรงโดยไม่ต้องคัดลอกและวางโค้ด ซึ่งช่วยเพิ่มความคล่องตัวในการปรับใช้ด้วยการโคลน dependencies ควบคู่ไปกับ codebase หลักของคุณ คุณสามารถควบคุมเวอร์ชั่นได้อย่างแม่นยำโดยเลือก branch ที่ต้องการและปักหมุด commit revision ที่เจาะจงเพื่ออัปเดตได้ทุกเมื่อที่คุณต้องการ

บน Odoo.sh แพลตฟอร์มจะตรวจหา submodule โดยอัตโนมัติและเพิ่มเข้าไปยังพาธ addons ของคุณสำหรับการติดตั้งฐานข้อมูล โดยมีเงื่อนไขว่าคุณต้อง:ref:กำหนดค่า deploy key ในการตั้งค่าโปรเจ็กต์และที่เก็บของคุณ <odoo-sh/settings/submodules> เมื่อรวมที่เก็บข้อมูลส่วนตัว

การเพิ่มโมดูลย่อย

Note

ในปัจจุบัน ยังไม่สามารถเพิ่มที่เก็บข้อมูลแบบ ส่วนตัว ด้วย Odoo.sh ได้ อย่างไรก็ตาม คุณสามารถทำได้ด้วย Git

  1. จากมุมมอง สาขา ของโปรเจ็กต์ Odoo.sh ให้เลือกสาขาที่คุณต้องการเพิ่ม submodule

  2. ที่มุมขวาบน ให้คลิก โมดูลย่อย จากนั้นคลิก รันบน Odoo.sh.

  3. ในกล่องโต้ตอบ ให้กรอกข้อมูลต่อไปนี้:

    • URL ของที่เก็บ: URL SSH ของที่เก็บ

      Tip

      บน GitHub ให้คลิก โคลน เลือก SSH และคัดลอก URL

    • สาขา: สาขาเฉพาะที่ควรใช้

    • พาธ: โฟลเดอร์ที่ควรเพิ่มโมดูลย่อยลงไปในสาขาของคุณ

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'