如何在Ubuntu20.04系统下安装Odoo14

Odoo是一款目前全球最流行的开源商业管理软件,该软件以模块化架构,从CRM,销售,库存,采购,到会计,审批管理,再到电商应有尽有。开源的框架,灵活的模块形式,快速的开发,并且有强大的开源社区,这些都可以帮忙你很快入门进而快速开发出自己想要的管理系统。

Odoo的安装它提供了几种方式,这取决于你自己的环境与你实际的需求,其中最便捷最快速的方式还是利用官方的APT库

我们可以在虚拟环境中安装Odoo14,或是利用Docker容器来部署,这样就可以更好的控制应用程序,并且还可以很方便的在同一个系统里面运行多个odoo实例。

在这个案例中,我们将介绍的是在自带Python3环境下的Ubuntu20.04,如何从官方的Github下载并且通过Nginx作为反向代理进行安装odoo14版本的。

安装程序列表:Ubuntu20.04+PostgreSQL+Odoo14+wkhtmltopdf+Nginx


安装先决依赖

以下的命令需要提前安装好 Git、 Pip 、Node.js 和 工具GCC

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,这将是一个严重的安全风险。我们将新建一个系统用户及用户组来运行odoo服务,其主目录为/opt/odoo14。具体命令如下:

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

你可以创建任何你想要的名称,只把上面的“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报告。 Odoo 推荐的版本是 0.12.5 版本,我们可以从 Github 下载:

sudo wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb

下载完成后,我们运行下面命令进行安装:

sudo apt install ./wkhtmltox_0.12.6-1.bionic_amd64.deb

安装Odoo14并进行配置

这里我们将为odoo14创建一个隔离的独立虚拟环境,以便我们不与其他应用程序使用的环境造成混乱。

首先,我们切换到”odoo14″用户(假如你用其他名称,请修改相应名称)

sudo su - odoo14

从Github上面下载最快的社区版本(如果有企业版权限,请在下载社区版本后,另外下载企业版模块,本案以社区版为例)

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

为Odoo创建一个独立的虚拟环境:

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

激活进行该虚拟环境:

source odoo-venv/bin/activate

安装所有python所需的模块:

pip3 install wheel
pip3 install -r odoo/requirements.txt

在安装所有python所需要模块过程,请确保所有的模块都完全安装,如有任何模块出现错误,都会造成后面安装的失败或是在运行Odoo过程中产生错误!

在上面安装成功后,我们退出虚拟环境:

deactivate

我们创建一个文件夹,用来存放一些第三方插件(请尽量不要把第三方插件与官方插件放到同个文件夹

mkdir /opt/odoo14/odoo-custom-addons

回头我们需要在Odoo的配置文件中添加该文件夹路径,以便Odoo搜索并添加该文件夹下面的插件

接下来我们退出当前用户(odoo14),回到之前sudo权限用户:

exit

接下来就是配置Odoo了,我们创建一个新的配置文件,具体配置参数如下:

sudo nano /etc/odoo14.conf
/etc/odoo14.conf
[options] 
; This is the password that allows database operations: 
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

请注意把admin_passwd改成你自己的密码,请尽量使用强密码!

创建系统服务

我们创建一个名为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/odoo-venv/bin/python3 /opt/odoo14/odoo/odoo-bin -c /etc/odoo14.conf
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target

重新加载 systemed service,以便启动odoo14.service

sudo systemctl daemon-reload

启动odoo14并设成开机自动启动:

sudo systemctl enable --now odoo14

我们查看一下启动状态:

sudo systemctl status odoo14

如果出现以下信息则证明程序已成功运转:

● 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
...

如果你想查看程序运转的日志,可运行如下命令:

sudo journalctl -u odoo14

当然你也可以在配置文件中添加“logfile = 路径”来存放日志

测试安装效果

打开浏览器,输入以下地址:http://<你域名或是IP地址>:8069

请注意查看VPS是否已开放8069端口

如果你看到以下面的页面时,那恭喜你,你已经安装成功:

根据上面的提示,创建你的数据库,开始探索Odoo的神奇之旅吧!

配置Nginx以提供SSL加密终端代理

Odoo的Web服务器在默认情况下是使用HTTP,在HTTP协议下面,内容传输没有受到加密,这样很容易在服务器与用户之前的信息传输会被恶意软件进行修改,目前主流浏览器已经把HTTP全部当成不安全网站进行屏蔽,所以在这里我们需要把HTTP WEB服务器使用Nginx SSL转换成HTTPS安全加密进行信息传输。

SSL终端代理服务是用于处理SSL的加密与解密工作。这意味着Nginx可以将加密的信息(通过HTTPS)进行解密,然后传递过Odoo.信息在Nginx与Odoo之间是不进行加密的传输。

使用反向代理(Reverse Proxy)可为您带来很多好处,例如负载平衡、SSL 终端加密、缓存、压缩、生成静态内容等等。

在进行该节章之前,请确保你已完成下面的任务:

  • 修改你域名的DNS,创建A记录,指向你的服务器IP;在这里我用example.com这个域名为例。
  • 已经安装好Nginx
  • 已经为你的域名申请了SSL证书,阿里云及腾讯云都提供免费的SSL证书。或者你也可以使用Encrypt免费自签证书

在上面都已经完成后,我们创建一个新的Nginx配置文件:

sudo nano /etc/nginx/sites-enabled/example.com.conf

填写下面的内容,我们把端口8069转换成80端口,并把HTTP强制跳转HTTPS, 同时也把WWW强制跳转到不带WWW的域名,并且还利用Nginx缓存文件,开启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;
}

请记得把域名改成你的,并注意修改SSL证书的路径成为你证书存放的路径及名件名称。

完成上面所有配置后,我们将重启Nginx:

sudo systemctl restart nginx

由于我们已开启了nginx代理模式,所以我们必须回去修改Odoo的配置文件 “/etc/odoo14.conf”,在该文件下面添加以下代码:

/etc/odoo14.conf
proxy_mode = True

接下来就是重启odoo14服务,以便新的配置参数生效。

sudo systemctl restart odoo14

一切顺利的话,你就可以通过https来访问你的odoo了。

取消绑定的网卡端口

这一步是可选步骤,但我建议你配置,有利于你的服务器安全。

因为在默认的情况下,Odoo是会对所有的网卡都开启8069端口。为了防止通过对外网卡直接访问你的Odoo实例,我们应该把对外网卡的8069关闭,或者说把8069的端口只绑定在内部网卡,而禁止对外网卡的8069端口。

所以我们配置Odoo只Listen 本地127.0.0.1,具体配置参数如下:

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

保存文件后重启odoo14服务以便修改生效

sudo systemctl restart odoo14

开启多线程

默认情况下,Odoo是在多线程模式下运行的。但对于生产部署,我们建议更改为多进程模式,因为它可以提高稳定性并更好地利用系统资源。

要启用多进程,您需要编辑Odoo配置文件并设置非零数量的worker参数。 worker的数量是根据系统中 CPU 内核的数量和可用的 RAM 内存计算的。 根据Odoo官方文档,计算worker数量和所需RAM内存大小,可以使用以下公式:

worker数量计算
  • 理论最大worker数=(system_cpus * 2)+ 1
  • 一个worker大约可以服务6个并发用户
  • 计划任务worker也需要CPU
RAM内存大小计算
  • 我们会认为在所有的请求中,有大约20%的进程是重进程,而80%则是轻进程。于是在重进程需要用到1 GB 内存时,轻请求只需要用到150M 内存。
  • 所需内存=Worker数量*((轻进程率*轻进程内存估算值)+(重进程率*重进程内存估算值))

如果你不知道你服务器有多少CPU,查看命令如下:

grep -c ^processor /proc/cpuinfo

我们来举一个例子来说明,假如我们现在有一台4 CPU + 8G RAM的VPS,而我们的Odoo用户是30个,那么我们的配置应该如下:

  • 理论需要worker = 30用户/6 (5个)
  • 服务器最大可设worker = (4*2)+1 (9个)

根据上面的测算,我们可以设置5个worker ,另外加1个woker 作为计划任务,总共6 worker

至于内存大小,按照上面6 个 woker,我们可以得出:

  • 所需内存 = 6*((0.8*150)+(0.2*1024))(大约2 G RAM)

通过上面的计算,我们可以得出需要大概2 G的内存来运行Odoo。

我们最后把计算出来的worker数及内存数填入到配置文件(/etc/odoo14.conf)中:

/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

重启服务使修改生效:

sudo systemctl restart odoo14

通过上面的配置,我们已经成功的安装Odoo14,并优化了性能。在实际的生产环境中,我们可能还需要配置更多的参数来使我们的系统更流畅运行,毕竟原生Odoo的性能缺点还是比较慢。在以后的章节我们将更详细的介绍如何优化Odoo.

写在最后

当我们基本安装好了odoo14后,但离我们可以正式生产环境还需要一些环节,我们必须根据自身的业务需求进行优化,而其中一个最重要的就是数据库的安全,请参加另一篇“如何备份/恢复odoo数据库”.

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注