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
在上面安装成功后,我们退出虚拟环境:
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
创建系统服务
我们创建一个名为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
测试安装效果
打开浏览器,输入以下地址:http://<你域名或是IP地址>: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;
}
完成上面所有配置后,我们将重启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数据库”.