如何在 Ububtu 18.04 上安装 Odoo 13

2020-05-11 16:41:26 浏览数 (1)

Odoo 是一个流行的开源商业应用套装。它提供了一系列的应用包括,CRM,e-Commerce,website builder, billing,accounting, manufacturing,warehouse,project management,inventory,等等, 所有东西都无缝集成。

Odoo可以以多重方式进行安装,依赖于用户具体场景以及可用的技术。最简单的安装 Odoo 的方式就是使用官方的 Odoo APT 软件源。

在虚拟环境中安装 Odoo,或者部署一个 Docker 容器,允许你对系统的设置有更多的控制,并且可以在同一个系统上运行多个 Odoo 软件版本。

在这个指南中,我们将会在 Ubuntu 18.04 上一个 Python 虚拟环境中安装和部署 Odoo 13.我们将会从它们的 Github 软件源中下载 Odoo,并且使用 Nginx 作为反向代理服务器。

一、安装前提条件

以 sudo 用户身份登录系统,并且升级 APT 缓存:

代码语言:javascript复制
sudo apt update

安装 Git,Pip,Node.js 以及所有构建 Odoo 依赖需要用到的工具:

代码语言:javascript复制
sudo apt install git python3-pip build-essential wget python3-dev python3-venv python3-wheel libxslt-dev libzip-dev libldap2-dev libsasl2-dev python3-setuptools node-less

二、创建一个系统用户

创建一个系统用户用于运行 Odoo,命名为odoo13,用户目录为/opt/odoo13

代码语言:javascript复制
sudo useradd -m -d /opt/odoo13 -U -r -s /bin/bash odoo13

你可以将这个名字设置成任何你想要设置的名字,同时,你还要使用这个名字来创建一个 PostgreSQL 用户。

三、安装和配置 PostgreSQL

Odoo 使用 PostgreSQL 作为数据库后端。想要安装 PostgreSQL运行下面的命令:

代码语言:javascript复制
sudo apt install postgresql

一旦安装完成,创建一个 PostgreSQL,使用和之前创建系统用户一样的名字,在我们的例子中是odoo13:

代码语言:javascript复制
sudo su - postgres -c "createuser -s odoo13"

四、安装 Wkhtmltopdf

Wkhtmltopdf软件包提供了一系列开源的终端命令行工具,它们可以将 HTML 绘制成 PDF 和各种图片格式。想要启用 PDF 报告打印,你需要安装wkhtmltopdf工具。推荐的 Odoo 版本是0.12.5,它在默认的 Ubuntu 18.04 软件源中不可用。

使用下面的 wget 命令下载软件包:

代码语言:javascript复制
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb

一旦下载完成,安装这个软件包,输入:

代码语言:javascript复制
sudo apt install ./wkhtmltox_0.12.5-1.bionic_amd64.deb

五、安装和配置 Odoo 13

就像以前提到的,我们将会在一个隔离的 Python 虚拟环境中从源码安装 Odoo。

首先,切换到用户 “odoo13”:

代码语言:javascript复制
sudo su - odoo13

从Github 仓库克隆 Odoo 13 源代码:

代码语言:javascript复制
git clone https://www.github.com/odoo/odoo --depth 1 --branch 13.0 /opt/odoo13/odoo

一旦下载完成,为 Odoo 创建一个新的 Python 虚拟环境。

代码语言:javascript复制
cd /opt/odoo13
python3 -m venv odoo-venv

通过下面的命令激活这个环境:

代码语言:javascript复制
source odoo-venv/bin/activate

使用 pip3 安装所有必要的 Python 模块:

代码语言:javascript复制
pip3 install wheel
pip3 install -r odoo/requirements.txt

一旦完成,接触环境,输入:

代码语言:javascript复制
deactivate

我们将会创建一个新的目录,用来存储第三方插件。

代码语言:javascript复制
mkdir /opt/odoo13/odoo-custom-addons

稍后,我们将会将该目录添加到addons_path参数中。这个参数定义了 Odoo 用来搜索模块的一个列表。

切换到 sudo 用户:

代码语言:javascript复制
exit

使用下面的内容创建一个配置文件:

代码语言:javascript复制
sudo nano /etc/odoo13.conf
代码语言:javascript复制
[options]
; This is the password that allows database operations:
admin_passwd = my_admin_passwd
db_host = False
db_port = False
db_user = odoo13
db_password = False
addons_path = /opt/odoo13/odoo/addons,/opt/odoo13/odoo-custom-addons
代码语言:javascript复制
不要忘记将`my_admin_passwd`改成更加安全的内容。

六、创建一个 System Unit 文件

打开你的文本编辑器,并且使用下面的内容创建一个服务单元文件,名为odoo13.service

代码语言:javascript复制
sudo nano /etc/systemd/system/odoo13.service
代码语言:javascript复制
[Unit]
Description=Odoo13
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
SyslogIdentifier=odoo13
PermissionsStartOnly=true
User=odoo13
Group=odoo13
ExecStart=/opt/odoo13/odoo-venv/bin/python3 /opt/odoo13/odoo/odoo-bin -c /etc/odoo13.conf
StandardOutput=journal console

[Install]
WantedBy=multi-user.target

通知 systemd 一个新的单元文件存在了:

代码语言:javascript复制
sudo systemctl daemon-reload

启动 Odoo 服务,并且开启随机启动,运行:

代码语言:javascript复制
sudo systemctl enable --now odoo13

验证服务状态:

代码语言:javascript复制
sudo systemctl status odoo13

输出将会像下面一样,显示 Odoo 服务是活跃的,正在运行的:

代码语言:javascript复制
● odoo13.service
   Loaded: loaded (/etc/systemd/system/odoo13.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2019-10-19 20:06:23 UTC; 3s ago
 Main PID: 1860 (python3)
    Tasks: 4 (limit: 2362)
   CGroup: /system.slice/odoo13.service

想要查看 Odoo 服务的日志信息,使用下面的命令:

代码语言:javascript复制
sudo journalctl -u odoo13

七、测试安装

打开你的浏览器,并且输入:http://<your_domain_or_IP_address>:8069

假设安装完成了,一个类似下面的屏幕将会显示:

八、将 Nginx 配置成 SSL 代理服务器

默认的 Odoo 网站服务器通过 HTTP 服务。想要使 Odoo 部署更安全,我们将会配置 Nginx 作为 SSL 代理服务器,使网站服务器通过 HTTPS 进行服务。

SSL 代理服务器是一个用来处理 SSL 加密解密的代理服务器。这意味着,Nginx 将会处理并且解密进来的 TLS 连接(HTTPS),并且传递未被加密的请求到内部服务(Odoo)。在 Nginx 和 Odoo 之间的流量将不会被加密。

使用一个反向代理服务器有很多好处,比如负载均衡,SSL,缓存,压缩,静态内容服务,等等。

确保你满足下面的前提条件,再继续下一步的安装配置:

  • 一个指向你的服务器的公网 IP 的域名,我们使用example.com
  • 安装 Nginx
  • 域名的 SSL 证书。你可以安装一个免费的 Encrypt SSL 证书。

打开你的文本编辑器,创建或者编辑域名服务器配置块:

代码语言:javascript复制
sudo nano /etc/nginx/sites-enabled/example.com

下面的配置将会建立 SSL,HTTP 转向 HTTPS,WWW 转向 non-www,缓存静态文件,并且开启 GZip 压缩。

代码语言:javascript复制
# 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;

    # 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;
}
代码语言:javascript复制
 不要忘记使用你自己的 Odoo 域名替换  example.com并且设置正确的 SSL 证书地址。证书中的配置段,请参考:https://linuxize.com/post/secure-nginx-with-let-s-encrypt-on-centos-7/

一旦你完成了,重启 Nginx 服务:

代码语言:javascript复制
sudo systemctl restart nginx

下一步,我们需要告诉 Odoo 使用代理服务器。想要这么做,打开配置文件,并且添加下面的内容: /etc/odoo13.conf

重启 Odoo 服务并且使修改生效:

代码语言:javascript复制
sudo systemctl restart odoo13

此时,反向代理服务器配置好了,你可以通过https://example.com来访问 Odoo 了。

九、改变监听端口

这一步是可选的,但是它是一个很好的实践操作。

默认情况下,Odoo 服务监听所有网络接口的8069端口。想要禁止对 Odoo 的直接访问,你可以封锁8069端口,并且强制 Odoo 只监听本地监控。

我们将会配置 Odoo 仅仅监听 127.0.0.1。打开配置文件,添加下面的内容到文件最后面: /etc/odoo13.conf

代码语言:javascript复制
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1

保存配置文件,并且重启 Odoo 服务器,使修改生效:

代码语言:javascript复制
sudo systemctl restart odoo13

十、启用多进程

默认情况下,Odoo 工作在多线程模式。对于产品级别的部署,我们推荐修改成多进程服务器,提升稳定性,并且充分利用系统资源。

想要启用多进程,你需要编辑 Odoo 配置文件,并且设置一个非 0 的工作进程数字。工作进程数字,基于 系统中的 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命令:

代码语言:javascript复制
grep -c ^processor /proc/cpuinfo

比方说,你有一个系统,拥有 4 核心 CPU,8GB RAM 内存,和 30 个并行 Odoo 用户。

  • 30 users / 6 = **5**(5 是所需要的理论工作进程数量)
  • (4 * 2) 1 = **9**(9 是理论的最大工作进程数量)

基于上面的计算,你可以使用 5 个进程 1 个进程(Cron 进程)总共 6 个进程。

基于工作进程,计算 RAM 内存:

  • RAM = 6 * ((0.8*150) (0.2*1024)) ~= 2 GB of RAM

计算结果显示,Odoo 安装将会需要大概 2GB 内存。

想要切换到多进程模式,打开配置文件,并且添加计算值: /etc/odoo13.conf

代码语言:javascript复制
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 服务,使修改生效:

代码语言:javascript复制
sudo systemctl restart odoo13

余下的系统资源将会被分配给系统其他服务使用。在这篇指南中,我们将 Odoo,PostgreSQL 和 Nginx 安装在同一个服务器上。依赖于你的设置,你的服务器上还有其他的服务。

十一、总结

这篇指南带你浏览了如何在 Ubuntu 18.04 上的 Python 虚拟环境中 安装 Odoo 13,并使用 Nginx 作为反向代理服务器。我们展示了如何在生产环境中如何启用多进程以及优化 Odoo。

0 人点赞