Developer Logs

Setup 2 odoo instance on the same subnet with fixed ip

odoo
docker
subnet

Docker custom nework + fixed ip จะทำยังไงกันดีนะ ?

Days: 13 | Publish : 06/04/2025

Setup 2 odoo instance with fixed ip
              

จากครั้งที่แล้ว ที่เราทำ Subnet กันไปแล้ว วันนี้มาต่อยอดกันอีกนิด กับการ Fix IP ให้อยู่ใน range

โดยในตัวอย่างวันนี้ ผมจะขอเป็นโจทย์ว่า

- เราสร้าง custom Network เรียบร้อยแล้ว - ต้องการ Fixed IP ไว้ภายใน ip range อีกทีนึง - ต้องการแยก instance UAT / prod แยกกันไว้คนละ port


โจทย์นี้หลัก ๆ แล้ว ก็จะเป็นการที่เราจำเป็นจะต้อง Fixed IP ด้วยประเด็น เรื่องความปลอดภัยเป็นหลัก ที่ต้องการให้สามารถกำหนดช่วง ip สำหรับ VPN หรือ Firewall ได้

วิธีการ ก็จะเป็นการเพิ่ม config code เข้าไปที่ docker compose file เพื่อให้ container สามารถกำหนด ip ได้

Step 1 : สร้าง Custom network


  docker network create --subnet=10.5.0.0/24 custom-net

Step 2 : แก้ไข docker-compose.yml

UAT docker-compose.yml

version: "2"
services:
  web-uat:
    image: odoo:14.0
    depends_on:
      - db-uat
    ports:
      - "8070:8069" # Different port for UAT Odoo
    volumes:
      - ./addons:/mnt/extra-addons
      - ./config-uat:/etc/odoo
      - odoo-uat-web:/var/lib/odoo
    networks:
      custom-net:
        ipv4_address: 10.5.0.10 # Static IP for UAT Odoo
    stdin_open: true
    tty: true
  db-uat:
    image: postgres:10
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
    volumes:
      - odoo-uat-db-data:/var/lib/postgresql/data
    ports:
      - "5433:5432" # Different port for UAT Postgres
    networks:
      custom-net:
        ipv4_address: 10.5.0.11 # Static IP for UAT Database
volumes:
  odoo-uat-db-data:
  odoo-uat-web:

networks:
  custom-net:
    external: true

โดย config หลัก ๆ ที่จำเป็นสำหรับการทำ custom network + fix ip จะเป็นโค้ดชุดนี้


  web-uat:
    networks:
        custom-net:
          ipv4_address: 10.5.0.10
  .
  .
  .
  networks:
    custom-net:
      external: true

*** สังเกตว่าชื่อ custom-net ก็คือชื่อเดียวกันกับที่เราสร้างไว้ใน Step1 นั่นแหละ

Step3 : แยก docker-compose.yml ให้รันทั้ง db และ web อยู่คนละ port

  • ข้อนี้ทำเพื่อให้ตรงกับโจทย์ที่ว่า เราต้องการรันทั้ง UAT / prod ให้อยู่บนเครื่องเดียวกัน (ซึ่งจริง ๆ ส่วนนี้ก็แล้วแต่การวาง infrastructure หรือแล้วแต่ช่วงการ implement ด้วยนะครับ)

Production docker-compose.yml

version: "2"
services:
  web-prod:
    image: odoo:14.0
    depends_on:
      - db-prod
    ports:
      - "8069:8069" # Default port for Production Odoo
    volumes:
      - ./addons:/mnt/extra-addons
      - ./config-prod:/etc/odoo
      - odoo-prod-web:/var/lib/odoo
    networks:
      custom-net:
        ipv4_address: 10.5.0.20 # Static IP for Production Odoo
    stdin_open: true
    tty: true
  db-prod:
    image: postgres:10
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
    volumes:
      - odoo-prod-db-data:/var/lib/postgresql/data
    ports:
      - "5432:5432" # Default port for Production Postgres
    networks:
      custom-net:
        ipv4_address: 10.5.0.21 # Static IP for Production Database
volumes:
  odoo-prod-db-data:
  odoo-prod-web:

networks:
  custom-net:
    external: true

Step 4 : Run docker-compose instance

มาถึงขั้นตอนนี้ ก็รันแยกกันด้วยนะครับ เพราะเราสร้าง docker-compose.yml ไว้ 2 ไฟล์ เพื่อให้แยก instance กันได้ชัดเจน

For UAT:


 docker compose -f docker-compose-uat.yml up -d

For Production:


 docker compose -f docker-compose-prod.yml up -d


*** Note ส่วนไฟล์ odoo.conf

เปลี่ยน db_host ตาม instance ที่รันด้วยนะครับบบ


 [options]
 db_host = db-uat  # Use 'db-prod' for production
 db_port = 5432
 db_user = odoo
 db_password = odoo


Key Points

1. **External Network:** `docker-compose.yml` ทั้งสองไฟล์ระบุ network ไปที่ subnet เดียวกัน `custom-net`. 2. **Static IPs:** ทั้ง 2 services ถูกสร้างอยู่บน subnet (`10.5.0.0/24`). และจากตัวอย่าง, UAT รันอยู่ที่ ip `10.5.0.10` ส่วน Production รันอยู่ที่ `10.5.0.20` 3. **Network Isolation:** ในไฟล์จะเห็นว่ามีการระบุ `external: true`เพื่อเป็นการบอก compose ว่าให้ไปใช้ custom-net ที่เราได้สร้างไว้อยู่แล้ว โดยไม่ต้องทำการสร้าง network ขึ้นมาใหม่

>_JV