odoo-服务器上的安装和部署

odoo安装和服务器部署

转载自:原文,并记录了一些自己在实操过程中常出现的一些问题及解决方法。

仅针对odoo12和ubuntu18.04
由于ubuntu禁用了root账户,初始账户可通过sudo来获得root权限,也可通过修改root密码进入root账户

sudo passwd root
su root

安装进行之前,切换到根目录

更新apt

sudo apt update
sudo apt upgrade -y

安装postgres数据库

下载并创建数据库,并让当前用户成为数据库超级用户

sudo apt install postgresql -y
sudo su -c "createuser -s $USER" postgres#指定定当前用户为postgresql的超级管理员账户

安装postgresql 10:

apt install postgresql-10-postgis-2.4 -y

有时postgres数据库服务没有启动,采用如下命令启动:

/etc/init.d/postgresql start

在WSL上,如果windows上安装了postgres,linux也安装了,linux的数据库服务可能无法启动,此时可修改数据库端口

vim /etc/postgresql/11/main/postgresql.conf

配置文件中默认端口号为5432:

port = 5432

可修改为5433或者5434(在odoo.conf文件中需要配置)

安装系统依赖

sudo apt update
sudo apt upgrade
sudo apt install git -y # 安装Git
sudo apt-get install git python3-dev python3-pip -y
sudo apt install build-essential libxslt-dev libzip-dev libldap2-dev libsasl2-dev libssl-dev -y

安装wkhtmltox

wget "https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.xenial_amd64.deb" -O /tmp/wkhtml.deb
sudo dpkg -i /tmp/wkhtml.deb
sudo apt-get -fy install # 处理依赖错误

具体安装过程:

sudo apt-get -f install
sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.debsudo dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb
sudo cp /usr/local/bin/wkhtmltoimage /usr/bin/wkhtmltoimage
sudo cp /usr/local/bin/wkhtmltopdf /usr/bin/wkhtmltopdf

安装Gdata(可选)

cd /opt/odoo
sudo wget https://pypi.python.org/packages/a8/70/bd554151443fe9e89d9a934a7891aaffc63b9cb5c7d608972919a002c03c/gdata-2.0.18.tar.gz
sudo tar zxvf gdata-2.0.18.tar.gzsudo chown -R odoo: gdata-2.0.18sudo -scd gdata-2.0.18/
python3 setup.py install
exit

安装odoo12.0源码

mkdir ~/odoo 
cd ~/odoo
git clone https://github.com/odoo/odoo.git -b 12.0 --depth=1 # 获取 Odoo 源码

安装odoo需要的python包

pip3 install -r ~/odoo-dev/odoo/requirements.txt
pip3 install num2words phonenumbers psycopg2-binary watchdog xlwt

准备独立的用户

从安全角度建议使用独立的用户运行 Odoo,这一用户不带有任何系统的特权。为此我们需要创建系统和数据库用户,使用命令如下:

sudo adduser --disabled-password --gecos "Odoo" odoo
sudo su -c "createuser odoo" postgres
createdb --owner=odoo odoo-prod

以上odoo 为用户名,odoo-prod用于运行 Odoo 实例的数据库名。odoo用户成为了odoo-prod数据库的所有者。也就说它对该数据库有创建和删除的权限,包括删除整个数据库的权限。如果你运行的是多租户服务器,应为每个租户创建一个类似 odoo 的指定系统用户。

初始化数据库

一般运行前odoo会初始化数据库,也可以手动初始化,未初始化数据可能导致静态文件加载错误

~/odoo-dev/odoo/odoo-bin -d odoo-prod

安装sass编译器

odoo12采用了sass编译,而非less

cd /usr/local/lib/
sudo git clone https://github.com/sass/sassc.git --branch 3.4.2 --depth 1
sudo git clone https://github.com/sass/libsass.git --branch 3.4-stable --depth 1
sudo git clone https://github.com/sass/sass-spec.git --depth=1
echo 'SASS_LIBSASS_PATH="/usr/local/lib/libsass"' | sudo tee -a /etc/environment
source /etc/environment
sudo make -C libsass
sudo make -C sassc
sudo make -C sassc install

less的安装如下:

sudo apt update
sudo apt upgrade
sudo apt install git -y # 安装Git
sudo apt install python3-dev python3-pip -y # Python 3 for dev
sudo apt install build-essential libxslt-dev libzip-dev libldap2-dev libsasl2-dev libssl-dev -y

设置配置文件

sudo su -c "~/odoo-12/odoo-bin -d odoo-prod --db-filter='^odoo-prod$' --without-demo=all -i base --save --stop-after-init" odoo

在启动 Odoo 服务时添加–save参数会将配置保存到~/.odoorc文件中,或在debian文件夹中的odoo.conf文件。我们将以这个文件作为服务配置的初始文件,将其保存到/etc/odoo下,使用命令如下:

sudo mkdir /etc/odoo
sudo cp /home/odoo/odoo/debian/odoo.conf /etc/odoo/odoo.conf
sudo chown -R odoo /etc/odoo
sudo chmod u=r,g=rw,o=r /etc/odoo/odoo.conf # 安全加固使用

以上命令最后一行是可选的,但它提升了系统的安全性。它确保运行 Odoo 进程的用户可以读取但无法修改配置文件。这时你将无法修改数据库主密码,但在生产服务下这不是什么问题,因为应使用list_db=False服务配置来禁用网页数据库管理员。我们还需为 Odoo 服务创建一个存储日志文件的目录。这通常放在/var/log目录下,命令如下:

sudo mkdir /var/log/odoo
sudo chown odoo /var/log/odoo

现在让我们通过如下命令编辑配置文件并确保已配置了一些重要参数:

sudo nano /etc/odoo/odoo.conf

以下是大部分重要参数的推荐值:

[options]
addons_path = /home/odoo/odoo-12/odoo/addons,/home/odoo/odoo-12/addons
admin_passwd = False
db_name = odoo-prod
dbfilter = ^odoo-prod$
http_port = 8069
list_db = False
logfile = /var/log/odoo/odoo-server.log
proxy_mode = True
without_demo = all
workers = 6

下面逐一讲解:

  • addons_path是一组逗号分隔的用于查找插件模块的路径。读取顺序为从左到右,最左边目录的优先级最高.
  • admin_passwd是访问网页客户端数据库管理功能的主密码。一定要设置复杂的密码,或者最好是设为 False来关闭这一功能。
  • db_name是在服务启动时初始化的数据库实例。
  • dbfilter用于过滤可访问的数据库,它是一个 Python 解释的正则表达式。为使用户无需弹出窗口选择数据库,并使未经身份验证的 URL 可正常运作,应设置为^dbname , 比 如 d b f i l t e r = o d o o − p r o d ,比如dbfilter=^odoo-prod dbfilter=odooprod。它支持%h和%d占位符,由 HTTP 请求主机名和子域名进行替换。
  • http_port是服务器监听的端口号,默认使用的是8069
  • list_db = False在 RPC级别和 UI 上屏蔽数据库列表,并屏蔽数据库管理界面以及相应的 RPC 功能。
  • logfile是服务日志写入的位置。对于系统服务,一般位于/var/log文件夹内。如果留空,日志会转而在标准输出中打印。
  • proxy_mode在需要反向代理访问时应设为True,我们需要用到反向代理。
  • without_demo在生产环境中应进行设置,这样新建的数据库中不会带有演示数据。
  • workers的值在大于等于2时启用多进程,一会儿我们会进一步的讨论。
    从安全角度看,admin_passwd=False和list_db=False选项尤为重要。它们屏蔽掉对数据库管理功能的网页端访问,在生产环境和面向外网的 Odoo 服务中都应进行设置。

以下也是会用到的参数:

  • data_dir是会话数据和附件存储的路径,记住将备份放在这里
  • http_interface设置监听的地址。默认监听0.0.0.0,但在使用反向代理时应设置为127.0.0.1来仅响应本地请求。Odoo 11中引入它来代替淘汰了的xmlrpc_interface参数。
  • 我们可通过-c或–config选项来检查运行服务的设置:
sudo su -c "~/odoo-12/odoo-bin -c /etc/odoo/odoo.conf" odoo

通过上述设置运行 Odoo 不会在终端中有任何输出,因为修改都写到了配置文件中定义的日志文件中了。要追踪服务的操作,我们需要在终端中运行如下命令:

sudo tail -f /var/log/odoo/odoo-server.log

如果运行时出现database not initialized的error,需要在运行时加入参数:

sudo su -c "~/odoo-12/odoo-bin -c /etc/odoo/odoo.conf -i base" odoo 

设置 Odoo 为系统服务

创建systemd服务

如果你使用的是较近的操作系统,如Debian 8或Ubuntu 16.04,你的启动服务就应该是systemd。要在系统中添加服务,只需创建一个描述服务的文件。我们创建/lib/systemd/system/odoo.service文件并加入如下内容:

[Unit]
Description=Odoo
After=postgresql.service
 
[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/home/odoo/odoo-12/odoo-bin -c /etc/odoo/odoo.conf
 
[Install]
WantedBy=multi-user.target

下一步我们需要使用如下命令来注册这个新服务:

sudo systemctl enable odoo.service

使用如下命令启动该服务:

sudo systemctl start odoo

使用如下命令检查该服务状态:

sudo systemctl status odoo

最后,如需停止服务,请使用如下命令:

sudo systemctl stop odoo
创建Upstart或sysvinit 服务

老版本Linux系统(ubuntu16.04以下的版本),如需请至原博查找

使用命令行检查 Odoo 服务

现在我们可以确定Odoo实例是否运行以及是否能正常对请求进行响应。如果Odoo正常运行,我们应该可以得到响应并且日志文件中不会报错。在服务器上通过如下命令可检测 Odoo 是否对HTTP请求进行响应:

curl http://localhost:8069
<html><head><script>window.location = '/web' + location.hash;</script></head></html>

此外通过如下命令可查看日志文件的内容:

sudo less /var/log/odoo/odoo-server.log

你还可以使用tail -f 来实时查看日志文件中新增的内容:

sudo tail -f /var/log/odoo/odoo-server.log

设置 Nginx 反向代理

首先,我们应当安装Nginx,我们需要它监听默认的HTTP端口,所以需要确保没有被其它服务所占用。执行如下命令应该会报错:

$ curl http://localhost
curl: (7) Failed to connect to localhost port 80: Connection refused

如果没有收到错误,应当禁用相应服务来让Nginx使用该端口。例如,关闭已有的Apache服务,使用sudo service apache2 stop。更好的选择是从服务器上删除该服务或重新配置让其监听其它端口,这样Nginx就可以正常使用HTTP和HTTPS端口(80 and 443) 了。

一旦完成上述操作,就可以安装Nginx了:

sudo apt-get install nginx -y
sudo service nginx start # 如尚未启动,启动Nginx服务

要确定Nginx是否正确运行,通过浏览器访问或在服务上执行curl http://localhost应该可以得到一个Welcome to nginx页面。
Nginx配置文件和Apache的方式基本相同,存储在/etc/nginx/available-sites/中,并可通过在/etc/nginx/enabled-sites/中添加软链接来激活。注意应同时关闭Nginx安装时默认带有的配置:

sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/odoo
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo

使用nano或vi等编辑器来编辑 Nginx配置文件:

sudo nano /etc/nginx/sites-available/odoo

一个基本的针对Odoo服务的Nginx配置文件如下例所示:

upstream odoo {
    server 127.0.0.1:8069;
}
upstream odoochat {
    server 127.0.0.1:8072;
}
server {
     listen 80;
     # Add Headers for odoo proxy mode
     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;

     # log
     access_log /var/log/nginx/odoo.access.log;
     error_log /var/log/nginx/odoo.error.log;
     # Redirect longpoll requests to odoo longpolling port
     location /longpolling {
        proxy_pass http://odoochat;
     }
     # Redirect requests to odoo backend server
     location / {
         proxy_redirect off;
         proxy_pass http://odoo;
     }
     # common gzip
    gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

补充:添加域名请在server 配置区内添加对 server_name 的配置
首先为Odoo服务添加了upstream配置,监听了默认端口8069和8072。8069用于网页客户端和RPC请求,8072用于多进程时 Odoo 实时消息所需的长轮询(long polling)请求。

Nginx应在默认HTTP端口80上接收访问流量,然后重定向到upstream odoo服务中。这在server配置区中进行了定义。/longpolling 地址的访问流量会传递到upstream odoochat,剩余的流量则传递到upstream odoo。这里我们还添加了一些请求头的信息,这样 Odoo 后台服务就会知道这些是经过代理的流量。

出于安全考虑,应确保proxy_mode参数设为True。这是因为在Nginx作为代理时,所有的请求都会认为是来自本地而不是远程 IP 地址。在代理中设置X-ForwardedFor头以及启动–proxy-mode可解决这一问题。但是,如果不在代理级别强制header就启用–proxy-mode 会让其他人可以伪装远程地址。

在配置文件的最后,可以看到两条gzip相关的命令,它们用于对一些文件进行压缩,提升性能。可通过如下命令测试配置是否正确:

$ sudo nginx -t   #出现以下提示说明配置成功
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果出现错误,请检查配置文件中输入是否正确。常见的问题是默认的HTTP被其它服务所占用,如Apache或默认的Nginx网站,所以在重启Nginx服务前先通过本文中的命令确保并没有这种问题。在完成处理后,可使用如下命令重新加载新的配置:

sudo /etc/init.d/nginx reload

通过如下命令可确认 Nginx 是否将访问流量重定向到了后台Odoo服务中:

$ curl http://localhost
<html><head><script>window.location = '/web' + location.hash;</script></head></html>

配置HTTPS安全服务

网站数据不应在因特网中以普通文件进行传输,在将Odoo网页服务暴露在网络中时,我们应使用HTTPS协议来对数据进行加密。有时可使用自签署证书。但注意自签署证书可能会带来安全风险,比如中间人攻击(Man-in-the-Middle Attack),因此有些浏览器会不接受该证书。

更健壮的解决方案是使用认证的证书机构所签署的证书,在运行商业或电商网站时这就尤为重要了。

  • 创建自签署 SSL 证书
    下一步,我们应安装证书来启用SSL。创建一个自签署证书,可使用如下命令:
$ sudo mkdir /etc/ssl/nginx && cd /etc/ssl/nginx
$ sudo openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes
$ sudo chmod a-wx * # make files read only
$ sudo chown www-data:root * # access only to www-data group

上述命令创建一个/etc/ssl/nginx目录以及不带密码的自签署SSL证书。在运行openssl命令时,会要求用户输入其它信息,然后会生成一个证书和密钥文件。最后,将这些文件的所有权赋予用于运行网页服务的www-data用户。

  • 在 Nginx上配置HTTPS访问
    既然我们已经有了SSL证书,就可以配置 Nginx 来使用它了。要强制使用HTTPS,需要将所有的 HTTP 访问重定向到HTTPS。将前面的server区中替换为如下内容:

    server {
        listen 80;
        rewrite ^(.*) https://$host$1 permanent;
    }
    

    现在,如果重新加载Nginx配置并在浏览器中访问服务的话,将会看到http://地址被转换成了https:// 地址。但该地址不会返回任何内容,我们需要正确地配置HTTPS服务,可通过添加如下服务器配置来实现:

    server {
        listen 443;
        # Add Headers for odoo proxy mode
        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 on;
        ssl_certificate /etc/ssl/nginx/server.crt;
        ssl_certificate_key /etc/ssl/nginx/server.key;
        ssl_session_timeout 30m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCMSHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSAAES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-
        SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-
        SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-
        SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHEDSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-
        SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-
        SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-
        SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-
        SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_prefer_server_ciphers on;
    
        # log
        access_log /var/log/nginx/odoo.access.log;
        error_log /var/log/nginx/odoo.error.log;
        # Redirect longpoll requests to odoo longpolling port
        location /longpolling {
            proxy_pass http://odoochat;
        }
    
        # Redirect requests to odoo backend server
        location / {
            proxy_redirect off;
            proxy_pass http://odoo;
        }
        
        # common gzip
        gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
        gzip on;
    }
    

    以上配置代码会监听HTTPS端口并使用/etc/ssl/nginx/ 证书文件来对数据进行加密。这与我们在设置 Nginx 反向代理 中看到的server 配置区相似。如果重新加载配置,我们的 Odoo 服务将通过HTTPS进行运作,如以下命令所示:

    	$ sudo nginx -t
    	nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    	nginx: configuration file /etc/nginx/nginx.conf test is successful
    	$ sudo service nginx reload # or: sudo systemctl reload nginx
    	* Reloading nginx configuration nginx
    	...done.
    	$ curl -k https://localhost
    	<html><head><script>window.location = '/web' + location.hash;</script></head></html>
    

    最后部分的输入可用于确认Odoo客户端正通过HTTPS进行访问。

  • 缓存静态内容
    我们可以配置 Nginx 来缓存服务端静态文件,这样再次请求时就可以访问Nginx 中的缓存,而无需将请求传递到upstream odoo服务中。启用静态内容缓存可带来更快的响应时间并减少 Odoo 服务的工作负载。要启用这一设置,在location /longpolling区之前加入如下代码:

    # cache static data
        location ~* /web/static/ {
        proxy_cache_valid 200 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }
    

    通过这一些命令,静态数据就可以缓存60分钟了。在这个期间的其它请求Nginx 会直接使用缓存进行响应。

服务和模块更新

一旦 Odoo 服务运行了一段时间,就会需要对其进行升级。这包括两个步骤:获取服务或模块的新版本、执行安装。

  • 创建分阶环境
    如果你按照通过源码安装 Odoo一节正确地进行了安装,应该就可以在暂存区仓库中获取并测试新版本源码。强烈建议创建一个生产环境数据库的拷贝,并使用它进行升级测试。如果odoo-prod是我们的生产环境数据库,可通过如下命令创建一个拷贝odoo-stage:

    dropdb odoo-stage
    createdb --owner=odoo odoo-stage
    pg_dump odoo-prod | psql -d odoo-stage
    sudo su odoo
    cd ~/.local/share/Odoo/filestore/
    cp -al odoo-prod odoo-stage # create filestore hardlinks
    exit
    

    在使用以上数据库拷贝之前,应进行清理,比如停止计划动作、关闭 email 服务(包含发送和接收消息)。根据你的设置来执行这些指定步骤,但通常可使用自动化脚本来执行。记住psql可用于在命令行直接执行SQL命令,如psql -d odoo-stage -c “”。

    注:可通过createdb命令来更快地创建拷贝:createdb –owner=odoo –template=odoo-prod odoo-stage。但需要说明的是要运行该命令,不能有任何对odoo-prod数据库的连接,因此需要停止Odoo生产环境的服务。

  • 更新 Odoo 源码
    我们使用git pull 命令来从GitHub仓库获取最新的Odoo源码。在那之前,我们可以使用git tag命令来为当前使用的提交创建一个标签,这样可以可容易的对更新进行撤销,命令如下:

    sudo su odoo
    cd ~/odoo-12
    git tag --force 12-last-prod
    git pull
    

    要让代码修改生效,我们需要重启Odoo服务。而要使用数据文件的修改生效,需要对模块进行升级。通常对Odoo稳定版本的修改都是代码的修复,因此无需冒险执行模块升级。如果需要对模块升级,可使用-u 附加参数,或者是-u base,它将升级所有模块。

    现在可以启动Odoo的分阶服务了,它将使用在分阶数据库上使用升级代码:

    ~/odoo-12/odoo-bin -d odoo-stage --http-port=8080 -c /etc/odoo/odoo.conf # optionally add: -u base
    exit
    

    Odoo 分阶服务通过在8080端口上进行配置。可通过浏览器访问http://xxx:8080来检查升级代码是否正确运作。如果出现了错误,可通过如下命令来返回上一个版本:

    sudo su odoo
    cd ~/odoo-12
    git checkout 12-last-prod
    exit
    

    如果一切运行都如预期,则可安全地执行生产环境服务的升级,通常是通过重启来实现。如果想要执行实际的模块升级,建议的方法是停止服务、运行升级、再重启服务,命令如下:

    sudo service odoo stop
    sudo su -c "~/odoo-12/odoo-bin -c /etc/odoo/odoo.conf -u base --stop-after-init" odoo
    sudo service odoo start
    

    记住对在用Git 版本进行记录,可通过 git checkout回到修改前,这让我们可以在需要的时候进行回滚。强烈推荐在执行数据库升级前保存备份。在完成之后,可使用 Git 拉取新的版本到生产仓库并完成升级:

    sudo su odoo
    cd ~/odoo-12
    git tag --force 12-last-prod
    git pull
    exit
    sudo service odoo restart # or: sudo systemctl restart odoo
    

    无需频繁进行升级,但也不建议等上一年再进行升级。每几个月进行一次升级。还要记得重启服务来启用代码升级,但对模块升级则并非如此。但如果需要进行指定的漏洞修复,可以更早的进行升级。还应关注公开渠道对 Odoo 安全漏洞的披露,发 GitHub 上 Odoo 的Issues,具体可查看Security标签,或者是官方的邮件列表,可通过https://www.odoo.com/groups进行订阅。

    作为一项服务,企业版用户会更早地收到邮件通知来警报这一类问题。

你可能感兴趣的:(ODOO)