Developer Logs

รัน odoo ผ่าน docker + custom addons ด้วยตัวเอง

odoo
Docker
Programming
Python

วันนี้จะพามา Setup odoo ด้วย docker พร้อมกับ Custom addons ไปด้วย เรียกว่า อ่านจบแล้วสามารถไป install plugins ใช้เองได้เลย

Days: 3 | Publish : 26/01/2025

setup odoo with docker and custom addons

วันนี้จะพามา Setup odoo ด้วย docker พร้อมกับ Custom addons ไปด้วย
เรียกว่า อ่านจบแล้วสามารถไป install plugins ใช้เองได้เลย


ในการ Install ที่เราจะมาคุยกันในวันนี้
เราจะใช้เป็น odoo Community Edition ที่เป็น Opensource
โดยที่ถ้าใครเคยลอง setup ด้วยตัวเองแล้ว ก็น่าจะเคยทำขั้นตอนตาม Document ตัวนี้กันมาบ้างแล้ว

odoo installation

https://www.odoo.com/documentation/master/administration/on_premise/source.html

แต่ในวันนี้ ผมจะพาทุกคนไป setup ตัวระบบ odoo กันในอีกรูปแบบนึง
โดยใช้ Docker ในการ setup + run

ก่อนอื่นขอแนะนำให้รู้จักกับ official source ของ odoo ที่เราจะสามารถไปตามกันได้ก่อน

Github
https://github.com/odoo/odoo
Docker Hub
https://hub.docker.com/_/odoo


โดย version ที่เราจะเล่นกันในวันนี้จะเป็น version 18.0

Tools ที่จำเป็นต้องมีก่อนจะไปกันต่อ

ก่อนอื่นเรามาเช็คกันก่อนสักนิด ว่า docker ของเราได้ปิด service ขึ้นมาเรียบร้อย
เปิด​ Terminal ขึ้นมาและพิมพ์เช็ค version กันสักนิด


  > docker --version

  ถ้ารันทุกอย่างได้เรียบร้อยก็ควรจะขึ้นมาเป็นอะไรประมาณนี้
  (ตัวเลขอาจไม่เหมือนกัน แล้วแต่เวอร์ชันที่ทำการ install)
  > Docker version 27.3.1, build ce12230

ถัดมาให้เราสร้าง folder สำหรับ odoo และสร้างไฟล์ docker-compose.yml
เพื่อใช้ในการรัน odoo ผ่าน docker engine

docker-compose.yml


  version: '3.1'
  services:
    web:
      image: odoo:18.0
      # command: -d database_name -u module_name
      depends_on:
        - db
      ports:
        - "8069:8069"
      volumes:
        - odoo-web-data:/var/lib/odoo
        - ./config:/etc/odoo
        - ./addons:/mnt/extra-addons
    db:
      image: postgres:15
      environment:
        - POSTGRES_DB=postgres
        - POSTGRES_PASSWORD=odoo
        - POSTGRES_USER=odoo
      volumes:
        - odoo-db-data:/var/lib/postgresql/data
      ports:
        - 5432:5432/tcp
  volumes:
    odoo-db-data:
    odoo-web-data:

ซึ่งจากไฟล์ compose ด้านบน ก็จะเป็นตัวอย่างแบบง่าย ๆ สำหรับการรัน odoo version 18.0 CE
โดยจุดที่จะต้อง breakdown กันหน่อยก็จะมีอยู่สัก 2 จุด

1. การเซ็ต Ports ของทั้งฝั่ง server และ container


    ports:
      - "8069:8069" (server:container)

ฝั่งซ้ายเป็น port ที่ expose ออกมานอก docker container
ส่วนฝั่งขวาจะเป็น port ที่อยู่ใน container
ในที่นี้เรารันด้วย odoo default port ก็จะเป็น 8069 (ที่ฝั่งขวา)
และผมอยากให้สามารถเข้าได้ด้วย URL
http://localhost:8069
ก็จะใช้ port ในฝั่งซ้ายเป็น 8069 เหมือนกันกับฝั่งที่ mapping ออกมา
ในส่วนนี้เราก็สามารถเปลี่ยนแปลงได้ตามต้องการ หรือถ้าใครต้องการรันไว้หลาย ๆ port พร้อม ๆ กัน
ก็สามารถใช้เลข port ที่แตกต่างกันได้ เท่านี้ก็จะไม่มีเรื่อง port ชนกัน

2. การ map volumes เพื่อให้เรียกใช้ config file / custom addons


    volumes:
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons

ส่วนนี้นับว่าเป็นจุดสำคัญเลยสำหรับผู้ที่ต้องการจะ
install custom module เข้าไปใช้งานกับ docker
จุดนี้จะเป็นการเซ็ต mount point ระหว่าง server กับ container
ซึ่งถ้าเราคุ้นกันกับการ install แบบเดิม ที่เป็นการรันผ่าน odoo service
หรือใช้เป็น command line ในการรัน
เราจะต้องมีการเรียกไฟล์ config เพื่อระบุ path ของ module ที่เราต้องการใช้งานให้เรียบร้อยก่อน
เพื่อให้ตัว odoo app มองเห็น module ได้
โดยเราจะเอา config ไว้ภายใต้ /config folder

odoo.conf


  [options]
  addons_path = /mnt/extra-addons,/mnt/extra-addons/jorvor-custom-addons
  data_dir = /var/lib/odoo

และสมมติว่าผมมีชื่อ folder ของ custom module ที่ทำเอาไว้อยู่ที่ folder
ชื่อ /jorvor-custom-addons
สิ่งที่ผมต้องทำเพื่อให้ docker-compose นี้มองเห็น addons ของผม
ก็จะต้องเอา custom addons ไปไว้ภายใต้ folder /addons ก่อน
เพื่อให้ mapping volume ได้ถูกต้อง ตาม compose file


  format จะเป็นตามนี้ localPath:containerPath
  - ./config:/etc/odoo
  - ./addons:/mnt/extra-addons

ทีนี้ compose file ก็จะมองเห็นทั้ง config และ custom addons path เป็นที่เรียบร้อย
** ถ้าสงสัยว่า ทำไมใน container ถึงต้องเป็น /mnt/extra-addons กับ /etc/odoo ด้วยล่ะ ?
ก็ไปอ่านใน official document ที่อยู่ใน docker hub ได้เลยครับ
มีระบุ path ไว้อยู่แล้ว ว่าเราจะต้อง mount ไปที่ไหน

ซึ่งถ้าทำตามทุกขั้นตอนทั้งหมดตามผมมา
ใน folder odoo ของเราก็จะมีโครงสร้างเป็นประมาณนี้


  - /odoo
    - /config
      - odoo.conf
    - /addons
      - /xxx-custom-addons
      - /my-addons-1
      - /my-addons-2
      - ...
    - docker-compose.yml


ทีนี้ก็ลองรัน compose กันได้เลย


  > docker compose up

** ระหว่างที่รันอยู่เราจะไม่สามารถพิมพ์อะไรได้ ให้กด ctrl + c เพื่อเป็นการปิดการรัน service

ถ้าเป็นการ install ครั้งแรก
docker จะทำการ pull image มาเก็บไว้ที่เครื่อง
โดยเรามีการ pull image 2 ตัวคือ

- odoo (app)
- postgres (db)
\*\* ถ้ามี error เกิดขึ้น ไม่สามารถรัน compose file ได้ ให้ลองตรวจสอบ syntax ต่าง ๆ ที่อยู่ภายในไฟล์ `docker-compose.yml`

ถ้า service รันขึ้นมาได้เรียบร้อย
ให้เราไปลองดูที่ browser URL http://localhost:8069
เราก็จะเห็นหน้า app odoo ใหม่ของเราเรียบร้อย
ลองเข้าไปตรวจสอบ app ว่ามี custom module ขึ้นมาเรียบร้อยแล้วยังด้วยนะครับ
ซึ่งถ้าใครไม่ขึ้นก็ลองเปิด debug mode แล้วก็ไปที่
Settings —> Update app list ดูสัก 1 รอบ ซึ่งถ้าจังหวะนี้ยังไม่เห็น custom module โผล่ขึ้นมาอีก
ก็ให้ไปเช็คที่ mount point หรือ config file ได้เลยครับ


ก็จบกันไปกับการ run odoo service ด้วยตัวเองแบบง่าย ๆ
ที่สามารถใช้ custom module ไปได้ด้วยเลยในทีเดียวกัน
ในบทความถัดไป เราจะไปคุยกันต่อว่า
เมื่อเราขาด library บางตัวไป จะทำยังไงล่ะ ถ้าใช้ docker ?


คำสั่งน่ารู้สำหรับการรัน docker compose


  > docker compose up
  รัน service

  > docker compose up -d
  รัน service ไว้ background

  > docker compose down
  ใช้สำหรับการปิด service ในกรณีที่รันไว้ background