zalo-icon
facebook-icon
phone-icon
Cài đặt Odoo bằng Docker Compose: Hướng dẫn cho người mới
Cài đặt Odoo Community với Docker Compose, hiểu PostgreSQL, volume và thiết lập môi trường quản lý doanh nghiệp nội thất.

Một công ty nội thất có thể bắt đầu bằng Excel: danh sách khách ở một file, báo giá ở file khác, còn số hàng trong kho do một người ghi riêng. Khi đơn hàng tăng, vấn đề xuất hiện ở chỗ các bộ phận không nhìn thấy cùng một thông tin. Odoo giúp tổ chức công việc bằng các ứng dụng cùng sử dụng dữ liệu doanh nghiệp, từ cơ hội bán hàng đến đơn hàng, kho và hóa đơn.

Bài này giúp bạn hiểu cấu trúc Odoo và chuẩn bị một môi trường học bằng Docker Compose. Tình huống xuyên suốt là Nội thất An Phú, một doanh nghiệp giả lập sản xuất và phân phối bàn, ghế, tủ. Kết thúc bài, mục tiêu là mở được Odoo trên máy, tạo database lab và biết dữ liệu đang được lưu ở đâu; chưa phải triển khai hệ thống vận hành chính thức.

Toàn cảnh dòng chảy nghiệp vụ trên Odoo

Sơ đồ dưới đây giúp bạn nắm toàn cảnh trước khi đọc từng phần. Đi theo các bước đánh số và mũi tên; các ghi chú bên dưới chỉ ra nhánh hoặc điều kiện cần kiểm tra. Bấm vào ảnh để xem rõ hơn.

ODOO: DÒNG CHẢY NGHIỆP VỤ
Từ nhu cầu của khách đến thực hiện đơn và theo dõi tiền. Luồng tổng quát; cần cấu hình ứng dụng, quyền và quy tắc trước khi vận hành.

Odoo là gì và doanh nghiệp dùng để giải quyết việc gì?

Có thể hình dung Odoo là một không gian làm việc gồm nhiều ứng dụng. CRM theo dõi khách đang quan tâm; Sales quản lý đề nghị bán và đơn hàng; Inventory theo dõi hàng hóa; các ứng dụng tài chính xử lý chứng từ và số phải thu, phải trả. Điểm quan trọng nằm ở các hồ sơ có thể liên kết với nhau, không chỉ ở số lượng ứng dụng.

Ví dụ, Công ty Minh Khôi hỏi mua 20 bàn và 40 ghế. Nhân viên An Phú cần lưu nhu cầu trước khi có đơn chính thức. Sau khi khách thống nhất, dữ liệu được dùng để lập báo giá, xác nhận đơn và tiếp tục xử lý giao hàng. Nếu mỗi bước dùng một tên khách khác nhau, báo cáo sẽ khó ghép chính xác dù đã có phần mềm. Vì vậy, chuẩn hóa khách hàng và sản phẩm luôn đi cùng việc cài hệ thống.

Việc cần quản lýỨng dụng liên quanCâu hỏi cần trả lời
Khách đang quan tâmCRMAi phụ trách và lần tới cần làm gì?
Báo giá, đơn bánSalesKhách đồng ý mua mặt hàng nào, giá bao nhiêu?
Hàng hóaInventoryCó bao nhiêu hàng và đang ở đâu?
Mua nguyên liệu, hàng hóaPurchaseCần mua từ ai và khi nào nhận?
Chế tạo thành phẩmManufacturingCần nguyên liệu và lệnh sản xuất nào?
Hóa đơn, công nợInvoicing / AccountingĐã lập chứng từ và còn phải thu, trả bao nhiêu?

Phạm vi tính năng phụ thuộc phiên bản, ứng dụng cài thêm và cấu hình. Series chọn Odoo 19 Community để có một mốc thống nhất cho môi trường tự quản lý. Không dùng nhãn latest vì nhãn đó có thể chuyển sang phiên bản lớn khác. Các hình trong bài được tạo riêng để giải thích tình huống và khái niệm. Chúng không phải ảnh chụp giao diện hoặc bằng chứng về tính năng của từng phiên bản Odoo.

Hiểu Odoo, PostgreSQL và hai volume trước khi chạy

Odoo kết nối công việc giữa bán hàng, kho và tài chính
Odoo kết nối thông tin giữa các bộ phận. Hình minh họa tình huống doanh nghiệp, không phải ảnh chụp phần mềm.

Trình duyệt là nơi bạn làm việc. Container Odoo chạy ứng dụng. Container PostgreSQL giữ dữ liệu có cấu trúc như tên khách và dòng đơn hàng. Ngoài database, Odoo còn có vùng lưu tệp, thường gọi là filestore, để giữ các tệp đính kèm. Vì thế cấu hình bên dưới có hai named volume: db-data cho PostgreSQL và odoo-data cho dữ liệu ứng dụng.

Docker image giống bộ đóng gói phần mềm; container là phiên đang chạy từ bộ đóng gói đó. Volume giữ dữ liệu độc lập với vòng đời container. Khi cập nhật hoặc tạo lại container, bạn cần gắn lại đúng volume. Việc tạo được container mới không có nghĩa dữ liệu cũ tự xuất hiện nếu bạn đổi tên dự án hoặc trỏ sang volume khác.

Chuẩn bị môi trường học

Dùng Linux hoặc WSL2 trên Windows với Docker Engine, hoặc Docker Desktop trên hệ điều hành phù hợp. Các lệnh tạo thư mục bên dưới dùng shell Linux/WSL/macOS. Docker cần đang chạy và tài khoản hiện tại cần quyền sử dụng Docker. Kiểm tra hai lệnh sau trước khi tạo cấu hình:

docker --version
docker compose version

Nếu lệnh thứ hai chưa chạy được, cài Docker Compose plugin theo hướng dẫn chính thức cho hệ điều hành của bạn. Không tiếp tục bằng cách đổi tùy ý giữa docker-compose và docker compose vì cú pháp, tính năng và cách cài đặt có thể khác nhau.

Bạn cần đủ dung lượng để tải image, tạo database và lưu tệp. Tài nguyên cho một người học không thể dùng làm cam kết cho môi trường nhiều nhân viên. Nếu máy đang chạy nhiều stack khác, nên dừng những stack không cần thiết trước khi học. Bài dùng cổng 8069 trên máy cá nhân và không công khai PostgreSQL ra bên ngoài.

Tạo cấu hình Docker Compose cho Odoo

mkdir -p odoo-anphu-lab/config
cd odoo-anphu-lab

Tạo file .env trong thư mục hiện tại. Chuỗi dưới là chỗ giữ chỗ: thay bằng mật khẩu database riêng trước khi chạy, dùng chữ và số để tránh vấn đề ký tự đặc biệt khi mới học. Không đưa file này lên kho mã công khai.

POSTGRES_PASSWORD=REPLACE_WITH_YOUR_DB_PASSWORD

Tạo file config/odoo.conf với nội dung:

[options]
addons_path = /usr/lib/python3/dist-packages/odoo/addons
data_dir = /var/lib/odoo
admin_passwd = REPLACE_WITH_YOUR_MASTER_PASSWORD

Thay giá trị admin_passwd bằng một mật khẩu riêng do bạn tự chọn, khác mật khẩu database. Đây là cấu hình được Odoo đọc trực tiếp từ file. Master password phục vụ quản lý database, khác mật khẩu đăng nhập tài khoản người dùng và khác mật khẩu PostgreSQL.

Tạo file compose.yaml ngay trong odoo-anphu-lab. Dùng khoảng trắng để thụt dòng, không dùng tab:

name: odoo-anphu-lab
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: odoo
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U odoo -d postgres"]
      interval: 5s
      timeout: 5s
      retries: 20
    restart: unless-stopped

  odoo:
    image: odoo:19.0
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "127.0.0.1:8069:8069"
    environment:
      HOST: db
      PORT: 5432
      USER: odoo
      PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}
    volumes:
      - odoo-data:/var/lib/odoo
      - ./config/odoo.conf:/etc/odoo/odoo.conf:ro
    restart: unless-stopped

volumes:
  db-data:
  odoo-data:
Cấu hìnhÝ nghĩa trong lab
HOST: dbOdoo kết nối đến dịch vụ db trong mạng Compose, không phải localhost của container
service_healthyChờ PostgreSQL đạt healthcheck trước khi khởi động Odoo
127.0.0.1:8069:8069Truy cập từ chính máy host; chưa phải địa chỉ cho máy khác truy cập
db-dataGiữ dữ liệu PostgreSQL tại đường dẫn dành cho image postgres:16
odoo-dataGiữ filestore và dữ liệu ứng dụng trong /var/lib/odoo
odoo.conf:roỨng dụng đọc file cấu hình do bạn quản lý từ máy host

Database postgres trong phần POSTGRES_DB là database ban đầu để kết nối PostgreSQL, không phải tên database nghiệp vụ bạn sẽ chọn trong màn hình Odoo. Tên anphu_lab sẽ được tạo ở bước tiếp theo. Mật khẩu PostgreSQL chỉ được dùng để khởi tạo trên volume trống; sửa .env sau khi database đã tồn tại không tự đổi mật khẩu của tài khoản PostgreSQL.

Khởi động và tạo database An Phú

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=80 odoo

Lệnh config kiểm tra cấu hình Compose, không chứng minh ứng dụng đã hoạt động. Lệnh up tải image nếu cần và chạy dịch vụ ở nền. Trong ps, PostgreSQL cần healthy, còn Odoo cần đang chạy. Đọc log để phân biệt lúc ứng dụng đang khởi động với lỗi kết nối database. Thời gian tải phụ thuộc mạng và máy, không nên kỳ vọng mọi máy hoàn tất trong vài giây.

Mở http://localhost:8069 trên chính máy chạy Docker. Tại màn hình tạo database, dùng master password đã đặt trong odoo.conf; đặt database name là anphu_lab; tự chọn email quản trị và mật khẩu đăng nhập. Chọn quốc gia Việt Nam và ngôn ngữ bạn muốn học. Để tình huống dễ theo dõi, không nạp dữ liệu demo nếu màn hình có lựa chọn đó.

Nếu chạy Docker trên máy chủ từ xa, localhost trong trình duyệt của bạn là máy của bạn, không phải máy chủ. Cấu hình lab đang giới hạn loopback; cần cơ chế truy cập phù hợp như SSH tunnel khi học từ xa, thay vì mở rộng cổng và coi đó là triển khai production. Bài này tập trung môi trường cục bộ.

Làm quen ứng dụng và thiết lập công ty

Vai trò của các ứng dụng Odoo trong doanh nghiệp nội thất
Mỗi bộ phận có công việc riêng nhưng cần dùng dữ liệu thống nhất: khách hàng, sản phẩm, đơn hàng và chứng từ.

Sau khi đăng nhập, cập nhật tên công ty thành Nội thất An Phú, kiểm tra quốc gia, múi giờ và đơn vị tiền tệ. Khi chuẩn bị cho hai bài tiếp theo, cài CRM và Sales từ danh sách ứng dụng. Ứng dụng có thể kéo theo các module phụ thuộc; đó là lý do số module trong hệ thống có thể nhiều hơn số ứng dụng bạn chủ động chọn.

Đừng cài tất cả mọi thứ ngay lập tức. Mỗi ứng dụng thêm màn hình, thiết lập và quy tắc cần hiểu. Bắt đầu bằng khách hàng và bán hàng giúp bạn nắm luồng dữ liệu trước khi nối sang mua hàng, kho và sản xuất. Với một ứng dụng yêu cầu nâng cấp hoặc gói bổ sung, cần kiểm tra phạm vi trước khi dùng làm điều kiện bắt buộc cho bài học.

Dừng, chạy lại và hiểu giới hạn của volume

Minh họa bảo toàn dữ liệu khi thay đổi môi trường ứng dụng Odoo
Dữ liệu cần được giữ độc lập với phiên chạy ứng dụng và có bản sao lưu phù hợp. Đây là hình minh họa khái niệm.

Tạo một hồ sơ khách giả lập tên Công ty Minh Khôi trong khu vực quản lý khách hàng, lưu lại rồi thử dừng và chạy lại stack:

docker compose stop
docker compose start

Đăng nhập lại anphu_lab và tìm hồ sơ vừa tạo. Nếu hồ sơ vẫn còn, bạn đã kiểm tra một vòng đời dừng và khởi động. Khi dùng docker compose down rồi up -d với cùng dự án và các named volume, dữ liệu cũng được giữ nếu không xóa volume. Không thêm tùy chọn -v khi muốn giữ dữ liệu. Sao lưu đúng cần quan tâm đồng thời database và filestore, đồng thời thử khôi phục; series sẽ không đánh đồng volume với backup.

Những lỗi thường gặp và cách đọc đúng

Hiện tượngĐiểm cần kiểm tra
Trình duyệt không mở được OdooDocker có chạy không, container có Up không, bạn có mở trên đúng máy host không?
Port is already allocatedCổng 8069 đã có dịch vụ; nếu đổi, sửa cổng phía host và URL truy cập tương ứng
Password authentication failedPASSWORD của Odoo có khớp tài khoản trong database hiện hữu không?
Odoo liên tục khởi động lạiĐọc log ứng dụng, kiểm tra file odoo.conf tồn tại và đúng cú pháp
Không thấy dữ liệu đã tạoĐang mở đúng database anphu_lab và dùng lại đúng project, volume chưa?
Tạo database bị từ chốiMaster password có khớp admin_passwd trong file cấu hình không?

Môi trường đạt mục tiêu khi bạn mở được Odoo, đăng nhập database An Phú, thấy CRM và Sales, và tìm lại được hồ sơ sau khi chạy lại. Cấu hình trong bài là hướng dẫn lab được đối chiếu tài liệu chính thức; không phải kết quả benchmark hay cấu hình production. Khi đưa vào vận hành cần thiết kế thêm sao lưu, quyền, HTTPS và giám sát phù hợp.

Tài liệu tham khảo

Comments are closed!

Scroll to Top