Hướng Dẫn Cài Đặt Odoo 16 CRM Và PostgreSQL Bằng Docker Trên Ubtuntu 24.04
Odoo là gì?
Về cơ bản, Odoo là một phần mềm Quản lý Nguồn lực Doanh nghiệp (ERP - Enterprise Resource Planning) toàn diện. Điểm ăn tiền lớn nhất của Odoo nằm ở cấu trúc Module hóa (Modular architecture).
Thay vì doanh nghiệp phải mua phần mềm kế toán riêng, phần mềm quản lý kho riêng, rồi lại chật vật tìm cách kết nối dữ liệu giữa chúng, thì Odoo gom tất cả lại thành các "ứng dụng" (Apps) chạy chung trên một nền tảng và dùng chung một cơ sở dữ liệu. Cần dùng tính năng nào, chỉ việc tải module đó về cài đặt.
Các chức năng cốt lõi của Odoo
Một hệ thống Odoo khi được triển khai đầy đủ có thể bao hàm hàng chục phân hệ khác nhau. Tuy nhiên, dưới đây là những nhóm chức năng phổ biến nhất mà anh em IT thường phải hỗ trợ người dùng cuối:
-
CRM (Quản lý quan hệ khách hàng) & Sales: Đây là "trái tim" của khối kinh doanh. Module này giúp theo dõi vòng đời khách hàng, từ lúc còn là một tệp Lead (đổ về từ Email/Website), chuyển thành cơ hội kinh doanh (Opportunity), cho đến khi tự động xuất báo giá (Quotation) và chốt sale.
-
HRM (Quản trị nhân sự): Quản lý toàn bộ hồ sơ nhân viên, tích hợp chấm công, duyệt đơn nghỉ phép nhiều cấp và tự động hóa bảng lương hàng tháng.
-
Accounting (Kế toán & Tài chính): Theo dõi công nợ, quản lý hóa đơn (Invoicing), kiểm soát dòng tiền thu/chi. Nhiều doanh nghiệp sử dụng Odoo để quản trị nội bộ song song với phần mềm Misa.
-
Inventory & MRP (Kho bãi & Sản xuất): Theo dõi số lượng hàng tồn kho theo thời gian thực, quản lý đa kho, quản lý mã vạch và lên kế hoạch nguồn lực sản xuất.
Cài Đặt Odoo 16 CRM Và PostgreSQL Bằng Docker
Hướng dẫn này áp dụng chuẩn nhất cho hệ điều hành Ubuntu Server (22.04 LTS hoặc 24.04 LTS) - hệ điều hành tối ưu và phổ biến nhất để chạy Docker.
Bước 1: Kết Nối VPS Và Cập Nhật Hệ Thống
Trước khi cài đặt bất kỳ phần mềm nào, bạn cần cập nhật các gói ứng dụng của hệ điều hành lên phiên bản mới nhất để đảm bảo tính bảo mật và ổn định.
-
Mở Terminal trên máy tính của bạn và kết nối vào VPS qua SSH:
ssh root@IP_CỦA_VPS -
Cập nhật danh sách gói cứu trợ và nâng cấp hệ thống:
apt update && apt upgrade -y
Bước 2: Cài Đặt Docker Và Docker Compose (Cập Nhật Mới Nhất)
Vì đây là VPS mới tinh, bạn cần cài đặt Docker Engine và plugin Docker Compose từ kho lưu trữ chính thức của Docker.
-
Cài đặt các gói bổ trợ cần thiết:
apt install -y ca-certificates curl gnupg lsb-release -
Thêm khóa GPG chính thức của Docker:
sudo fold -s /etc/apt/keyrings || sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -
Thiết lập kho lưu trữ (Repository) cho Docker:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -
Cài đặt Docker Engine, Docker CLI và Docker Compose Plugin:
apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -
Kiểm tra xem Docker đã hoạt động chưa:
systemctl status docker(Bấm
qđể thoát nếu màn hình trạng thái hiển thịactive (running)).

Bước 3: Cấu Hình Không Gian Làm Việc Và File Docker Compose
Chúng ta sẽ tạo một thư mục riêng để quản lý dự án CRM này nhằm tránh việc các file cấu hình bị lẫn lộn vào hệ thống.
-
Tạo thư mục và di chuyển vào trong:
mkdir -p ~/odoo-crm-lab cd ~/odoo-crm-lab -
Tạo và chỉnh sửa file
docker-compose.yml:nano docker-compose.yml -
Copy và paste toàn bộ nội dung cấu hình chuẩn dưới đây vào file:
version: '3.8' services: db: image: postgres:15 container_name: odoo_db environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=crm_secure_password_2026 # Hãy thay đổi mật khẩu này - POSTGRES_USER=odoo volumes: - odoo-db-data:/var/lib/postgresql/data restart: always odoo: image: odoo:16 container_name: odoo_app depends_on: - db ports: - "8069:8069" environment: - HOST=db - USER=odoo - PASSWORD=crm_secure_password_2026 # Phải trùng với mật khẩu DB ở trên volumes: - odoo-web-data:/var/lib/odoo restart: always volumes: odoo-db-data: odoo-web-data: -
Lưu và thoát file: Nhấn
Ctrl + O->Enterđể lưu, sau đó nhấnCtrl + Xđể thoát khỏi trình soạn thảo nano.

Bước 4: Khởi Chạy Hệ Thống CRM
Khi file cấu hình đã sẵn sàng, việc kích hoạt toàn bộ hạ tầng chỉ tốn đúng một dòng lệnh.
-
Khởi chạy các container dưới dạng chạy ngầm (Detached mode):
docker compose up -d
-
Kiểm tra trạng thái hoạt động của các container:
docker psBạn sẽ thấy cả hai container
odoo_appvàodoo_dbđều đang ở trạng tháiUp.

Bước 5: Thiết Lập Giao Diện Odoo CRM Ban Đầu
-
Mở trình duyệt web (Chrome, Firefox, Safari) và truy cập đường dẫn:
http://IP_CỦA_VPS:8069
-
Hệ thống sẽ hiển thị trang cấu hình cơ sở dữ liệu đầu tiên:
-
Master Password: Mật khẩu tối cao để quản lý các database (Odoo tự sinh ra hoặc bạn tự điền, hãy lưu lại kỹ).
-
Database Name: Đặt tên cho cơ sở dữ liệu công ty (Ví dụ:
company_crm). -
Email / Password: Tài khoản và mật khẩu dùng để đăng nhập vào quản trị CRM sau này.
-
Demo data: Tích chọn ô này. Hệ thống sẽ tự động tạo dữ liệu khách hàng, biểu đồ ảo để bạn thực hành lab dễ dàng hơn mà không mất công tự nhập liệu từ đầu.
-
-
Nhấn Create Database và đợi khoảng 1-2 phút để hệ thống khởi tạo. Khi hoàn tất, bạn tiến hành cài đặt module CRM hoặc Sales ngay tại kho ứng dụng tích hợp sẵn của Odoo.

Cấu hình Nginx làm Reverse Proxy và cài đặt SSL
Việc này sẽ giấu port 8069 đi, giúp hệ thống trông chuyên nghiệp và bảo mật hơn rất nhiều khi chạy thực tế.
Ví dụ, nếu bạn định sử dụng tên miền cá nhân của mình, chúng ta có thể cấu hình một subdomain như crm.quyenlt.com để trỏ vào hệ thống này. Dưới đây là các bước thực hiện trực tiếp trên VPS Ubuntu:
Bước 1: Trỏ tên miền (Domain) về VPS
Trước khi cấu hình trên server, bạn cần truy cập vào trang quản lý DNS của tên miền (nơi bạn mua domain hoặc Cloudflare).
-
Tạo một bản ghi A (A Record).
-
Tên/Host:
crm(hoặc tên bất kỳ bạn muốn). -
Giá trị/IP: Điền địa chỉ IP VPS của bạn.
-
Lưu ý: Nếu dùng Cloudflare, hãy tạm tắt đám mây màu cam (Proxy status: DNS only) để cài SSL dễ dàng hơn.
Bước 2: Cài đặt Nginx và Certbot (Công cụ tạo SSL)
Quay lại Terminal của VPS, chạy lệnh sau để cài đặt Web Server và công cụ mã hóa chứng chỉ Let's Encrypt:
apt update
apt install -y nginx certbot python3-certbot-nginx
Bước 3: Viết cấu hình Nginx cho Odoo
Tạo một file cấu hình ảo (Virtual Host) dành riêng cho hệ thống CRM:
nano /etc/nginx/sites-available/odoo
Dán đoạn cấu hình chuẩn này vào. Nhớ thay crm.quyenlt.com bằng tên miền thực tế của bạn:
server {
listen 80;
server_name crm.quyenlt.com; # Thay bằng domain của bạn
# Ghi log để dễ debug
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
# Điều hướng traffic vào container Odoo
location / {
proxy_pass http://127.0.0.1:8069;
proxy_set_header 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;
# Hỗ trợ Websocket cho các tính năng realtime của Odoo
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
(Nhấn Ctrl+O -> Enter để lưu, và Ctrl+X để thoát).

Bước 4: Kích hoạt cấu hình và khởi động lại Nginx
Tạo một symlink (đường dẫn liên kết) để kích hoạt file cấu hình vừa tạo, sau đó kiểm tra lỗi và reload lại Nginx:
ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
(Nếu lệnh nginx -t báo syntax is ok và test is successful thì bạn đã làm đúng).
Bước 5: Cài đặt chứng chỉ bảo mật SSL (HTTPS)
Bây giờ, hãy dùng Certbot để cấp phát chứng chỉ SSL tự động. Lệnh này sẽ tự động đọc cấu hình Nginx và cấu hình HTTPS cho bạn:
certbot --nginx -d crm.quyenlt.com
Trong quá trình chạy, Certbot sẽ hỏi email của bạn (để thông báo khi SSL sắp hết hạn) và hỏi bạn có muốn đồng ý với điều khoản không (bấm Y).

Sau khi hoàn tất, bạn đã có thể mở trình duyệt và truy cập thẳng vào [https://crm.quyenlt.com](https://crm.quyenlt.com) một cách bảo mật, giống hệt như các hệ thống SaaS chuyên nghiệp.

Tự động hóa sao lưu dữ liệu (Automated Backup).
Trong môi trường quản trị hạ tầng và hosting, việc đảm bảo an toàn dữ liệu là yếu tố sống còn. Thay vì backup thủ công bằng tay, chúng ta sẽ viết một Bash script để tự động "chui" vào container PostgreSQL, trích xuất dữ liệu, nén lại, dọn dẹp các file cũ và lên lịch chạy mỗi đêm.
Bước 1: Tạo thư mục lưu trữ Backup
Bạn cần một nơi an toàn trên VPS để chứa các file backup sinh ra hàng ngày.
mkdir -p ~/odoo-crm-lab/backups
cd ~/odoo-crm-lab
Bước 2: Viết Bash Script sao lưu
Tạo một file script có tên pg_backup.sh nằm cùng cấp với file docker-compose.yml:
nano pg_backup.sh
Dán nội dung dưới đây vào file. Script này sẽ thực thi lệnh pg_dump trực tiếp thông qua Docker:
#!/bin/bash
# Khai báo các biến môi trường
BACKUP_DIR="/root/odoo-crm-lab/backups"
CONTAINER_NAME="odoo_db"
DB_USER="odoo"
DB_NAME="postgres"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
FILE_NAME="odoo_backup_$DATE.sql.gz"
# Lệnh backup database từ trong container ra ngoài VPS và nén lại
echo "Đang tiến hành sao lưu database: $DB_NAME..."
docker exec -t $CONTAINER_NAME pg_dump -U $DB_USER $DB_NAME | gzip > $BACKUP_DIR/$FILE_NAME
# Kiểm tra trạng thái backup
if [ $? -eq 0 ]; then
echo "Backup thành công: $FILE_NAME"
else
echo "Lỗi: Backup thất bại!"
exit 1
fi
# Xóa các file backup cũ hơn 7 ngày để tránh đầy ổ cứng
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -exec rm {} \;
echo "Đã dọn dẹp các file backup cũ hơn 7 ngày."
(Nhấn Ctrl+O -> Enter để lưu, và Ctrl+X để thoát).

Bước 3: Cấp quyền thực thi cho Script
Mặc định Linux không cho phép chạy các file text thông thường. Bạn cần cấp quyền thực thi (executable) cho file bash vừa tạo:
chmod +x pg_backup.sh
Bạn có thể chạy thử script ngay bây giờ để xem nó có hoạt động và sinh ra file nén .sql.gz trong thư mục backups không:
./pg_backup.sh
ls -lh backups/
Bước 4: Lên lịch tự động bằng Cronjob
Đây là lúc tự động hóa quy trình. Chúng ta sẽ cấu hình để VPS tự động chạy script này vào lúc 2:00 sáng mỗi ngày (thời điểm ít người truy cập hệ thống nhất).
Mở trình soạn thảo Cronjob:
crontab -e
(Nếu hệ thống hỏi chọn editor, hãy chọn 1 tương ứng với nano).
Di chuyển con trỏ xuống cuối file và thêm dòng sau:
0 2 * * * /root/odoo-crm-lab/pg_backup.sh > /root/odoo-crm-lab/backups/backup.log 2>&1
Lưu và thoát. Dòng cấu hình này có nghĩa là: Đúng 0 phút, 2 giờ sáng, mỗi ngày, mỗi tháng, mỗi năm, hệ thống sẽ chạy script và ghi lại log vào file backup.log để bạn dễ dàng kiểm tra.
Đến đây, bạn đã hoàn thành một chu trình khép kín: Triển khai Container -> Cấu hình Network/Security -> Tự động hóa Vận hành
Các bước restore dữ liệu
Để khôi phục bản backup .sql.gz vào lại container PostgreSQL một cách sạch sẽ nhất, bạn thực hiện theo các bước sau:
Bước 1: Tìm bản backup mới nhất
Di chuyển vào thư mục chứa dự án và liệt kê các file backup đang có:
cd ~/odoo-crm-lab
ls -lh backups/
Giả sử bản backup bạn muốn khôi phục có tên là odoo_backup_2026-07-10_02-00-00.sql.gz.
Bước 2: Dừng container Odoo
Bạn bắt buộc phải dừng ứng dụng CRM lại trước khi restore. Nếu không, trong lúc bạn đang đổ dữ liệu cũ vào, Odoo vẫn tiếp tục ghi đè dữ liệu mới lên sẽ gây ra xung đột (conflict).
docker stop odoo_app
(Lúc này chỉ có container odoo_app bị dừng, còn container odoo_db vẫn chạy để ta tương tác).
Bước 3: Giải nén file backup
Lệnh pg_dump trước đó xuất ra file nén (.gz). Ta cần giải nén nó ra thành file .sql để PostgreSQL có thể đọc được.
# Lệnh gunzip -k sẽ giải nén và vẫn giữ lại file .gz gốc cho an toàn
gunzip -k backups/odoo_backup_2026-07-10_02-00-00.sql.gz
Bây giờ bạn sẽ có một file odoo_backup_2026-07-10_02-00-00.sql nằm trong thư mục backups/.
Bước 4: Làm sạch Database hiện tại
Để tránh việc dữ liệu mới bị trộn lẫn với dữ liệu lỗi cũ, cách tốt nhất là "dọn sạch" cấu trúc (schema) hiện tại của database trước khi đổ dữ liệu vào. Chạy lệnh sau để xóa trắng dữ liệu trong database postgres của container:
docker exec -it odoo_db psql -U odoo -d postgres -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
Bước 5: Tiến hành Restore (Bơm dữ liệu vào)
Sử dụng lệnh cat để đọc nội dung file .sql và đẩy (pipe) thẳng vào container odoo_db. Lưu ý: Chữ odoo_db là tên container, odoo là tên user DB, postgres là tên DB.
cat backups/odoo_backup_2026-07-10_02-00-00.sql | docker exec -i odoo_db psql -U odoo -d postgres
(Quá trình này mất vài giây đến vài phút tùy thuộc vào dung lượng database của bạn. Sẽ có rất nhiều dòng thông báo chạy trên màn hình, đó là chuyện bình thường).
Bước 6: Khởi động lại Odoo và Dọn dẹp
Sau khi dữ liệu đã được nạp xong, hãy bật lại ứng dụng Odoo:
docker start odoo_app
Cuối cùng, xóa file .sql vừa giải nén để tránh làm đầy ổ cứng (vì ta đã có file gốc .gz rồi):
rm backups/odoo_backup_2026-07-10_02-00-00.sql
Bây giờ bạn có thể truy cập lại vào tên miền hoặc IP để kiểm tra. Hệ thống đã được quay ngược thời gian (rollback) về đúng thời điểm bạn tạo file backup đó.
Để có thể quản trị với vai trò admin bạn cần thêm
?debug=1vào sau URL như sau : https://crm.quyenlt.com/web?debug=1

Kết Luận
Việc triển khai thành công một hệ thống quản trị doanh nghiệp như Odoo CRM không chỉ dừng lại ở việc làm cho phần mềm "chạy lên được". Thông qua bài viết này, chúng ta đã cùng nhau giải quyết những bài toán cốt lõi nhất của một System Administrator khi đưa hệ thống ra môi trường thực tế (Production-Ready):
-
Triển khai theo hướng hiện đại: Ứng dụng Docker và Docker Compose để cô lập môi trường, giúp quản lý cấu hình mượt mà và không làm "rác" hệ điều hành gốc của máy chủ.
-
Bảo mật & Tối ưu mạng: Sử dụng Nginx làm Reverse Proxy kết hợp với chứng chỉ SSL/HTTPS (Let's Encrypt) để giấu port gốc và mã hóa toàn bộ luồng dữ liệu truy cập.
-
Tự động hóa vận hành: Chủ động viết Bash script và thiết lập Cronjob để hệ thống tự động dump database, nén file và dọn dẹp hàng ngày – bảo vệ an toàn tuyệt đối cho dữ liệu của doanh nghiệp.
