帮助中心
如何在CentOS 8上安装Odoo 14?



Odoo是世界上最流行的多合一商业软件。它提供了一系列商业应用,包括CRM、网站、电子商务、计费、会计、制造、仓库、项目管理、库存等等,都是无缝集成的。

Odoo可以以不同的方式安装,这取决于使用情况和可用的技术。安装Odoo最简单、最快捷的方式是使用Odoo官方APT资源库。

在虚拟环境中安装Odoo,或作为Docker容器部署,可以让你对应用程序有更多的控制,并允许你在同一个系统上运行多个Odoo实例。

本文介绍了如何在CentOS 8上的Python虚拟环境中安装和部署Odoo 14。我们将从GitHub官方仓库下载Odoo,并使用Nginx作为反向代理。


安装的前提


Odoo是用Python编写的。第一步是安装Python 3、Git、pip以及从源头构建Odoo所需的所有库和工具。

$ sudo dnf install python3 python3-devel git gcc sassc redhat-rpm-config libxslt-devel  \    bzip2-devel openldap-devel libjpeg-devel freetype-devel


创建一个系统用户


在根用户下运行Odoo是不允许的,因为这有安全风险。创建一个新的系统用户和组,主目录为/opt/odoo,将运行Odoo服务。

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

你可以给这个用户起任何你喜欢的名字;只要确保你创建了一个具有相同名字的PostgreSQL用户。


安装和配置PostgreSQL


Odoo使用PostgreSQL作为数据库后端。我们将从标准的CentOS 8软件库中安装PostgreSQL 12。

$ sudo dnf install @postgresql:12

一旦安装完成,创建一个新的PostgreSQL数据库集群。

$ sudo postgresql-setup initdb

启用并启动PostgreSQL服务。

$ sudo systemctl enable --now postgresql

创建一个PostgreSQL用户,其名称与之前创建的系统用户相同。在这个例子中,就是odoo14。

$ sudo su - postgres -c "createuser -s odoo14"

安装Wkhtmltopdf


wkhtmltopdf是一套开源的命令行工具,用于将HTML页面渲染成PDF和各种图像格式。要在Odoo中打印PDF报告,你需要安装wkhtmltox软件包。Odoo的推荐版本是0.12.5版,可以从Github下载并安装。

$ sudo dnf install https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos8.x86_64.rpm


安装和配置Odoo 14


我们将在一个隔离的Python虚拟环境中从源头安装Odoo

首先,切换到用户 "odoo14"

$ sudo su - odoo14

从Odoo的GitHub仓库克隆Odoo 14的源代码。

$ git clone https://www.github.com/odoo/odoo --depth 1 --branch 14.0 /opt/odoo14/odoo

导航到/opt/odoo14目录,为Odoo安装创建一个新的Python虚拟环境。

$ cd /opt/odoo14$ python3 -m venv venv

使用source命令激活环境。

$ source venv/bin/activate

安装所需的Python模块。

(venv) $ pip3 install -r odoo/requirements.txt

如果你在安装过程中遇到任何编译错误,请确保安装先决条件一节中列出的所有必要的依赖项都已安装。

完成后,通过键入以下内容来停用环境

(venv) $ deactivate

为自定义附加组件创建一个新目录。

$ mkdir /opt/odoo14/odoo-custom-addons

我们将把这个目录添加到addons_path参数中。这个参数定义了一个Odoo搜索模块的目录列表。

切换回你的sudo用户

$ exit

创建一个具有以下内容的配置文件。

$ sudo nano /etc/odoo14.conf
/etc/odoo14.conf
[options]
admin_passwd = superadmin_passwd
db_host = False
db_port = False
db_user = odoo14
db_password = False
addons_path = /opt/odoo14/odoo/addons, /opt/odoo14/odoo-custom-addons

保存并关闭该文件。

不要忘记把superadmin_passwd改成更安全的名字。


创建Systemd单元文件


打开你的文本编辑器,创建一个名为odoo14.service的服务单元文件,内容如下。

$ sudo nano /etc/systemd/system/odoo14.service

粘贴以下内容。


/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/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

用以下命令验证Odoo是否在运行。

$ sudo systemctl status odoo14

输出结果应该如下,显示Odoo服务已经激活并运行。

● odoo14.service - Odoo14
   Loaded: loaded (/etc/systemd/system/odoo14.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-02 20:12:24 UTC; 3s ago
...

要查看Odoo服务记录的信息,请使用以下命令。

$ sudo journalctl -u odoo14


测试安装结果


打开你的浏览器,输入:http://<你的域名_或IP_地址>:8069

假设安装成功,会出现类似以下的屏幕。




如果你不能访问该页面,请确保8069端口在你的防火墙中是开放的。

$ sudo firewall-cmd --permanent --zone=public --add-port=8069/tcp$ sudo firewall-cmd --reload


配置Nginx作为SSL终结代理


默认的Odoo网络服务器是通过HTTP提供流量。为了使Odoo实例更加安全,我们将把Nginx配置成一个SSL终端代理,通过HTTPS提供流量。

SSL终端代理是一个处理SSL加密/解密的代理服务器。这意味着终端代理(Nginx)将处理和解密进入的TLS连接(HTTPS),并将未加密的请求传递给内部服务(Odoo)。Nginx和Odoo之间的通信将不会被加密(HTTP)。

使用反向代理有很多好处,如负载平衡、SSL终止、缓存、压缩、提供静态内容等等。

在继续本节内容之前,请确保你已经满足了以下先决条件。

  • 指向你的公共服务器IP的域名。我们将使用example.com。如果需要购买域名可以前往FebHost域名版块购买
  • 安装了Nginx
  • 你的域名的SSL证书。你可以安装一个FebHost安全证书,购买地址:https://www.febhost.com/ssl,选择一个便宜的即可

打开你的文本编辑器,创建/编辑域名服务器块

$ sudo nano /etc/nginx/conf.d/example.com

下面的配置设置了SSL终止,HTTP到HTTPS的重定向,WWW到非WWW的重定向,缓存静态文件,并启用GZip压缩。

/etc/nginx/conf.d/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;

    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/odoo14.conf
proxy_mode = True
重新启动Odoo服务以使更改生效。
$ sudo systemctl restart odoo14
至此,反向代理已经配置完毕,你可以在https://example.com,访问你的Odoo实例。


改变绑定接口


这一步是可选的,但这是一个很好的安全做法。

默认情况下,Odoo服务器会在所有接口上监听8069端口。要禁止对Odoo实例的直接访问,你可以阻止所有公共接口的8069端口,或者强制Odoo只监听本地接口。

我们将配置Odoo只监听127.0.0.1。打开配置,在文件的末尾添加以下两行。

/etc/odoo14.conf
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1

保存配置文件,并重新启动Odoo服务器以使更改生效。
$ sudo systemctl restart odoo14

启用多处理程序


默认情况下,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/odoo14.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 odoo14
其余的系统资源将被运行在这个系统上的其他服务所使用。在本指南中,我们将Odoo与PostgreSQL和Nginx安装在同一台服务器上。根据你的设置,你可能还有其他服务在你的服务器上运行。


总结


本文指导你在Python虚拟环境中使用Nginx作为反向代理在CentOS 8上安装Odoo 14。我们还向你展示了如何启用多进程和优化Odoo的生产环境。
文章相关标签: Odoo 14安装
购物车