Odoo是一个流行的开源商业应用程序套件,帮助公司管理和运行他们的业务。它包括广泛的应用程序,如CRM、电子商务、网站建设者、计费、会计、制造、仓库、项目管理、库存等等,都是无缝集成的。
根据使用情况和现有技术,Odoo可以用不同的方式安装。安装Odoo最简单、最快捷的方式是使用Odoo官方APT资源库。
在虚拟环境中安装Odoo,或作为Docker容器部署,可以让你对应用程序有更多的控制,并允许你在同一个系统上运行多个Odoo实例。
本文将介绍在Ubuntu 20.04的Python虚拟环境中安装和部署Odoo 15。我们将从GitHub的官方仓库下载Odoo,并使用Nginx作为反向代理。
安装依赖项
第一步是安装Git、Pip、Node.js和开发[构建所需的工具](https://linuxize.com/post/how-to-install-gcc-on-ubuntu-20-04/ 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
创建一个系统用户
在根用户下运行Odoo会带来很大的安全风险。我们将创建一个新的系统用户和组,主目录为/opt/odoo15,将运行Odoo服务。要做到这一点,请运行以下命令。
sudo useradd -m -d /opt/odoo15 -U -r -s /bin/bash odoo15
你可以给这个用户起任何名字,只要你创建一个与之同名的PostgreSQL用户。
安装和配置PostgreSQL
Odoo使用PostgreSQL作为数据库后端。PostgreSQL包含在标准的Ubuntu软件库中。安装是直接的。
sudo apt install postgresql
一旦服务安装完毕,创建一个PostgreSQL用户,其名称与之前创建的系统用户相同。在这个例子中,就是odoo15。
sudo su - postgres -c "createuser -s odoo15"
安装wkhtmltopdf
wkhtmltopdf是一套开源的命令行工具,用于将HTML页面渲染成PDF和各种图像格式。要在Odoo中打印PDF报告,你需要安装wkhtmltox软件包。
Ubuntu软件库中的wkhtmltopdf版本并不支持页眉和页脚。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 15
我们将在一个隔离的Python虚拟环境中从源头安装Odoo。
首先,切换到用户 “odoo15″。
sudo su - odoo15
从GitHub克隆Odoo 15的源代码。
git clone https://www.github.com/odoo/odoo --depth 1 --branch 15.0 /opt/odoo15/odoo
为Odoo创建一个新的Python虚拟环境。
cd /opt/odoo15
python3 -m venv odoo-venv
激活该虚拟环境
source odoo-venv/bin/activate
Odoo的依赖性在requirements.txt文件中指定。用pip3安装所有需要的Python模块。
pip3 install wheel
pip3 install -r odoo/requirements.txt
如果你在安装过程中遇到任何编译错误,请确保安装先决条件一节中列出的所有必需的依赖性都已安装。
一旦完成,通过键入来停用环境。
deactivate
我们将创建一个新的目录,为第三方插件创建一个单独的目录。
mkdir /opt/odoo15/odoo-custom-addons
稍后我们将把这个目录添加到addons_path参数中。这个参数定义了一个Odoo搜索模块的目录列表。
切换回你的sudo用户。
exit
创建一个配置文件,内容如下。
sudo nano /etc/odoo15.conf
/etc/odoo15.conf
[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
不要忘记把my_admin_passwd改成更安全的名字。
创建Systemd单元文件
单元文件是一个Ini风格的配置文件,用于保存某个服务的信息。
打开文本编辑器,创建一个名为odoo15.service的文件,内容如下。
sudo nano /etc/systemd/system/odoo15.service
/etc/systemd/system/odoo15.service
[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
通知systemd存在一个新的单元文件。
sudo systemctl daemon-reload
启动Odoo服务,并通过运行使其在启动时启动。
sudo systemctl enable --now odoo15
验证服务是否已经启动并运行。
sudo systemctl status odoo15
输出结果应该如下所示,显示Odoo服务已经激活并运行。
● 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
...
你可以用下面的命令检查Odoo服务记录的信息。
sudo journalctl -u odoo15
测试安装情况
打开你的浏览器并输入:http://<your_domain_or_IP_address>:8069
假设安装成功,会出现类似以下的屏幕。

配置Nginx作为SSL终端代理
默认的Odoo网络服务器是通过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.conf
# 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;
}
不要忘记用你的Odoo域名替换example.com,并设置SSL证书文件的正确路径。在这个配置中使用的片段是在本指南中创建的。
完成后,重新启动Nginx服务。
sudo systemctl restart nginx
接下来,我们需要告诉Odoo使用代理。要做到这一点,打开配置文件并添加以下一行。/etc/odoo15.conf
proxy_mode = True
重新启动Odoo服务,使更改生效。
sudo systemctl restart odoo15
至此,反向代理已经配置完毕,你可以在https://example.com,访问你的Odoo实例。
改变绑定界面
这一步是可选的,但它是一个好的安全做法。
默认情况下,Odoo服务器在所有接口上都监听8069端口。要禁止对Odoo实例的直接访问,你可以阻止所有公共接口的8069端口,或者强制Odoo只监听本地接口。
我们将配置Odoo只监听127.0.0.1。打开配置,在文件的末尾添加以下两行。/etc/odoo15.conf
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1
保存配置文件,并重新启动Odoo服务器以使更改生效。
sudo systemctl restart odoo15
启用多处理功能
默认情况下,Odoo在多线程模式下工作。对于生产部署,建议改为多处理服务器,因为它能提高稳定性并更好地利用系统资源。
要启用多进程,你需要编辑Odoo配置并设置一个非零的工作进程数。工作者的数量是根据系统中CPU核心的数量和可用的RAM内存计算的。
根据Odoo的官方文档,要计算工作者的数量和所需的RAM内存大小,你可以使用以下公式和假设。
工作者数量的计算
- 理论上最大的工作器数量 = (system_cpus * 2) + 1
- 1个工作者可以为~=6个并发用户服务
- Cron工作者也需要CPU
计算RAM内存大小
- 我们将考虑所有请求中的20%是重度请求,80%是轻度请求。重度请求使用约1GB的RAM,而轻度请求使用约150MB的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核心,8GB的RAM内存,30个Odoo并发用户。
- 30个用户/6 = **5** (5是理论上需要的工作者数量 )
- (4 * 2) + 1 = **9** ( 9是理论上的最大工作人数)
根据上面的计算,你可以使用5个工人+1个工人的cron工人,也就是总共6个工人。
根据工作者的数量计算RAM内存消耗。
RAM = 6 * ((0.8*150) + (0.2*1024)) ~= 2 GB的RAM
计算结果显示,Odoo安装需要约2GB的RAM。
要切换到多进程模式,请打开配置文件并附加计算值。/etc/odoo15.conf
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 odoo15
其余的系统资源将被运行在这个系统上的其他服务所使用。在本指南中,我们将Odoo与PostgreSQL和Nginx安装在同一台服务器上。根据你的设置,你也可能有其他的服务在你的服务器上运行。
总结
本文解释了如何在Python虚拟环境中使用Nginx作为反向代理在Ubuntu 20.04上安装和配置Odoo 15。我们还向你展示了如何启用多进程并为生产环境优化Odoo。
你可能还想看看我们关于如何创建Odoo数据库的每日自动备份的教程。