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 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 quan | Câu hỏi cần trả lời |
|---|---|---|
| Khách đang quan tâm | CRM | Ai phụ trách và lần tới cần làm gì? |
| Báo giá, đơn bán | Sales | Khách đồng ý mua mặt hàng nào, giá bao nhiêu? |
| Hàng hóa | Inventory | Có bao nhiêu hàng và đang ở đâu? |
| Mua nguyên liệu, hàng hóa | Purchase | Cần mua từ ai và khi nào nhận? |
| Chế tạo thành phẩm | Manufacturing | Cầ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

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: db | Odoo kết nối đến dịch vụ db trong mạng Compose, không phải localhost của container |
| service_healthy | Chờ PostgreSQL đạt healthcheck trước khi khởi động Odoo |
| 127.0.0.1:8069:8069 | Truy cập từ chính máy host; chưa phải địa chỉ cho máy khác truy cập |
| db-data | Giữ dữ liệu PostgreSQL tại đường dẫn dành cho image postgres:16 |
| odoo-data | Giữ 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

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

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 Odoo | Docker 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 allocated | Cổ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 failed | PASSWORD 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ối | Master 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.

Comments are closed!