如何在Ubuntu 20.04上安装Odoo 15

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 updatesudo 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/odoo15python3 -m venv odoo-venv

激活该虚拟环境

source odoo-venv/bin/activate

Odoo的依赖性在requirements.txt文件中指定。用pip3安装所有需要的Python模块。

pip3 install wheelpip3 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

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

Install Odoo 15 on Ubuntu

配置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数据库的每日自动备份的教程。


已发布

分类

作者:

标签