Cài Odoo kiểu cũ: Nỗi ám ảnh mang tên “Dependency Hell”
Nếu bạn từng cài Odoo trực tiếp lên Ubuntu, chắc hẳn bạn đã nếm trải cảm giác thức trắng đêm vì xung đột thư viện. Odoo yêu cầu hàng tá gói hệ thống như libxml2 hay libxslt. Chỉ cần phiên bản Python lệch một chút là toàn bộ hệ thống ERP sẽ đình trệ ngay lập tức.
Mình từng mất gần 8 tiếng chỉ để xử lý lỗi wkhtmltopdf khi nâng cấp server. Với Docker, mọi thứ thay đổi hoàn toàn. Bạn chỉ cần một file cấu hình duy nhất để triển khai hệ thống lên bất kỳ server nào trong chưa đầy 5 phút.
Tại sao 1 container là không đủ?
Nhiều người mới thường nhồi nhét Odoo và PostgreSQL vào chung một Image (All-in-one). Đây là sai lầm chí mạng trong môi trường Production. Khi dữ liệu phình to lên hàng chục GB, việc backup và scale sẽ trở thành cơn ác mộng.
Mô hình Multi-container tách biệt các thành phần giúp hệ thống linh hoạt hơn nhiều. Dưới đây là bảng so sánh thực tế:
| Tiêu chí | All-in-one (Test) | Multi-container (Production) |
|---|---|---|
| Khả năng mở rộng | Gần như bằng 0 | Dễ dàng nâng cấp RAM cho DB hoặc thêm bản sao App |
| An toàn dữ liệu | Rủi ro cao | Database nằm trong network nội bộ, cô lập hoàn toàn |
| Tốc độ triển khai | Nhanh nhưng khó sửa | Chuẩn hóa, dễ dàng tích hợp CI/CD |
Thiết lập cấu trúc thư mục khoa học
Trước khi gõ lệnh, hãy chuẩn bị một bộ khung thư mục rõ ràng. Việc này giúp bạn quản lý các module custom và dữ liệu không bị lẫn lộn khi hệ thống lớn dần.
mkdir odoo-deployment && cd odoo-deployment
mkdir -p ./config ./addons ./data/postgres ./data/odoo
touch docker-compose.yml ./config/odoo.conf ./config/nginx.conf
addons/: Nơi lưu các module tùy chỉnh hoặc mua từ store.data/: Giữ lại toàn bộ hóa đơn, chứng từ ngay cả khi bạn xóa container.config/: Trái tim điều khiển toàn bộ tham số vận hành.
Xây dựng file Docker Compose chuẩn chỉnh
Dưới đây là cấu hình 3 dịch vụ: db (PostgreSQL 15), odoo (v17) và webserver (Nginx). Lưu ý cách chúng ta kết nối chúng qua một network riêng biệt.
version: '3.8'
services:
db:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo_password_secret
- POSTGRES_USER=odoo
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- odoo-nw
odoo:
image: odoo:17.0
depends_on:
- db
ports:
- "8069:8069"
volumes:
- ./data/odoo:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
- HOST=db
- USER=odoo
- PASSWORD=odoo_password_secret
networks:
- odoo-nw
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- odoo
networks:
- odoo-nw
networks:
odoo-nw:
driver: bridge
Mẹo nhỏ: Tham số depends_on cực kỳ quan trọng. Nó đảm bảo Database phải khởi động xong xuôi thì Odoo mới bắt đầu chạy, tránh lỗi kết nối ngay khi vừa start.
Cấu hình Nginx: Chìa khóa để chạy mượt HTTPS
Để Odoo nhận diện đúng địa chỉ IP người dùng, bạn bắt buộc phải bật proxy_mode = True trong file ./config/odoo.conf. Nếu quên dòng này, bạn sẽ gặp lỗi session liên tục khi dùng HTTPS.
[options]
admin_passwd = my_admin_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_password_secret
proxy_mode = True
Về phần Nginx, hãy chú ý cấu hình proxy_read_timeout. Các báo cáo Odoo nặng thường mất hơn 60 giây để xử lý. Nếu để mặc định, Nginx sẽ ngắt kết nối và trả về lỗi 504.
upstream odoo {
server odoo:8069;
}
server {
listen 80;
server_name your-domain.com;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
location / {
proxy_pass http://odoo;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Vận hành và kiểm tra
Kích hoạt toàn bộ hệ thống bằng một lệnh duy nhất:
docker-compose up -d
Sử dụng docker-compose ps để kiểm tra trạng thái. Nếu mọi thứ đều báo Up, bạn đã thành công. Khi cần debug các file cấu hình JSON dài dằng dặc, mình thường dùng JSON Formatter để kiểm tra lỗi cú pháp nhanh trên trình duyệt.
Kinh nghiệm thực tế để tránh “mất ngủ”
Sau nhiều dự án triển khai cho khách hàng, mình đúc kết được 3 quy tắc vàng giúp hệ thống chạy ổn định 24/7:
- Công thức tính Worker: Đừng để mặc định. Hãy dùng công thức
(số CPU core * 2) + 1. Một server 4 core nên để 9 workers để tối ưu hiệu năng. - Chiến lược Backup: Tuyệt đối không chỉ dựa vào Docker Volume. Hãy dùng
docker execđể dump file SQL mỗi đêm và đẩy lên S3 hoặc Google Drive. - Xử lý Real-time: Khi chạy multi-worker, bạn cần mở thêm port 8072 (Longpolling). Thiếu nó, các thông báo tin nhắn trong Odoo sẽ không hiển thị tức thời.
Dockerize Odoo không khó, cái khó là cấu hình sao cho chuẩn Production. Hy vọng hướng dẫn này giúp bạn xây dựng được hệ thống ERP mạnh mẽ và dễ quản lý.

