如何在 Ubuntu 22.04 透過 Source 安裝 Odoo 17

Ivan Cheng
20 min readMar 17, 2024

對於模組開發人員來說使用 Source 比 Package 安裝 Odoo 更容易存取,它允許使用命令列參數覆蓋設置,無需編輯任何配置文件。

Source 安裝不是真的安裝 Odoo 而是直接運行它,提供了對系統設定的更好控制,允許更輕鬆地並行保留和運行 Odoo 的多個版本。

使用的 Vultr 的 Cloud Compute 進行演示

  • Type:Cloud Compute — Shared CPU
  • Image:Ubuntu 22.04 LTS x64
  • Plan:Regular Cloud Compute
  • vCPUs:2 vCPUs
  • RAM:4096 MB
  • Storage:80 GB SSD

首先更新並將現有套件升級到最新版本

sudo apt update 
sudo apt upgrade -y

使用 root 權限運行 Odoo 可能會損害安全性,建立 Odoo 專用的系統使用者、群組和主目錄。

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

Useradd 參數說明

  • -m:建立使用者的主目錄
  • -d:新帳戶的主目錄
  • -U:建立一個與使用者同名的群組
  • -r:建立系統帳戶
  • -s:新帳戶的登入 shell

取得來源

需要安裝Git,建議對 Git 指令有基本。


sudo apt install git

社群版 Community Edition

企業版 Enterprise Edition

若要複製 Git 儲存庫,請選擇使用 HTTPS 或 SSH 進行複製。

su - odoo17 
git clone https://www.github.com/odoo/odoo --depth 1 --branch 17.0 --single-branch
exit

Enterprise 儲存庫不包含完整的 Odoo 原始碼,其主要代碼位於 Community 版中,需要 odoo.git 和 enterprise.git 才能安裝有效的 Odoo Enterprise。

運行 Odoo Enterprise 須從 Community 版本執行伺服器,並將 addons-path 選項設定為企業版的資料夾。

先決條件

Odoo 17 需要 Python 3.10 或更高版本才能運作

python3 --version

驗證該版本是否也安裝了 pip

pip3 --version

PostgreSQL

Odoo 使用 PostgreSQL 作為其資料庫管理系統,使用套件管理器下載並安裝 PostgreSQL 12.0 或更高版本。

sudo apt install postgresql postgresql-client -y

PostgreSQL 預設的使用者是 postgres,由於 Odoo 禁止以 postgres 身分連接,因此建立一個新的使用者。

sudo su - postgres -c "createuser -d -R -S -P odoo17" 
Enter password for new role: your_db_password
Enter it again: your_db_password

Createuser 參數說明

  • -d:將被允許建立資料庫
  • -R:不允許創建新角色,預設值。
  • -S:不會是超級使用者,預設值。
  • -P:使用密碼身份驗證

Dependencies

在 Debian / Ubuntu 上,透過下列指令應安裝所需的 Python 相依套件

cd /opt/odoo17/odoo
sudo ./setup/debinstall.sh

對於使用從右到左介面的語言,例如阿拉伯語或希伯來語,則需要安裝 rtlcss 套件。

sudo apt install nodejs -y
sudo apt install npm -y
sudo npm install -g rtlcss

Wkhtmltopdf 是一個開源命令列工具,可將 HTML 渲染為 PDF 和各種圖像格式,方便我們在 Odoo 產生 PDF 報告。

Wkhtmltopdf 必須手動安裝,無法透過 pip 進行安裝。

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_amd64.deb 
sudo apt install ./wkhtmltox_0.12.6.1-3.jammy_amd64.deb -y

運行 Odoo

雖然 Source 允許使用命令列參數來運行 Odoo,但是只要參數一多就比較不容易維護,因此還是建議根據您的需求自訂 Odoo 設定檔。

sudo nano /etc/odoo17.conf
[options]
admin_passwd = your_master_password
db_host = localhost
db_port = 5432
db_user = odoo17
db_password = your_db_password
addons_path = /opt/odoo17/odoo/addons
logfile = /var/log/odoo17.log
log_level = debug
sudo chown odoo17:odoo17 /etc/odoo17.conf 

設定 Log File 與配置權限

touch /var/log/odoo17.log
sudo chown odoo17:odoo17 /var/log/odoo17.log
sudo chown odoo17:odoo17 /etc/odoo17.conf

作業系統的防火牆允許 8069 埠號通過

sudo ufw allow 8069

Vultr 的防火牆允許 8069 埠號通過

服務管理

為了方便管理 Odoo 服務使其自動啟動,建立自訂 Odoo 的 Systemd 服務。

sudo nano /etc/systemd/system/odoo17.service 
[Unit]
Description=Odoo 17.0 Service
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
SyslogIdentifier=odoo
PermissionsStartOnly=true
User=odoo17
Group=odoo17
ExecStart=python3 /opt/odoo17/odoo/odoo-bin -c /etc/odoo17.conf

[Install]
WantedBy=multi-user.target

重新載入 systemd 程式並將 Odoo 服務啟動與啟用

sudo systemctl daemon-reload  
sudo systemctl enable --now odoo17.service
sudo systemctl status odoo17.service

瀏覽 http://your_odoo_ip:8069 畫面如下,只要輸入 Email 與 Password 就可以完成 Odoo 的初始化。

反向代理

我們通常會在網域中添加 :8069 來存取 Odoo 伺服器,其實可以透過 Nginx 反向代理來進行簡化,使其如同在一般的網站上操作。

sudo apt install nginx -y

建立 Odoo 虛擬主機設定檔案

cd /etc/nginx/sites-available
sudo nano odoo17.conf
#odoo server
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
server_name your_odoo_ip;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;

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

# Redirect websocket requests to odoo gevent port
location /websocket {
proxy_pass http://odoochat;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $http_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;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

# Redirect requests to odoo backend server
location / {
# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $http_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;
proxy_redirect off;
proxy_pass http://odoo;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

# common gzip
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip on;

}

建立符號連結至 /etc/nginx/sites-enabled,讓 Nginx 能夠使用 odoo17.conf 定義的配置來為相應的網站或應用程式提供服務。

sudo ln -s /etc/nginx/sites-available/odoo17.conf /etc/nginx/sites-enabled/odoo17.conf

驗證 Nginx 伺服器組態是否存在語法錯誤

sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

若沒有問題就可以重啟 Nginx 服務

sudo service nginx restart

我們還需要更新 Odoo 配置,使其知道正在使用反向代理伺服器。

sudo nano /etc/odoo17.conf
[options]
admin_passwd = your_master_password
db_host = localhost
db_port = 5432
db_user = odoo17
db_password = your_db_password
addons_path = /opt/odoo17/odoo/addons
logfile = /var/log/odoo17.log
log_level = debug
proxy_mode = True

新增 proxy_mode 參數後,重新啟動 Odoo 服務。

sudo service odoo17 restart

作業系統的防火牆允許 HTTP 通過,然後刪除原本的 8069 埠號。

sudo ufw allow http
sudo ufw delete allow 8069

Vultr 的防火牆只允許 HTTP 埠號通過

瀏覽 http://your_odoo_ip 就可以登入 Odoo 了

添加 SSL 憑證

若使用 HTTP 則身份驗證會以明文形式傳輸,因此我們需要添加 SSL 憑證來增加 Odoo 服務的安全與隱私。

sudo nano /etc/nginx/sites-available/odoo17.conf
#odoo server
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

# http -> https
server {
listen 80;
server_name your_odoo_FQDN;
rewrite ^(.*) https://$host$1 permanent;
}

server {
listen 443 ssl;
server_name your_odoo_FQDN;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;

# SSL parameters
ssl_certificate /etc/ssl/nginx/your_certificate.crt;
ssl_certificate_key /etc/ssl/nginx/your_certificate.key;
ssl_session_timeout 30m;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

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

# Redirect websocket requests to odoo gevent port
location /websocket {
proxy_pass http://odoochat;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $http_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;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

# Redirect requests to odoo backend server
location / {
# Add Headers for odoo proxy mode
proxy_set_header X-Forwarded-Host $http_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;
proxy_redirect off;
proxy_pass http://odoo;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

# common gzip
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip on;
}

假設我們已經購買了 SSL 憑證,將其擺放於 /etc/ssl/nginx。

sudo mkdir /etc/ssl/nginx
sudo mv your_certificate.* /etc/ssl/nginx

重啟 Nginx 服務

sudo service nginx restart

作業系統的防火牆記得允許 HTTPS 通過

sudo ufw allow https

Vultr 的防火牆允許 HTTP 與 HTTPS 埠號通過

瀏覽 https://your_odoo_FQDN 就可以登入 Odoo 了

阻止暴力攻擊

Fail2Ban 是保護 Linux 伺服器免受自動攻擊的最佳軟體,它提供許多可自定義的規則來禁止試圖暴力破壞或測試密碼。

每當執行登入嘗試時 Odoo 都會發出日誌並報告結果

2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login failed for db:db_name login:admin from 127.0.0.1
2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login successful for db:db_name login:admin from 127.0.0.1

這些日誌可以透過入侵防禦系統 fail2ban 進行分析

sudo apt install fail2ban -y

定義過濾器與 Odoo 失敗的登入相符

sudo nano /etc/fail2ban/filter.d/odoo-login.conf
[Definition]
failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from <HOST>
ignoreregex =

建議您新增一個 Local 文件,複製 fail2ban.conf 並重新命名為 fail2ban.local 以覆蓋預設配置。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

當 1 分鐘內偵測到來自 HTTP 或 HTTPS 相同 IP 的 10 次登入嘗試失敗時,阻止該 IP 15 分鐘的情況。

[odoo-login]
enabled = true
port = http,https
bantime = 900 ; 15 min ban
maxretry = 10 ; if 10 attempts
findtime = 60 ; within 1 min /!\ Should be adjusted with the TZ offset
logpath = /var/log/odoo17.log ; set the actual odoo log path here

重啟 Fail2ban 服務

 sudo service fail2ban restart

今天的分享就到這邊,感謝收看。

參考文件

--

--