Cài đặt Odoo 15 trên Ubuntu 20.04 LTS

Odoo là phần mềm kinh doanh all-in-one phổ biến nhất trên thế giới. Để cài đặt Odoo 15 trên Ubuntu 20.04, bạn chỉ cần làm theo các bước sau.
Cài đặt Odoo trong môi trường ảo hoặc triển khai dưới dạng vùng chứa Docker, cho phép bạn kiểm soát ứng dụng nhiều hơn và cho phép bạn chạy nhiều phiên bản Odoo trên cùng một hệ thống.
Bài viết này hướng dẫn cài đặt và triển khai Odoo 15 bên trong môi trường Python virtual trên Ubuntu 20.04. Chúng tôi sẽ tải xuống Odoo từ kho lưu trữ GitHub chính thức và sử dụng Nginx làm proxy ngược.

Cài đặt Dependencies

Bước đầu tiên là cài đặt Git, Pip, Node.js và các công cụ cần thiết để xây dựng ứng dụng Odoo:

sudo apt update
sudo apt install git python3-pip build-essential wget python3-dev python3-venv \
    python3-wheel libfreetype6-dev libxml2-dev libzip-dev libldap2-dev libsasl2-dev \
    python3-setuptools node-less libjpeg-dev zlib1g-dev libpq-dev \
    libxslt1-dev libldap2-dev libtiff5-dev libjpeg8-dev libopenjp2-7-dev \
    liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev libxcb1-dev

Tạo user hệ thống

Chạy Odoo dưới quyền root tiềm ẩn nguy cơ bảo mật lớn. Nên sẽ tạo một user và group trong Ubuntu với thư mục /opt/odoo15

sudo useradd -m -d /opt/odoo15 -U -r -s /bin/bash odoo15

Bạn có thể tạo tùy chọn tên người dùng như thế nào cũng được, miễn là giống với tên người dùng của PostgreSQL 

Cài đặt và cấu hình PostgreSQL

Odoo sử dụng PostgreSQL làm cơ sở dữ liệu. PostgreSQL bao gồm trong kho Ubuntu repository. Việc cài đặt rất đơn giản:
sudo apt install postgresql

Sau khi chương trình được cài đặt, hãy tạo người dùng PostgreSQL có cùng tên với người dùng hệ thống đã tạo trước đó. Trong ví dụ này, đó là odoo15:

sudo su - postgres -c "createuser -s odoo15"

Cài đặt wkhtmltopdf

wkhtmltopdf là một bộ công cụ mã nguồn mở để hiển thị các trang HTML thành PDF và các định dạng hình ảnh khác nhau. Để in báo cáo PDF trong Odoo, bạn cần cài đặt gói wkhtmltox.

Phiên bản wkhtmltopdf có trong kho lưu trữ Ubuntu không hỗ trợ header và footer trong văn bản. Phiên bản được đề xuất cho Odoo là phiên bản 0.12.5. Chúng tôi sẽ tải xuống và cài đặt gói từ Github:

sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb

Sau khi tệp được tải xuống, hãy cài đặt tệp bằng cách gõ:

sudo apt install ./wkhtmltox_0.12.5-1.bionic_amd64.deb

Cài đặt và cấu hình Odoo 15

Chúng tôi sẽ cài đặt Odoo từ source bên trong môi trường ảo Python cô lập.
Đầu tiên, thay đổi user thành “odoo15”:

sudo su - odoo15

Clone mã nguồn Odoo 15 từ GitHub:

git clone https://www.github.com/odoo/odoo --depth 1 --branch 15.0 /opt/odoo15/odoo
cd /opt/odoo15
python3 -m venv odoo-venv

Kích hoạt môi trường làm việc của Odoo:

source odoo-venv/bin/activate

Cài đặt tất cả các mô-đun Python được yêu cầu với pip3 được chỉ định trong tệp tin request.txt:

pip3 install wheel
pip3 install -r odoo/requirements.txt

Nếu bạn gặp bất kỳ lỗi biên dịch nào trong quá trình cài đặt, hãy đảm bảo rằng tất cả các dependencies  bắt buộc được liệt kê trong phần "cài đặt dependencies" đã được cài đặt.

Sau khi hoàn tất, hãy hủy kích hoạt môi trường bằng cách nhập: deactivate 

Chúng tôi sẽ tạo một thư mục mới, một thư mục riêng cho các phần mềm hỗ trợ của bên thứ ba:

mkdir /opt/odoo15/odoo-custom-addons

Sau đó, chúng tôi sẽ thêm thư mục này vào tham số addons_path. Tham số này xác định danh sách các thư mục mà Odoo tìm kiếm các mô-đun.

Quay trở lại người dùng sudoexit

Tạo tệp cấu hình với nội dung sau:
  • :  sudo nano /etc/odoo15.conf 
  • Nhập nội dung:
[options]
; This is the password that allows database operations:
admin_passwd = my_admin_passwd
db_host = False
db_port = False
db_user = odoo15
db_password = False
addons_path = /opt/odoo15/odoo/addons,/opt/odoo15/odoo-custom-addons

Đừng quên thay đổi my_admin_passwd thành một thứ gì đó an toàn hơn.

Tạo tệp tin Systemd unit 

Tệp unit là tệp cấu hình kiểu ini chứa thông tin về một dịch vụ.
Mở trình soạn thảo văn bản của bạn và tạo một tệp có tên odoo15.service với nội dung sau:
  • Mở text editor: sudo nano /etc/systemd/system/odoo15.service
  • Nhập nội dung:
[Unit]
Description=Odoo15
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
SyslogIdentifier=odoo15
PermissionsStartOnly=true
User=odoo15
Group=odoo15
ExecStart=/opt/odoo15/odoo-venv/bin/python3 /opt/odoo15/odoo/odoo-bin -c /etc/odoo15.conf
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target
  • Nhấn Ctrl + X để lưu và thoát khỏi nano
Thông báo cho systemd rằng tồn tại một tệp unit mới: sudo systemctl daemon-reload
Khởi động dịch vụ Odoo và cho phép nó bắt đầu khi khởi động bằng cách chạy: 

sudo systemctl enable --now odoo15

Xác minh rằng dịch vụ đang hoạt động: sudo systemctl status odoo15

Output sẽ giống như bên dưới, cho thấy rằng dịch vụ Odoo đang hoạt động và đang chạy:

odoo15.service - Odoo15
     Loaded: loaded (/etc/systemd/system/odoo15.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-10-26 09:56:28 UTC; 28s ago
...

Bạn có thể kiểm tra các tin nhắn được ghi bởi dịch vụ Odoo bằng lệnh dưới đây:

sudo journalctl -u odoo15

Kiểm tra cài đặt

Mở trình duyệt của bạn và nhập: http://<your_domain_or_IP_address>: 8069

Giả sử cài đặt thành công, một màn hình tương tự như sau sẽ xuất hiện:



Cấu hình Nginx làm SSL Termination Proxy

Máy chủ web Odoo mặc định đang cung cấp lưu lượng truy cập qua HTTP. Để làm cho việc triển khai Odoo an toàn hơn, chúng tôi sẽ đặt Nginx làm  SSL termination proxy phân phát lưu lượng qua HTTPS.
SSL termination proxy là một máy chủ proxy xử lý mã hóa / giải mã SSL. Điều này có nghĩa là termination proxy (Nginx) sẽ xử lý và giải mã các kết nối TLS (HTTPS), đồng thời chuyển các yêu cầu chưa được mã hóa đến dịch vụ nội bộ (Odoo). Traffic giữa Nginx và Odoo sẽ không được mã hóa (HTTP).

Sử dụng reverse proxy mang lại cho bạn rất nhiều lợi ích như Load Balancing, SSL Termination, Caching, Compression, Serving Static Content, and hơn thế nữa.

Đảm bảo rằng bạn đã đáp ứng các điều kiện tiên quyết trước khi tiếp tục với phần này:
Mở trình soạn thảo văn bản của bạn và tạo:
sudo nano /etc/nginx/sites-enabled/example.com.conf

Cấu hình sau đây thiết lập SSL termination , chuyển hướng HTTP sang HTTPS, chuyển hướng WWW sang không WWW, lưu vào bộ nhớ cache các tệp tĩnh và bật tính năng nén GZip.

# Odoo servers
upstream odoo {
 server 127.0.0.1:8069;
}

upstream odoochat {
 server 127.0.0.1:8072;
}

# HTTP -> HTTPS
server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://example.com$request_uri;
}

# WWW -> NON WWW
server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    # Proxy headers
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    # SSL parameters
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # log files
    access_log /var/log/nginx/odoo.access.log;
    error_log /var/log/nginx/odoo.error.log;

    # Handle longpoll requests
    location /longpolling {
        proxy_pass http://odoochat;
    }

    # Handle / requests
    location / {
       proxy_redirect off;
       proxy_pass http://odoo;
    }

    # Cache static files
    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

    # Gzip
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

Đừng quên thay thế example.com bằng miền Odoo của bạn và đặt đường dẫn chính xác đến tệp chứng chỉ SSL. Các đoạn mã được sử dụng trong cấu hình này được tạo trong hướng dẫn này.

Khi bạn đã hoàn tất, hãy khởi động lại dịch vụ Nginx: sudo systemctl restart nginx

Tiếp theo, chúng tôi cần yêu cầu Odoo sử dụng proxy. Để làm như vậy, hãy mở tệp cấu hình và thêm dòng sau:
  • nano /etc/odoo15.conf
  • Thêm dòng: proxy_mode = True
  • Nhấn Ctrl + X để lưu và thoát
Khởi động lại dịch vụ Odoo để các thay đổi có hiệu lực: sudo systemctl restart odoo15

Tại thời điểm này, reverse proxy được định cấu hình và bạn có thể truy cập phiên bản Odoo của mình tại https://example.com.

Thay đổi Binding Interface

Bước này là tùy chọn, nhưng nó là một phương pháp bảo mật tốt.
Theo mặc định, máy chủ Odoo lắng nghe cổng 8069 trên tất cả các interface. Để vô hiệu hóa quyền truy cập trực tiếp vào cá thể Odoo, bạn có thể chặn cổng 8069 cho tất cả các interface công cộng hoặc buộc Odoo chỉ nghe trên interface cục bộ.

Chúng tôi sẽ định cấu hình Odoo để chỉ nghe trên 127.0.0.1. Mở cấu hình, thêm hai dòng sau vào cuối tệp:
  • nano /etc/odoo15.conf
  • Nhập dòng:
            xmlrpc_interface = 127.0.0.1
            netrpc_interface = 127.0.0.1

  • Nhấn Ctrl + X để lưu và thoát
Lưu tệp cấu hình và khởi động lại máy chủ Odoo để các thay đổi có hiệu lực: sudo systemctl restart odoo15

Kích hoạt đa xử lý (multiprocessing )

Theo mặc định, Odoo đang hoạt động ở chế độ đa luồng. Đối với triển khai sản xuất, bạn nên thay đổi sang máy chủ đa xử lý vì nó tăng tính ổn định và sử dụng tài nguyên hệ thống tốt hơn.

Để bật đa xử lý, bạn cần chỉnh sửa cấu hình Odoo và đặt số lượng  worker processes khác 0. Số lượng  worker được tính toán dựa trên số lượng lõi CPU trong hệ thống và bộ nhớ RAM khả dụng.

Theo tài liệu chính thức của Odoo, để tính toán số lượng workers và kích thước bộ nhớ RAM cần thiết, bạn có thể sử dụng các công thức và giả định sau:
  • Tính toán số worker:
Số worker tối đa theo lý thuyết = (system_cpus * 2) + 1
1 worker  có thể phục vụ ~ = 6 người dùng đồng thời
Cron worker cũng yêu cầu CPU
  • Tính toán kích thước bộ nhớ RAM
Chúng tôi sẽ xem xét rằng 20% tổng số request là request nặng và 80% là request nhẹ hơn. Các request nặng đang sử dụng khoảng 1 GB RAM trong khi các request nhẹ hơn đang sử dụng khoảng 150 MB RAM

RAM cần thiết = number_of_workers * ((light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * heavy_worker_ram_estimation))

Nếu bạn không biết mình có bao nhiêu CPU trên hệ thống của mình, hãy sử dụng lệnh grep sau: 
grep -c ^processor /proc/cpuinfo

Giả sử bạn có một hệ thống có 4 lõi CPU, bộ nhớ RAM 8 GB và 30 người dùng Odoo đồng thời.
  • 30 users / 6 = 5 (5 là số lượng worker cần thiết theo lý thuyết)
  • (4 * 2) + 1 = 9 ( 9 là số worker  tối đa theo lý thuyết)
Dựa vào phép tính trên, bạn có thể sử dụng 5  worker + 1 worker cho worker cron đó là tổng cộng 6 worker 

Tính toán mức tiêu thụ bộ nhớ RAM dựa trên số lượng worker: 
  • RAM = 6 * ((0.8*150) + (0.2*1024)) ~= 2 GB of RAM
Tính toán cho thấy cài đặt Odoo sẽ cần khoảng 2GB RAM.
Để chuyển sang chế độ đa xử lý, hãy mở tệp cấu hình và thêm vào các giá trị đã tính:
  • nano /etc/odoo15.conf
  • Thêm vào các nội dung:
        limit_memory_hard = 2684354560
        limit_memory_soft = 2147483648
        limit_request = 8192
        limit_time_cpu = 600
        limit_time_real = 1200
        max_cron_threads = 1
        workers = 5

Khởi động lại dịch vụ Odoo để các thay đổi có hiệu lực: sudo systemctl restart odoo15

Phần còn lại của tài nguyên hệ thống sẽ được sử dụng bởi các dịch vụ khác chạy trên hệ thống này. Trong hướng dẫn này, chúng tôi đã cài đặt Odoo cùng với PostgreSQL và Nginx trên cùng một máy chủ. Tùy thuộc vào thiết lập của bạn, bạn cũng có thể có các dịch vụ khác đang chạy trên máy chủ của mình.