Odoo 是一套流行的开源业务应用套件,可帮助企业管理和运营其业务。它包含一系列广泛的应用程序,如 CRM、电子商务、网站构建器、账单、会计、制造、仓库、项目管理、库存等,所有功能均无缝集成。
根据使用场景和可用技术,Odoo 可以通过不同的方式安装。使用官方 Odoo APT 存储库是安装 Odoo 最简单快捷的方法。
在虚拟环境中安装 Odoo,或以 Docker 容器部署,可让您更灵活地控制应用程序,并允许在同一系统上运行多个 Odoo 实例。
本文介绍如何在 Ubuntu 20.04 上的 Python 虚拟环境中安装和部署 Odoo 14。我们将从官方 GitHub 存储库下载 Odoo,并使用 Nginx 作为反向代理。
安装先决条件
以下命令用于安装 Git、Pip、Node.js 以及 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创建系统用户
不允许在 root 用户下运行 Odoo,因为这存在安全风险。我们将创建一个新系统用户和组,其主目录为 /opt/odoo14,用于运行 Odoo 服务。为此,请输入以下命令:
终端
sudo useradd -m -d /opt/odoo14 -U -r -s /bin/bash odoo14您可以将用户命名为任何您想要的名称,只要您创建一个与系统用户同名的 PostgreSQL 用户即可。
安装和配置 PostgreSQL
Odoo 使用 PostgreSQL 作为数据库后端。PostgreSQL 包含在标准 Ubuntu 存储库中。要安装它,请运行:
终端
sudo apt install postgresql安装完成后,创建一个与之前创建的系统用户同名的 PostgreSQL 用户。在本例中,该用户名为 odoo14:
终端
sudo su - postgres -c "createuser -s odoo14"安装 wkhtmltopdf
wkhtmltopdf 是一套开源命令行工具,可将 HTML 页面渲染为 PDF 和各种图像格式。要在 Odoo 中打印 PDF 报告,您需要安装 wkhtmltox 包。Odoo 推荐的版本是 0.12.5,可从 GitHub 下载:
终端
sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb下载文件后,输入以下命令进行安装:
终端
sudo apt install./wkhtmltox_0.12.5-1.bionic_amd64.deb安装和配置 Odoo 14
我们将在隔离的 Python 虚拟环境中从源代码安装 Odoo。
首先,切换到用户“odoo14”:
终端
sudo su - odoo14从 GitHub 克隆 Odoo 14 源代码:
终端
git clone https://www.github.com/odoo/odoo --depth 1 --branch 14.0 /opt/odoo14/odoo为 Odoo 创建一个新的 Python 虚拟环境:
终端
cd /opt/odoo14
python3 -m venv odoo-venv激活虚拟环境:
终端
source odoo-venv/bin/activate使用 pip3 安装所有必需的 Python 模块:
终端
pip3 install wheel
pip3 install -r odoo/requirements.txt如果在安装过程中遇到任何编译错误,请确保已安装“安装先决条件”部分中列出的所有必需依赖项。
完成后,输入以下命令停用环境:
终端
deactivate创建一个新目录,用于存放第三方附加组件:
终端
mkdir /opt/odoo14/odoo-custom-addons我们将此目录添加到 addons_path 参数。该参数定义了 Odoo 搜索模块的目录列表。
切换回您的 sudo 用户:
终端
exit创建一个包含以下内容的配置文件:
终端
sudo nano /etc/odoo14.conf/etc/odoo14.confini
[options]; 这是允许数据库操作的密码:
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不要忘记将 my_admin_passwd 更改为更安全的值。
创建 Systemd 单元文件
打开文本编辑器,创建一个名为 odoo14.service 的服务单元文件,内容如下:
终端
sudo nano /etc/systemd/system/odoo14.service/etc/systemd/system/odoo14.serviceini
[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通知 systemd 存在新的单元文件:
终端
sudo systemctl daemon-reload运行以下命令启动 Odoo 服务并启用其在启动时自动启动:
终端
sudo systemctl enable --now odoo14验证服务状态:
终端
sudo systemctl status odoo14输出应类似于以下内容,显示 Odoo 服务处于活动运行状态:
● 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...要查看 Odoo 服务记录的日志消息,请使用 journalctl:
终端
sudo journalctl -u odoo14测试安装
打开浏览器并输入:http://<your_domain_or_IP_address>:8069
假设安装成功,将出现如下类似的屏幕:

配置 Nginx 作为 SSL 终止代理
默认的 Odoo Web 服务器通过 HTTP 提供流量。为了提高 Odoo 部署的安全性,我们将设置 Nginx 作为 SSL 终止代理,以通过 HTTPS 提供流量。
SSL 终止代理是一种处理 SSL 加密/解密的代理服务器。这意味着终止代理(Nginx)将处理和解密传入的 TLS 连接(HTTPS),并将未加密的请求传递给内部服务(Odoo)。Nginx 和 Odoo 之间的流量不会加密(HTTP)。
使用反向代理可为您提供许多好处,例如负载均衡、SSL 终止、缓存、压缩、提供静态内容等。
在继续本节之前,请确保满足以下先决条件:
- 域名指向您的公共服务器 IP。我们将使用
example.com。 - 已安装 Nginx。
- 您域名的 SSL 证书。您可以安装免费的 Let's Encrypt SSL 证书。
打开文本编辑器,创建/编辑域名服务器块:
终端
sudo nano /etc/nginx/sites-enabled/example.com.conf以下配置设置 SSL 终止、HTTP 到 HTTPS 重定向、WWW 到非 WWW 重定向、缓存静态文件并启用 GZip 压缩。
/etc/nginx/sites-enabled/example.com.confnginx
# Odoo 服务器
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_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 参数
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;
# 日志文件
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
# 处理长轮询请求
location /longpolling {proxy_pass http://odoochat;}
# 处理 / 请求
location / {proxy_redirect off;
proxy_pass http://odoo;}
# 缓存静态文件
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;}信息:别忘了将 example.com 替换为你的 Odoo 域名,并设置 SSL 证书文件的正确路径。本配置中使用的片段是在本指南中创建的。
完成后,重启 Nginx 服务:
终端
sudo systemctl restart nginx接下来,我们需要告诉 Odoo 使用代理。为此,打开配置文件并添加以下行:
/etc/odoo14.confconf
proxy_mode = True重启 Odoo 服务以使更改生效:
终端
sudo systemctl restart odoo14此时,反向代理已配置完成,您可以访问您的 Odoo 实例 https://example.com。
更改绑定接口
此步骤是可选的,但它是良好的安全做法。
默认情况下,Odoo 服务器在所有接口上监听端口 8069。要禁用对 Odoo 实例的直接访问,您可以为所有公共接口阻止端口 8069,或强制 Odoo 仅监听本地接口。
我们将配置 Odoo 仅监听 127.0.0.1。打开配置文件,在文件末尾添加以下两行:
/etc/odoo14.confconf
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1保存配置文件并重启 Odoo 服务器以使更改生效:
终端
sudo systemctl restart odoo14启用多进程
默认情况下,Odoo 以多线程模式运行。对于生产部署,建议切换到多进程服务器,因为它能提高稳定性并更有效地利用系统资源。
要启用多进程,您需要编辑 Odoo 配置文件并设置非零的工作进程数量。工作进程的数量是根据系统中的 CPU 核心数和可用 RAM 内存计算的。
根据官方 Odoo 文档,要计算工作进程数量和所需 RAM 内存大小,您可以使用以下公式和假设:
工作进程数量计算
- 理论最大工作进程数 = (系统 CPU * 2) + 1
- 1 个工作进程可服务 ~= 6 个并发用户
- Cron 工作进程也需要 CPU
RAM 内存大小计算
- 我们将假设所有请求中有 20% 是重请求,80% 是轻请求。重请求大约使用 1 GB RAM,而轻请求大约使用 150 MB RAM
- 所需 RAM =
number_of_workers * ((light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * heavy_worker_ram_estimation))
如果您不知道系统有多少 CPU,请使用以下 grep 命令:
终端
grep -c ^processor /proc/cpuinfo假设您有一个拥有 4 个 CPU 核心、8 GB RAM 内存和 30 个并发 Odoo 用户的系统。
30 users / 6 = **5**(5 是所需理论工作进程数)(4 * 2) + 1 = **9**(9 是理论最大工作进程数)
根据上述计算,您可以使用 5 个工作进程 + 1 个用于 Cron 工作进程的额外工作进程,总共 6 个工作进程。
根据工作进程数量计算 RAM 内存消耗:
RAM = 6 * ((0.8*150) + (0.2*1024)) ~= 2 GB of RAM
计算表明,Odoo 安装大约需要 2GB RAM。
要切换到多进程模式,打开配置文件并追加计算出的值:
/etc/odoo14.confconf
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重启 Odoo 服务以使更改生效:
终端
sudo systemctl restart odoo14系统其余资源将由在此系统上运行的其他服务使用。在本指南中,我们在同一服务器上安装了与 PostgreSQL 和 Nginx 一起的 Odoo。根据您的设置,您的服务器上可能还运行着其他服务。