如何在 Ubuntu 22.04 透過 Source 安裝 Odoo 17
對於模組開發人員來說使用 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
今天的分享就到這邊,感謝收看。