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用户。
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是一套开源的命令行工具,用于将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
我们将在一个隔离的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
[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改成更安全的名字。
打开你的文本编辑器,创建一个名为odoo14.service的服务单元文件,内容如下。
$ sudo nano /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
默认的Odoo网络服务器是通过HTTP提供流量。为了使Odoo实例更加安全,我们将把Nginx配置成一个SSL终端代理,通过HTTPS提供流量。
SSL终端代理是一个处理SSL加密/解密的代理服务器。这意味着终端代理(Nginx)将处理和解密进入的TLS连接(HTTPS),并将未加密的请求传递给内部服务(Odoo)。Nginx和Odoo之间的通信将不会被加密(HTTP)。
使用反向代理有很多好处,如负载平衡、SSL终止、缓存、压缩、提供静态内容等等。
在继续本节内容之前,请确保你已经满足了以下先决条件。
打开你的文本编辑器,创建/编辑域名服务器块
$ sudo nano /etc/nginx/conf.d/example.com
下面的配置设置了SSL终止,HTTP到HTTPS的重定向,WWW到非WWW的重定向,缓存静态文件,并启用GZip压缩。
# 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;
}
$ sudo systemctl restart nginx
proxy_mode = True
$ sudo systemctl restart odoo14
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1
$ sudo systemctl restart odoo14
# grep -c ^processor /proc/cpuinfo
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