Odoo là một ứng dụng kinh doanh mã nguồn mở – có thể giúp các công ty quản lý và triển khi kinh doanh hiệu quả. Nó bao gồm một loạt các ứng dụng như CRM, e-Comerce, website builder, hóa đơn điện tử, kiểm toán, sản xuất, quản lý kho hàng, quản lý dự án, quản lý hàng tồn kho – được tích hợp một cách liền mạch.
Odoo 14 có thể được cài đặt theo nhiều cách khác nhau – tùy thuộc vào thói quen và công nghệ hiện tại mà bạn đang sử dụng là gì. Cách dễ nhất và nhanh chóng nhất để cài đặt Odoo chính là thông qua sử dụng Odoo apt repository.
Cài đặt Odoo trong môi trường ảo hóa, hoặc triển khai dưới dạng docker container – cho phép bạn quản lý các ứng dụng và chạy nhiều instance Odoo khác nhau ngay trên cùng một hệ thống.
Trong bài viết này, mình sẽ giải thích cho bạn cách cài đặt và triển khai Odoo 14 trên môi trường python ảo hóa trên Ubuntu 20.04. Mình sẽ download Odoo từ repository chính thức trên github và sử dụng Nginx làm reverse proxy.
Hướng dẫn cài đặt
Câu lệnh dưới đây được sử dụng để cài đặt git, pip, nodejs và các công cụ để build 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 tài khoản system user
Chạy Odoo dưới tài khoản root không được cho phép vì rủi ro về mặt security khá lớn. Mình sẽ tạo một system user và có group với thư mục home /opt/odoo14 – được sử dụng để chạy dịch vụ Odoo 14.
$ sudo useradd -m -d /opt/odoo14 -U -r -s /bin/bash odoo14
Bạn có thể đặt tên user dùng bất cứ tên nào bạn muốn cũng được, miễn sao tạo tên user giống với user PostgreSQL là được.
Cài đặt và cấu hình PostgreSQL
Odoo sử dụng PostgreSQL để làm backend database. PostgreSQL có sẵn trong repository tiêu chuẩn của Ubuntu sẵn rồi, nên để cài đặt PostgreSQL, các bạn chỉ cần thực hiện chạy câu lệnh sau:
$ sudo apt install postgresql
Sau khi quá trình cài đặt đã hoàn thành, các bạn có thể tạo tài khoản PostgreSQL có cùng tên với tài khoản system user mà bạn đã tạo trước đó. Trong ví dụ này, tài khoản cần tạo là “odoo14”:
$ sudo su - postgres -c "createuser -s odoo14"
Cài đặt wkhtmltopdf
wkhtmltopdf là một tập các công cụ command-line mã nguồn mở phục vụ cho mục đích rendering các trang HTML sang dạng PDF và các định dạng hình ảnh phổ biến. Để in các trang report dạng PDF trong Odoo, bạn sẽ cần phải cài đặt package wkhtmltopdf. Phiên bản wkhtmltopdf mình khuyến nghị bạn là “0.12.5” – có thể được download từ github.
$ sudo wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb
Sau khi đã download file deb về rồi, cài đặt bằng câu lệnh sau:
$ sudo apt install ./wkhtmltox_0.12.6-1.bionic_amd64.deb
Hướng dẫn cài đặt và cấu hình Odoo 14
Mình sẽ cài đặt Odoo 14 trong môi trường tách biệt với “Python virtual environment“.
Đầu tiên, chuyển sang sử dụng user “odoo14“
$ sudo su - odoo14
Clone source code Odoo 14 từ github về:
$ git clone https://www.github.com/odoo/odoo --depth 1 --branch 14.0 /opt/odoo14/odoo
Tạo Python virtual environment cho Odoo14
$ cd /opt/odoo14
$ python3 -m venv odoo-venv
Active môi trường ảo hóa
$ source odoo-venv/bin/activate
Cài đặt các module python cần thiết với pip3
(venv) $ pip3 install wheel
(venv) $ pip3 install -r odoo/requirements.txt
Sau khi đã chạy xong các câu lệnh trên, để deactive môi trường ảo hóa, bạn có thể gõ câu lệnh sau:
(venv) $ deactivate
Tạo ra một thư mục mới để chứa các addons third-party.
$ mkdir /opt/odoo14/odoo-custom-addons
Mình sẽ thêm thư mục này vào tham số “addons_path“. Tham số này định nghĩa một danh sách các thư mục mà Odoo sẽ tìm kiếm để sử dụng các modules.
Switch qua sử dụng user root.
$ exit
Tạo file cấu hình với nội dung sau:
$ vi /etc/odoo14.conf
[options]
; This is the password that allows database operations:
admin_passwd = my_admin_passwd
db_host = False
db_port = False
db_user = odoo14
db_password = False
addons_path = /opt/odoo14/odoo/addons,/opt/odoo14/odoo-custom-addons
Tạo file unit systemd
Tạo file service systemd đặt tên là “odoo14.service” với nội dung sau đây:
$ vi /etc/systemd/system/odoo14.service
[Unit]
Description=Odoo14
Requires=postgresql.service
After=network.target postgresql.service
[Service]
Type=simple
SyslogIdentifier=odoo14
PermissionsStartOnly=true
User=odoo14
Group=odoo14
ExecStart=/opt/odoo14/odoo-venv/bin/python3 /opt/odoo14/odoo/odoo-bin -c /etc/odoo14.conf
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target
Reload daemon lại để thông báo cho systemd biết có file unit service mới.
$ sudo systemctl daemon-reload
Khởi chạy service Odoo và kích hoạt nó khi khởi động hệ thống.
$ sudo systemctl enable --now odoo14
Xác nhận lại trạng thái service xem nó đã chạy chưa
$ sudo systemctl status odoo14
Khi chạy câu lệnh trên, nếu bạn nhận được ouput có dạng như sau thì nghĩa là Odoo service đang active và running.
Output
odoo14.service - Odoo14
Loaded: loaded (/etc/systemd/system/odoo14.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-10-16 19:05:32 UTC; 3s ago
...
Để kiểm tra các mesages được log lại bởi Odoo, sử dụng câu lệnh dưới đây:
$ sudo journalctl -u odoo14
Kiểm tra việc cài đặt
Mở trình duyệt web của bạn lên, và truy cập vào địa chỉ có dạng như sau: http://localhost:8069
Giả sử quá trình cài đặt Odoo diễn ra bình thường và thành công thì bạn sẽ thấy màn hình máy tính của mình có dạng như sau:
Cấu hình Nghinx làm proxy server sử dụng SSL
Mặc định web service Odoo chỉ xử lý traffic thông qua giao thức HTTP. Để triển khai Odoo trở nên an toàn hơn, mình sẽ thiết lập Nginx thành proxy server sử dụng SSL để xử lý traffic thông qua https.
NginX Proxy server sẽ mã hóa và giải mã SSL, nghĩa là proxy (nginx) sẽ xử lý luồng traffic thông qua kênh kết nối TLS an toàn – đảm bảo dữ liệu được truyền tải trên internet của bạn sẽ không bị nghe trộm (man-in-the-middle). Khi sử dụng reverse proxy – sẽ cung cấp cho bạn rất nhiều lợi ích khác nhau như: Load Balancing, SSL, Caching, compression, static file,…
Để làm được như vậy, bạn cần phải đáp ứng được một số yêu cầu sau:
- Domain name trỏ tới địa chỉ IP public
- Cài đặt nginx trên server rồi
- Cài đặt chứng chỉ SSL. Có thể sử dụng Let’s encrypt for free
Mở file domain server block lên
$ vi nano /etc/nginx/sites-enabled/example.com
Sau đó, dán nội dung bên dưới vào file trên – là file config thiết lập SSL, điều hướng HTTP sang HTTPS, chuyển WWW sang non-WWW, cache static file, và enable nén GZIP. Giả sử mình có domain là example.com
# 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;
}
Sau khi lưu file trên rồi, restart lại nginx.
$ systemctl restart nginx
Tiếp theo, mình sẽ thiết lập Odoo sử dung proxy. Đầu tiên, mở file cấu hình và thêm vào dòng sau đây:
proxy_mode = True
Restart lại Odoo để các thay đổi được áp dụng.
$ systemctl restart odoo14
Ở đây, reverse proxy đã được cấu hình rồi, và bạn có thể truy cập Odoo thông qua domain https://example.com rồi đấy.
Thay đổi binding interface
Bước này có thể không cần thiết lắm, nhưng nó là một security practice.
Mặc định, Odoo server lắng nghe trên port 8069 trên tất cả interface. Để disable truy cập trực tiếp tới Odoo server, bạn có thể block port 8069 trên tất cả public interface hoặc ép Odoo chỉ lắng nghe trên các local interface.
Mình sẽ cấu hình Odoo lắng nghe trên localhost. Mở file cấu hình lên và thêm vào 2 dòng sau vào cuối file.
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1
Lưu file cấu hình lại và restart Odoo server để áp dụng các thay đổi ngay lập tức.
$ systemctl restart odoo14
Enable multiprocessing trên Odoo
Mặc định, Odoo hoạt động theo cơ chế multithreading. Khi triển khai trên production, thường người ta sẽ thiết lập để Odoo chạy theo cơ chế multiprocessing để tận dụng tài nguyên CPU trên server một cách hiệu quả.
Để enable multiprocessing, bạn cần sửa cấu hình Odoo và thiết lập con số khác 0 vào phần number worker. Số worker được tính toán dựa trên số core CPU trong hệ thống và lượng RAM khả dụng.
Theo tài liệu được Odoo công bố, để tính toán số worker và dung lượng RAM cần thiết – bạn có thể sử dụng công thức tính như sau:
Công thức tính toán worker
- Số worker tối đa = (cpu_system * 2) + 1
- 1 worker có thể phục vụ cho khoảng 6 user cùng lúc.
- Cron worker cũng cần sử dụng CPU
Công thức tính toán lượng RAM cần thiết
- Giả sử mình sẽ coi 20% tất cả các requests là những request nặng và 80% còn lại là những requests nhẹ hơn. Các requests nặng sử dụng khoảng 1GB RAM trong khi những request nhẹ còn lại chỉ sử dụng khoảng 150MB RAM.
- Lượng RAM cần thiết = số_worker * ( (tỉ_lệ_worker_xử_lý_request_nhẹ * lượng_ram_ước_tính_sử_dụng_bởi_worker_xử_lý_request_nhẹ) + (tỉ_lệ_worker_xử_lý_request_nặng * lượng_ram_ước_tính_sử_dụng_bởi_worker_xử_lý_request_nặng) )
Nếu bạn không biết có bao nhiêu CPU trên hệ thống của mình, bạn có thể sử dụng câu lệnh sau để kiểm tra:
$ grep -c ^processor /proc/cpuinfo
Giả sử, hệ thống của mình có CPU 4 cores, 8GB RAM và khoảng 30 user Odoo.
- 30 users / 6 = 5 (5 là số 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 trên công thức tính toán trên, bạn có thể sử dụng 5 worker + 1 worker cho cron worker, nghĩa là sẽ cần tổng cộng 6 worker.
Tính lượng RAM dựa trên số worker:
RAM = 6 * (( 0.8 *150 ) + ( 0.2 *1024 ) ) ~= 2 GB RAM
Để chuyển sang cơ chế multiprocessing, mở file cấu hình và append giá trị đã được tính toán như sau:
$ vi /etc/odoo14.conf
Dán đoạn code sau vào:
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
Restart lại Odoo service để áp dụng các thay đổi trên hệ thống:
$ systemctl restart odoo14
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 bài viết này, mình đã cài đặt Odoo với PostgreSQL và Nginx trên cùng một server.
Kết luận
Trong bài viết này mình đã đi qua hướng dẫn cách cài đặt Odoo 14 trên Ubuntu 20.04 trong python virtual environment. Và mình cũng đã chia sẻ cho bạn cách enable multiprocessing và optimize Odoo cho môi trường production rồi đấy.