TDShift · Kiến thức

Hướng dẫn triển khai Odoo trên TDShift Mini PaaS từ A đến Z

22 Tháng 10, 2026

TDShift Mini PaaS hỗ trợ tạo một dự án Odoo 18 Community với PostgreSQL 17 riêng, định tuyến HTTPS qua Traefik và quản lý ứng dụng bằng portal. Hướng dẫn dưới đây được biên soạn dựa trên mã nguồn GitLab TDShift PaaS tại thời điểm viết. Các bước cấu hình hệ thống dành cho người quản trị server; phần tạo Odoo dùng portal dành cho người dùng.

Trước khi bắt đầu: đây là bản Mini PaaS đang phát triển, chưa bảo đảm cách ly an toàn cho nhiều khách hàng không tin cậy. Không sử dụng làm dịch vụ public multi-tenant cho khách hàng thật nếu chưa bổ sung bảo mật, backup và giám sát.

1. Kiến trúc Odoo trên TDShift

Một project Odoo được cấp container Odoo 18 Community và PostgreSQL 17. Database có tên appdb, chỉ truy cập trên Docker network nội bộ của project. Odoo kết nối Traefik qua mạng edge để phục vụ HTTPS. Database và filestore sử dụng volume riêng, nên không mất dữ liệu chỉ vì khởi động lại container.

2. Chuẩn bị server Ubuntu

Cần Linux/Ubuntu, Docker Engine, Docker Compose v2, Python 3.10+, địa chỉ IP public và quyền quản lý DNS. Kiểm tra công cụ trước khi chạy:

docker --version
docker compose version
python3 --version
docker ps
sudo ss -lntp | grep -E ':80 |:443 |:5050 |:5432 ' || true

Traefik của repository sử dụng cổng 80 và 443 cho HTTP/HTTPS, 5050 cho endpoint bổ sung và 5432 cho định tuyến PostgreSQL khi được bật. Trên server đã có Nginx hoặc hệ thống khác, phải kiểm tra xung đột port trước khi chạy. Không mở cổng database ra Internet nếu không thực sự cần.

3. Clone repository và thiết lập Traefik

git clone [email protected]:trandangtuan203/paas.git
cd paas
cp .env.example .env
nano .env
mkdir -p certs dynamic tenants
touch certs/acme.json
chmod 600 certs/acme.json

Đặt ACME_EMAIL là email thật để nhận thông tin chứng chỉ TLS. Nếu server đang chạy dự án, không xóa hay ghi đè .env, .portal, tenants hoặc volume Docker. Trong chế độ server, cấu hình ví dụ:

[email protected]
PAAS_MODE=server
PORTAL_PUBLIC_DOMAIN=app.tdshift.info
PROJECT_BASE_DOMAIN=tdshift.info

Chọn domain đúng với hệ thống đang triển khai. Biến PORTAL_PUBLIC_DOMAIN là portal quản lý; PROJECT_BASE_DOMAIN dùng tạo hostname project. Dùng giá trị DNS thực tế, không copy domain mẫu nếu bạn không sở hữu nó.

4. Cấu hình DNS và chứng chỉ HTTPS

Tạo bản ghi A cho app.tdshift.info và wildcard *.tdshift.info trỏ đến IP server (trong trường hợp đúng là domain bạn đang vận hành). Theo README, hãy để DNS only trong giai đoạn cấp chứng chỉ để Traefik xử lý Let’s Encrypt HTTP-01. Bảo đảm TCP 80/443 tới đúng server. Nếu dùng Cloudflare proxy hoặc Nginx đang chiếm port, cần điều chỉnh kiến trúc routing thay vì chạy hai proxy cùng chiếm cổng.

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 traefik

Lưu ý: các lệnh này chạy gateway, không tự động cấu hình systemd cho portal trên một server mới.

5. Khởi động portal quản lý

Nếu đang chạy local demo trên máy phát triển, dùng script theo repository:

./local-start.sh
./portal-start.sh

Portal local mở tại http://localhost:8000. Có thể cần chấp nhận chứng chỉ tự ký cho hostname *.localhost; chỉ dùng cách này khi thử nghiệm.

Nếu là server đã triển khai portal bằng systemd theo tài liệu repository, cập nhật mã và khởi động lại dịch vụ:

git pull --ff-only origin main
.venv/bin/pip install -r requirements.txt
sudo systemctl restart paas-portal
sudo systemctl status paas-portal --no-pager
sudo journalctl -u paas-portal -n 100 --no-pager

Những lệnh systemd trên chỉ áp dụng khi đã có service paas-portal cấu hình đúng user, working directory và cổng backend. Repo không tự tạo đầy đủ service chỉ với docker compose up. Nếu đang đổi portal sang app.tdshift.info, phải cập nhật cả route Traefik portal theo tài liệu chuyển domain.

6. Đăng ký tài khoản và tạo project Odoo

  1. Truy cập portal của bạn, ví dụ app.tdshift.info khi đã cấu hình thành công.
  2. Đăng ký hoặc đăng nhập tài khoản.
  3. Trong dashboard, chọn loại project Odoo.
  4. Nhập tên project để dễ quản lý, sau đó nhấn Tạo project.
  5. Chờ trạng thái từ Đang khởi tạo sang Sẵn sàng. Portal tạo container Odoo, PostgreSQL, database và tài khoản quản trị.
  6. Mở trang chi tiết project và nhấn Mở Odoo.

Đối với project Odoo do portal tạo, login Odoo là email của chủ project, mật khẩu được cấp riêng và hiển thị ở trang chi tiết. Đây không phải mật khẩu portal. Nếu đổi mật khẩu trực tiếp bên trong Odoo, mật khẩu cũ từng hiển thị trên portal sẽ không tự cập nhật.

Hai cách triển khai Odoo: template và Docker image có sẵn

Quan trọng: TDShift không giới hạn việc triển khai ở Odoo 18. Nút Odoo 18 Community trong màn hình Tạo project là mẫu cài đặt nhanh, đi kèm PostgreSQL 17 và bước khởi tạo tự động. Khi muốn dùng image Odoo phiên bản khác, image tùy chỉnh hoặc nhiều service, có thể chọn loại project Git Compose và cấu hình triển khai từ image Docker có sẵn. Việc hỗ trợ một phiên bản Odoo cụ thể tùy thuộc image, PostgreSQL, addons và cấu hình của chính bạn.

Cách A: Tạo Odoo 18 Community bằng template

  1. Trong Dashboard, chọn Odoo 18 Community.
  2. Đặt tên project và bấm Tạo project.
  3. Portal tự chuẩn bị Odoo 18, PostgreSQL 17, database appdb và tài khoản quản trị.
  4. Mở URL Odoo và kiểm tra đăng nhập, filestore, Apps.

Cách B: Triển khai Odoo bằng Docker image có sẵn

  1. Chuẩn bị image Odoo mong muốn, ví dụ image từ Docker Hub hay GitLab Container Registry. Kiểm tra tính tương thích trước khi dùng.
  2. Trong TDShift, tạo project loại Git Compose.
  3. Mở phần triển khai từ Docker image có sẵn nếu muốn chạy image web đơn lẻ, hoặc Compose nhiều services để khai báo Odoo và PostgreSQL cùng nhau.
  4. Đối với Odoo, nên chọn cấu hình Compose nhiều services với database nội bộ và volume bền vững.
  5. Chọn đúng tên web service (ví dụ odoo), internal port 8069 và health path phù hợp như /web/login, rồi triển khai.
  6. Kiểm tra trạng thái, log, URL HTTPS và tiến hành khởi tạo/cấu hình database theo cách image đã lựa chọn hỗ trợ.

Ví dụ cấu hình tham khảo dưới đây dùng hai image đã build. Hãy đổi tag version theo image mà bạn đã thử nghiệm và cấp password qua phương thức secrets/biến môi trường an toàn của project. Mẫu minh họa này không chứa mật khẩu thật và chưa thể chạy thành công nếu chưa bổ sung giá trị credential.

services:
  db:
    image: postgres:17
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: odoo
      POSTGRES_PASSWORD: CHANGE_ME_SECURELY
    volumes:
      - type: volume
        source: db_data
        target: /var/lib/postgresql/data
    networks:
      - private
  odoo:
    image: odoo:18.0
    depends_on:
      - db
    environment:
      HOST: db
      USER: odoo
      PASSWORD: CHANGE_ME_SECURELY
    volumes:
      - type: volume
        source: odoo_data
        target: /var/lib/odoo
    networks:
      - private
volumes:
  db_data: {}
  odoo_data: {}
networks:
  private:
    driver: bridge

TDShift hiện kiểm tra Compose khá chặt: mỗi service phải có image có sẵn, hỗ trợ named volumes theo long syntax; không cho phép build, bind mount host, privileged hoặc public ports tùy ý trong đường deploy stack này. Service web sẽ được nối vào Traefik bởi nền tảng. Do đó hãy xác minh trong giao diện trường Compose và biến môi trường, không copy cấu hình Docker Compose bất kỳ vào production mà không kiểm tra.

Docker image đơn lẻ khác Compose nhiều services thế nào?

Luồng image đơn lẻ dùng file image và internal port để chạy một service web, phù hợp khi PostgreSQL đã được quản lý bên ngoài. Luồng Compose nhiều services tạo stack Odoo + PostgreSQL cùng nhau, thuận tiện hơn cho triển khai độc lập. Image private cần cấu hình quyền truy cập registry trước khi pull; nên pin digest để đảm bảo tái lập phiên bản.

Lưu ý: Các bước này dựa trên image_deploy.py và stack_deploy.py của repo Mini PaaS. Phiên bản Odoo 18 trong màn hình template không phản ánh giới hạn của luồng Docker image.

7. Cấu hình Odoo lần đầu

  1. Đăng nhập bằng tài khoản và mật khẩu Odoo do project cấp.
  2. Vào Apps và cài module cần dùng, chẳng hạn CRM, Sales, Inventory hoặc Contacts.
  3. Vào Settings để cấu hình doanh nghiệp, múi giờ, ngôn ngữ và email gửi đi nếu cần.
  4. Kiểm tra tạo bản ghi thử và đăng xuất/đăng nhập lại.
  5. Đổi mật khẩu quản trị theo quy trình nội bộ và lưu an toàn bằng trình quản lý mật khẩu.

8. Cài đặt custom addons

Repository mô tả đường dẫn tenants/<project>/addons dành cho quản trị server. Tên <project> là mã project do portal tạo, không nhất thiết trùng tên hiển thị.

cd ~/paas
ls tenants
mkdir -p tenants/<project-code>/addons
# Chép module tùy chỉnh vào thư mục addons thực tế
docker compose -f tenants/<project-code>/compose.yml 
  --env-file tenants/<project-code>/.env restart

Kiểm tra file Compose được sinh ra để xác định mount addons và tên service trước khi restart. Quay về Odoo, bật Developer Mode nếu cần, cập nhật danh sách ứng dụng và cài module. Việc cập nhật mã addon không tự động nâng cấp module Odoo; sau khi thay đổi model/data/XML, hãy chạy upgrade theo quy trình phù hợp.

9. Kết nối GitLab để cập nhật source

Tại trang chi tiết project, sử dụng phần Cập nhật mã nguồn từ GitLab, khai báo repository, branch và các giá trị hỗ trợ theo UI. Với repo private, thêm Deploy Key có quyền đọc do project cung cấp. Kiểm tra đường dẫn Compose, cách sử dụng image hay build và bấm Pull và triển khai mã nguồn để chạy thủ công trước.

Để bật auto deploy, vào Webhook GitLab — triển khai khi push, sao chép URL webhook và secret. Trong GitLab mở Settings → Webhooks, điền URL, secret, chọn Push events và nhánh cần theo dõi. Kiểm tra bằng Test → Push events; HTTP 202 nghĩa là đã được xếp chờ, không phải deploy đã thành công.

Cấu hình portal có thể cần:

PORTAL_PUBLIC_DOMAIN=app.tdshift.info
PAAS_AUTO_DEPLOY_WORKER=1
AUTO_DEPLOY_INTERVAL_SECONDS=60

Webhook Odoo cập nhật mã nguồn không thay cho thao tác nâng cấp module và backup database. Với Git Compose dùng build:, bản PaaS mới yêu cầu Build Worker tách biệt. Tham khảo hướng dẫn Build Worker trước khi mở build cho mã nguồn không tin cậy.

10. Backup và khôi phục

Phải sao lưu cả PostgreSQL và Odoo filestore. Kiểm tra tên volume/đường dẫn cụ thể trong Compose được sinh ra. Không dùng docker compose down -v nếu muốn giữ dữ liệu. Nên thực hành restore sang project staging trước khi thay đổi lớn hoặc nâng cấp Odoo.

# Xem service và volume hiện có
docker compose -f tenants/<project-code>/compose.yml 
  --env-file tenants/<project-code>/.env ps
docker volume ls

Repo cung cấp chức năng xóa vĩnh viễn project trong portal. Hành động này có thể xóa cả database, filestore và volumes; chỉ thực hiện sau khi xác minh backup.

11. Kiểm tra sau khi triển khai

  • Trạng thái project trong portal là Sẵn sàng.
  • Odoo mở qua URL HTTPS đúng domain, không vòng lặp redirect.
  • Đăng nhập được và Apps hoạt động.
  • Tạo bản ghi thử và tải attachment lên xuống thành công.
  • Database chỉ ở network nội bộ project.
  • Kiểm tra dung lượng volumes, backup và logs.

12. Xử lý lỗi thường gặp

Không truy cập được domain Odoo

Kiểm tra DNS A/wildcard, chứng chỉ, port 80/443, Traefik router và log của gateway. Container báo Ready chưa có nghĩa Internet đã vào được.

Project đứng ở trạng thái Đang khởi tạo hoặc Error

Vào trang chi tiết xem lỗi và nút Thử lại. Trên server kiểm tra log portal sudo journalctl -u paas-portal -n 100 --no-pager và trạng thái Compose của project. Không xóa volumes để xử lý lỗi khởi tạo.

Odoo không kết nối PostgreSQL

Kiểm tra container PostgreSQL, credentials, network nội bộ và log; tránh public port 5432 chỉ để khắc phục lỗi kết nối nội bộ.

Đã pull code nhưng Odoo chưa đổi

Kiểm tra image có thật sự mới, mount addons và quá trình deploy. Nếu thay đổi module, cần cập nhật ứng dụng/upgrade module tương ứng; push source không tự nâng cấp database.

GitLab webhook trả về 403, 409 hoặc 202

403: kiểm tra secret hoặc trạng thái webhook. 409: project chưa sẵn sàng. 202: event vào hàng đợi; theo dõi worker và trạng thái deploy. Xem tài liệu webhook chính thức trong repo.

13. Những giới hạn cần biết trước khi đưa production

Repository tự ghi rõ shared edge network chưa đủ để cách ly khách hàng không tin cậy. Build Worker hiện cũng chưa phải sandbox an toàn hoàn chỉnh. Cần bổ sung hạn mức tài nguyên, isolation, secret management, backup, audit, giám sát và quy trình phục hồi trước khi thương mại hóa.

Kết luận

TDShift Mini PaaS giúp thử nghiệm triển khai Odoo 18 Community và PostgreSQL 17 theo mô hình project quản lý tập trung. Bắt đầu trên local, kiểm tra DNS/HTTPS và dữ liệu, sau đó triển khai có kiểm soát trên server riêng. Đọc thêm GitLab auto deploy và tính năng Mini PaaS.

← Tất cả hướng dẫn Khám phá ứng dụng →