Odoo 12開發(fā)者指南第三章 服務(wù)器部署

全書完整目錄請(qǐng)見:Odoo 12開發(fā)者指南(Cookbook)第三版

本章中,我們將講解如下部分

  • 安裝Odoo來供生產(chǎn)使用
  • 為生產(chǎn)環(huán)境調(diào)整配置文件
  • 設(shè)置Odoo來作為系統(tǒng)服務(wù)
  • 使用nginx和Let's Encrypt配置反向代理及SSL
  • 使用Docker來運(yùn)行Odoo
  • 通過docker-compose運(yùn)行Odoo
  • 管理網(wǎng)站的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)

引言

第一章 安裝Odoo開發(fā)環(huán)境(從源碼輕松安裝Odoo一節(jié))凄鼻,以及第二章 管理Odoo服務(wù)器實(shí)例(標(biāo)準(zhǔn)化你的實(shí)例目錄布局一節(jié))中恤磷,我們探討了開發(fā)環(huán)境的設(shè)置。生產(chǎn)環(huán)境的要求與其會(huì)稍有不同野宜。本章講解Odoo部署的具體內(nèi)容扫步。

安裝Odoo來供生產(chǎn)使用

在生產(chǎn)階段安裝Odoo與為開發(fā)安裝Odoo并沒有很大的區(qū)別。但有些可用的方法匈子,這部分中將提供一個(gè)類似于開發(fā)環(huán)境的安裝河胎。

準(zhǔn)備工作

我們預(yù)設(shè)你已有準(zhǔn)備好了一個(gè)開發(fā)實(shí)例。這部分中我們假設(shè):

  • 你實(shí)例的這個(gè)項(xiàng)目以與第二章 管理Odoo服務(wù)器實(shí)例標(biāo)準(zhǔn)化你的實(shí)例目錄布局所建議的方式進(jìn)行管理虎敦。我們將使用https://github.com/你的登錄名/project.git游岳。這個(gè)倉庫應(yīng)包含該實(shí)例在開發(fā)時(shí)所使用的配置文件政敢,該實(shí)例的具體插件以及在該項(xiàng)目上下文你所創(chuàng)建的幫助腳本。

    ??注意:
    如果你項(xiàng)目的配置文件包含安全信息胚迫,如密碼喷户,則不應(yīng)將該項(xiàng)目推送到GitHub這樣的公共服務(wù)上。而應(yīng)使用內(nèi)部Git倉庫或私有GitHub項(xiàng)目访锻。

  • 部署服務(wù)器運(yùn)行著Debian Stretch(但使用做過一些修改的衍生發(fā)行版應(yīng)該也可以運(yùn)行褪尝,如Ubuntu,更多信息請(qǐng)參見第一章 安裝Odoo開發(fā)環(huán)境)期犬。

  • 你通過使用ssh或sudo擁有最終服務(wù)器的root權(quán)限河哑。如果沒有該權(quán)限,則應(yīng)找到系統(tǒng)管理員來協(xié)助你對(duì)部署服務(wù)器做相關(guān)配置龟虎。

  • 你知道最終的完全限定域名(FQDN)并可通過它來訪問該服務(wù)器璃谨。

如何操作...

你需要執(zhí)行如下步驟來為生產(chǎn)環(huán)境安裝Odoo(譯者注:GitHub 腳本):

  1. 以root權(quán)限安裝并構(gòu)建如下依賴:
# apt-get update
    # apt-get install git python3.5 postgresql nano virtualenv \
     gcc python3.5-dev libxml2-dev libxslt1-dev \
     libevent-dev libsasl2-dev libldap2-dev libpq-dev \
     libpng-dev libjpeg-dev \
     xfonts-75dpi xfonts-base wget xz-utils
    # wget -O wkhtmltox.tar.xz \
    https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
    # tar xvf wkhtmltox.tar.xz
    # mv wkhtmltox/lib/* /usr/local/lib/
    # mv wkhtmltox/bin/* /usr/local/bin/
    # mv wkhtmltox/share/man/man1 /usr/local/share/man/
  1. 以root用戶創(chuàng)建一個(gè)名為odoo的用戶:
# adduser odoo
  1. 配置PostgreSQL數(shù)據(jù)庫:
# sudo -u postgres createuser odoo
    # sudo -u postgres createdb -O odoo odoo_project
  1. 以odoo用戶克隆項(xiàng)目倉庫:
# su odoo
    $ mkdir ~/odoo-prod
    $ cd ~/odoo-prod
    $ git clone https://github.com/yourlogin/project.git project
    $ mkdir -p project/src
  1. 以odoo用戶,克隆Odoo源代碼:
$ cd project/src
    $ git clone -b 12.0 --single-branch https://github.com/odoo/odoo.git odoo
  1. 創(chuàng)建virtualenv并安裝依賴:
$ virtualenv -p python3 ~/env-odoo-12.0
    $ source ~/env-odoo-12.0/bin/activate
    $ pip3 install -r odoo/requirements.txt
  1. 在project/src子目錄中克隆所有第三方插件倉庫:
$ git clone -b 12.0 https://github.com/OCA/partner-contact.git
  1. 創(chuàng)建~/odoo-prod/project/bin目錄:
$ mkdir ~/odoo-prod/project/bin
  1. 創(chuàng)建一個(gè)腳本~/odoo-prod/project/bin/start-odoo來在生產(chǎn)環(huán)境輕松啟動(dòng)Odoo:
#! /bin/sh
    PYTHON=~env-odoo-12.0/bin/python3
    ODOO=~odoo/odoo-prod/project/src/odoo/odoo-bin
    CONF=~odoo/odoo-prod/project/production.conf
    ${PYTHON} ${ODOO} -c ${CONF} "$@"
  1. 讓該腳本可執(zhí)行:
$ chmod +x ~/odoo-prod/project/bin/start-odoo
  1. 以root用戶卸載gcc:
# apt-get remove gcc

運(yùn)行原理...

大部分的內(nèi)容和第一章 安裝Odoo開發(fā)環(huán)境中所描述的是一樣的鲤妥,但也有一些關(guān)鍵的區(qū)別佳吞。

我們?cè)谑褂靡粋€(gè)獨(dú)立的系統(tǒng)用戶來作為Odoo的登錄用戶达舒。這讓我們可以控制誰對(duì)賬戶擁有權(quán)限丰介,例如通過配置sudo或ssh認(rèn)證密鑰的方式庄敛。它還允許我們給用戶授予盡量少的權(quán)限鸣哀,以防實(shí)例受到威脅和攻擊。

連接這一賬戶的數(shù)據(jù)庫沒有任何特權(quán) - 甚至沒有數(shù)據(jù)庫創(chuàng)建的權(quán)限堵幽。我們只需在外部創(chuàng)建數(shù)據(jù)庫一次。如果實(shí)例受到攻擊,黑客將不能在服務(wù)器上創(chuàng)建其它數(shù)據(jù)庫菇爪。

我們所創(chuàng)建的Odoo腳本將會(huì)在本章后面的設(shè)置Odoo來作為系統(tǒng)服務(wù)中使用到。它使用production.conf 配置文件柒昏,這在下一部分為生產(chǎn)環(huán)境調(diào)整配置文件中將進(jìn)行講解凳宙。

我們?cè)诓僮鞯淖詈笮遁d了gcc,這樣在黑客獲取到權(quán)限時(shí)职祷,他們將不能使用它來編譯本地的可執(zhí)行文件氏涩。

在這一部分的最后,你的服務(wù)尚未準(zhǔn)備就緒有梆,你需要參照本章中的為生產(chǎn)環(huán)境調(diào)整配置文件是尖、設(shè)置Odoo來作為系統(tǒng)服務(wù)配置反向代理及 SSL 的部分。

擴(kuò)展內(nèi)容...

以下為準(zhǔn)備部署你的實(shí)例時(shí)需要考慮的幾個(gè)更重要的點(diǎn)泥耀。

服務(wù)器選型

你應(yīng)該使用什么樣的服務(wù)器饺汹?基本上當(dāng)今所有的物理服務(wù)器都足以處理包含20個(gè)并發(fā)用戶的平均大小的Odoo實(shí)例。因?yàn)樘摂M機(jī)通常分配了更少的資源痰催,如果你計(jì)劃使用虛擬機(jī)兜辞,你會(huì)需要稍稍更多的關(guān)注一下迎瞧。以下是幫助你上手的幾個(gè)重要的點(diǎn)。顯然逸吵,需要對(duì)它們進(jìn)行優(yōu)化來匹配你對(duì)Odoo的使用凶硅。

一個(gè)小型Odoo實(shí)例至少需要1 GB的內(nèi)存。對(duì)于內(nèi)存分配要適當(dāng)寬松點(diǎn)扫皱,最后為服務(wù)添加2-4 GB的swap內(nèi)存也是不錯(cuò)的起點(diǎn)足绅。最少給你的服務(wù)2 個(gè)/核CPU。如果你在同一臺(tái)主機(jī)上運(yùn)行PostgreSQL服務(wù)啸罢,至少為數(shù)據(jù)庫分配4個(gè)/核 CPU 以及1 GB內(nèi)存编检。額外的CPU/核數(shù)將由Odoo的worker使用,這會(huì)在下一部分為生產(chǎn)環(huán)境調(diào)整配置文件中講解扰才。

如果你保留Git歷史記錄的話(這部分我們推薦保留)允懂,實(shí)例的源代碼將占用1-2GB的磁盤空間。文件存儲(chǔ)(配置文件中的data_dir)會(huì)隨著實(shí)例的使用不斷增長衩匣,這一增長嚴(yán)重地依賴于你的實(shí)例用來做什么蕾总。一開始分配5GB,在磁盤爆滿前你應(yīng)該會(huì)有足夠的時(shí)間來進(jìn)行磁盤使用的監(jiān)控琅捏。如果你在同一臺(tái)主機(jī)上運(yùn)行數(shù)據(jù)庫生百,給包含數(shù)據(jù)庫運(yùn)行文件的分區(qū)分配足夠的磁盤空間,50GB起柄延。

你還將為主機(jī)上數(shù)據(jù)庫和文件存儲(chǔ)的備份預(yù)留空間蚀浆。這很大程度取決于你的備份計(jì)劃,200GB是一個(gè)不錯(cuò)的初始配置搜吧。

PostgreSQL調(diào)優(yōu)

討論P(yáng)ostgreSQL的調(diào)優(yōu)不在本書的范疇內(nèi)市俊。你可能會(huì)需要閱讀Packt出版社的PostgreSQL 10管理員指南或PostgreSQL 10.0高性能等書來獲得這一個(gè)課題更深入的知識(shí)。

PostgreSQL的默認(rèn)配置通常很保守滤奈,以防止數(shù)據(jù)庫服務(wù)獨(dú)占所有的系統(tǒng)資源摆昧。在生產(chǎn)服務(wù)器上,你可以無憂地提升postgresql.conf 文件中的一些參數(shù)來獲取更好的性能蜒程。以下是你可以用于入手PostgreSQL 9.6 的一些設(shè)置:

max_connections = 80
shared_buffers = 256MB
effective_cache_size = 768MB
work_mem = 3276kB
maintenance_work_mem = 64MB
min_wal_size = 2GB
max_wal_size = 4GB
checkpoint_completion_target = 0.9
wal_buffers = 7864kB
default_statistics_target = 100

在修改了這些設(shè)置之后你需要重啟PostgreSQL(sudo /etc/init.d/postgresql restart)绅你。

pgtune工具可以幫助你找到更多的合適的配置。在線版本地址為http://pgtune.leopard.in.ua/

image.png

訪問該網(wǎng)站并填寫其中的表單:

  • DB Version:使用你所安裝的數(shù)據(jù)庫版本(默認(rèn)Debian Stretch為9.6昭躺,Ubuntu 18.04為10.5)
  • OS Type: Linux忌锯。
  • DB Type:選擇Online transaction processing system,因?yàn)镺doo使用了大量的事務(wù)领炫。
  • Total Memory (RAM):填寫你想為PostgreSQL分配的內(nèi)存汉规,如果你使用一臺(tái)獨(dú)立的服務(wù)機(jī)則接近它的所有內(nèi)存(參見下一段中有關(guān)獨(dú)立數(shù)據(jù)庫服務(wù)器的內(nèi)容了解更多詳情)。
  • Number of CPUs (core):這個(gè)參數(shù)的值為你想要為PostgreSQL分配的CPU數(shù)量/核數(shù)。
  • Number of Connections:你的數(shù)據(jù)庫服務(wù)可以接受的最大并發(fā)數(shù)针史。
  • Data Storage:數(shù)據(jù)存儲(chǔ)設(shè)備的類型晶伦。例如,SSD或HDD啄枕。

如果你的實(shí)例負(fù)載很重婚陪,可以通過將數(shù)據(jù)庫服務(wù)和Odoo服務(wù)分離到兩臺(tái)不同的主機(jī)上來獲得更佳的體驗(yàn)。不要使用同一臺(tái)物理主機(jī)上的兩個(gè)虛擬機(jī)频祝,如果你已經(jīng)碰到這種狀況時(shí)使用高速網(wǎng)絡(luò)連接的兩臺(tái)物理服務(wù)器泌参。那樣,你會(huì)需要確保數(shù)據(jù)庫服務(wù)器主機(jī)上pg_hba.conf文件允許來自O(shè)doo服務(wù)器的密碼驗(yàn)證連接常空,并且postgresql.conf文件允許PostgreSQL服務(wù)在網(wǎng)卡上監(jiān)聽這兩臺(tái)服務(wù)器沽一。

源碼版本

在克隆Odoo和第三方依賴時(shí),你會(huì)想要確保使用與開發(fā)環(huán)境中所使用的相同修訂版本漓糙。有幾種實(shí)現(xiàn)方式:

  • 你可以在一個(gè)文件中手動(dòng)記錄本地修訂的SHA1版本铣缠,在項(xiàng)目倉庫中進(jìn)行記錄,并確保你在生產(chǎn)服務(wù)器上使用相同的修訂版本昆禽。
  • 你可以使用自己的GitHub倉庫中對(duì)這些倉庫復(fù)制的標(biāo)簽或分支蝗蛙。
  • 你可以使用git submodule來綁定你項(xiàng)目倉庫中的這些修訂版本(訪問https://git-scm.com/book/en/v2/Git-Tools-Submodules來獲取這個(gè)很順手的工具的文檔)。

??為什么不使用Odoo所提供的Linux發(fā)行包醉鳖?

如果這么做捡硅,你會(huì)上手很快,因?yàn)楹芏嗍虑榘l(fā)行包都會(huì)替你處理好盗棵。但是壮韭,使用打包的資源會(huì)帶來一些問題。最重要的是纹因,你不能輕松地為Odoo源代碼打補(bǔ)丁喷屋,通過源代碼運(yùn)行時(shí)則更為容易。沒錯(cuò)辐怕,這不是你需要日常做的事逼蒙,但能夠使用標(biāo)準(zhǔn)開發(fā)工具來完成這一任務(wù)从绘,而不是手動(dòng)地在生產(chǎn)服務(wù)器上應(yīng)用并跟蹤補(bǔ)丁寄疏,會(huì)有巨大的幫助并節(jié)約寶貴的時(shí)間。

備份

這一部分不講解備份僵井。至少你應(yīng)使用服務(wù)器上的cron任務(wù)來進(jìn)行每天的備份陕截。一個(gè)簡(jiǎn)單且基礎(chǔ)的方案是以root用戶運(yùn)行crontab -e 來編輯 crontab文件并添加如下代碼:

@daily su postgres -c pg_dumpall | gzip >\
 /backups/postgresql-$(date +%u).dump.gz
@daily tar czf /backups/odoo-filestore-$(date +%u).tgz \
/home/odoo/odoo-prod/project/filestore

不要忘記創(chuàng)建這個(gè)/backups目錄。備份文件不應(yīng)存儲(chǔ)在相同的硬盤上批什,理想情況下农曲,這些文件應(yīng)鏡像到在不同物理空間的服務(wù)器上。定期檢查這些備份,保留不能還原的備份文件是沒有意義的乳规。

推薦的方案是保留最近7天的每日備份形葬,這表示如果問題出現(xiàn)的話你會(huì)丟失大約一天的運(yùn)行數(shù)據(jù)。PostgreSQL有更高級(jí)的方案可允許基于時(shí)間點(diǎn)的故障恢復(fù)(PITR)暮的。你可以在Packt出版社的PostgreSQL 9 Admin Cookbook一書了解到更多信息笙以。類似地,有很多可用于文件備份Linux的工具冻辩,如duplicity(http://duplicity.nongnu.org/)猖腕,會(huì)讓管理更容易。

為生產(chǎn)環(huán)境調(diào)整配置文件

第一章 安裝Odoo開發(fā)環(huán)境中恨闪,我們了解了如何將實(shí)例配置保存到一個(gè)文件中倘感。很多參數(shù)我們都使用了默認(rèn)值,并且如果你照著第二章 管理Odoo服務(wù)器實(shí)例標(biāo)準(zhǔn)化你的實(shí)例目錄布局以及本章中安裝Odoo來供生產(chǎn)使用小節(jié)來安裝生產(chǎn)環(huán)境的話咙咽,你應(yīng)該會(huì)在生產(chǎn)環(huán)境中有著相同的配置文件老玛。這一節(jié)展示如何獲取一個(gè)適合于正式環(huán)境的配置文件。

準(zhǔn)備工作

我們假設(shè)你已經(jīng)通過安裝Odoo來供生產(chǎn)使用一節(jié)在生產(chǎn)服務(wù)器上安裝了Odoo犁珠。假設(shè)你在與Odoo相同的服務(wù)器上運(yùn)行PostgreSQL逻炊。

你可以安裝pwgen小工具來生成隨機(jī)密碼。

我們這里按照在生產(chǎn)服務(wù)器上運(yùn)行它們來描述這些步驟犁享,但也可以在你的開發(fā)服務(wù)器上進(jìn)行執(zhí)行余素,因?yàn)樾碌呐渲梦募惶砑拥搅宋覀冇糜诓渴鸬缴a(chǎn)環(huán)境的項(xiàng)目的Git倉庫中。

如何操作...

要為生產(chǎn)環(huán)境調(diào)整配置文件炊昆,你需要按照如下步驟:

  1. 在開發(fā)環(huán)境的基礎(chǔ)上新建一個(gè)生產(chǎn)環(huán)境的配置文件:
$ cd ~/odoo-prod/project
    $ cp development.conf production.conf
  1. 編輯生產(chǎn)環(huán)境配置production.conf 文件桨吊。
  2. 修改addons_path來匹配生產(chǎn)環(huán)境的根路徑:
addons_path = /home/odoo/odoo-prod/project/src/odoo/addons, /home/odoo/odoo-prod/project/src/odoo/odoo/addons, /home/odoo/odoo-prod/project/src/partner-contact
  1. 修改數(shù)據(jù)路徑:
data_dir = /home/odoo/odoo-prod/project/filestore
  1. 修改服務(wù)服務(wù)日志路徑來匹配生產(chǎn)環(huán)境的根路徑:
logfile = /home/odoo/odoo-prod/project/logs/odoo.log
  1. 配置日志輪詢:
logrotate = True
  1. 配置日志處理器:
log_level = warn
    log_handler = :WARNING,werkzeug:CRITICAL,odoo.service.server:INFO
  1. 調(diào)整數(shù)據(jù)庫連接參數(shù):
db_host = False
    db_maxconn = 64
    db_name = odoo-project
    db_password = False
    db_port = False
    db_template = template1
    db_user = False
  1. 配置數(shù)據(jù)庫過濾器并禁用數(shù)據(jù)庫列出顯示:
dbfilter = odoo-project$
    list_db = False
  1. 使用pwgen生成的隨機(jī)密碼來修改master密碼
admin_password = 使用一個(gè)隨機(jī)密碼
  1. 配置Odoo來以worker進(jìn)程運(yùn)行:
workers = 4
    # limit_memory_hard: 4GB
    limit_memory_hard = 4294967296
    # limit_memory_soft: 640MB
    limit_memory_soft = 671088640
    limit_request = 8192
    limit_time_cpu = 120
    limit_time_real = 300
  1. 僅監(jiān)聽本地網(wǎng)卡:
http_interface = 127.0.0.1
  1. 保存該文件并將其添加至Git倉庫:
$ git add production.conf
    $ git commit -m "add production configuration file"

運(yùn)行原理...

這一節(jié)中的使用的大部分參數(shù)都在第一章 安裝Odoo開發(fā)環(huán)境在一個(gè)文件中存儲(chǔ)實(shí)例配置中進(jìn)行了講解。

在第3, 4和5步中凤巨,我們修改了插件路徑和日志文件视乐。如果你用于開發(fā)的環(huán)境與生產(chǎn)環(huán)境有著相同的布局,這是要求做的敢茁,因?yàn)镺doo在配置文件中預(yù)期的是絕對(duì)路徑佑淀。

第6步啟動(dòng)了日志輪詢。這會(huì)引發(fā)Odoo配置日志模塊來實(shí)現(xiàn)服務(wù)日志的按日存檔彰檬,并且保存日志30天伸刃。對(duì)生產(chǎn)服務(wù)器這非常有用,可以避免日志最終消耗掉所有的可用磁盤空間逢倍。

第7步配置了日志級(jí)別捧颅。這里建議的配置非常保守,僅會(huì)記錄WARNING級(jí)別以上的日志信息较雕,除werkzeug (CRITICAL) 和odoo.service.server (INFO)外碉哑。有關(guān)日志過濾的更多信息,參見第八章 調(diào)試,那里你會(huì)發(fā)現(xiàn)生成服務(wù)日志幫助調(diào)試方法一節(jié)扣典∽北希可根據(jù)自身情況進(jìn)行自由調(diào)整。

第8步配置數(shù)據(jù)庫設(shè)置贮尖。如果你的PostgreSQL數(shù)據(jù)庫服務(wù)在本地運(yùn)行并且按照前面部分所講解的進(jìn)行設(shè)置這會(huì)生效设塔。如果你在其它服務(wù)器上運(yùn)行PostgreSQL,會(huì)需要將False值替換為你的數(shù)據(jù)庫實(shí)例對(duì)應(yīng)的連接配置远舅。

第9步通過配置數(shù)據(jù)庫過濾器來限制該實(shí)例的可用數(shù)據(jù)庫闰蛔。我們還禁用了列出數(shù)據(jù)庫,這并不是嚴(yán)格必需的图柏,因?yàn)槲覀冊(cè)赿bfilter中設(shè)置的正則表達(dá)式僅會(huì)匹配單個(gè)數(shù)據(jù)庫序六。但這樣做仍是一件好事,可以避免向任何人展示數(shù)據(jù)庫列表蚤吹,來避免有用戶連接到錯(cuò)誤的數(shù)據(jù)庫上例诀。

第10步為實(shí)例設(shè)置了一個(gè)足夠復(fù)雜的master密碼。master密碼用于通過用戶界面管理數(shù)據(jù)庫裁着,一些社區(qū)插件也使用它來作為導(dǎo)致數(shù)據(jù)損失的動(dòng)作執(zhí)行前進(jìn)行安全驗(yàn)證繁涂。你極其需要設(shè)置這一足夠復(fù)雜的值。我們推薦使用pwgen小工具來生成一個(gè)隨機(jī)密碼二驰,但任意其它方法都有效扔罪。

第11步配置Odoo使用worker進(jìn)程進(jìn)行運(yùn)行。在這種模式下桶雀,Odoo會(huì)創(chuàng)建一些worker進(jìn)程(本例中為4個(gè))來處理HTTP請(qǐng)求矿酵。這與默認(rèn)配置相比有幾個(gè)優(yōu)勢(shì),其中請(qǐng)求由單獨(dú)的線程進(jìn)行處理矗积,如下:

  • 請(qǐng)求可更好地使用服務(wù)器的多個(gè)或多核 CPU 來并行進(jìn)行處理(Python多線程由于Python解釋器中的全局鎖(GIL)的存在而受到限制)全肮。
  • 可以根據(jù)資源消耗終止其中的一個(gè)worker進(jìn)程。下表中給出了可以配置的不同資源限制:
參數(shù) 推薦值 描述
limit_memory_hard 4294967296 這是一個(gè)worker進(jìn)程可以分配的最大內(nèi)存值棘捣。我們推薦使用4 GB辜腺,因?yàn)镺doo所啟動(dòng)的一些進(jìn)程可以分配大量的內(nèi)存。
limit_memory_soft 671088640 如果一個(gè)worker 進(jìn)程最終的消耗超過這一限制(我們的設(shè)置為640 MB)乍恐,在它結(jié)束處理當(dāng)前請(qǐng)求后會(huì)被終止评疗。
limit_request 8192 一個(gè)worker進(jìn)程會(huì)在處理這么多請(qǐng)求之后被終止
limit_time_cpu 120 這是允許處理一個(gè)請(qǐng)求的最長 CPU 時(shí)間。
limit_time_real 300 這是允許處理一個(gè)請(qǐng)求的最長真實(shí)時(shí)間禁熏。

第12步配置內(nèi)部Odoo網(wǎng)頁服務(wù)僅監(jiān)聽本地接口壤巷。這表示該實(shí)例無法通過其它服務(wù)器訪問邑彪。這讓我們可以在相同服務(wù)器上配置反向代理來訪問該服務(wù)瞧毙,并強(qiáng)制加密連接。參見本章后面的配置反向代理及SSL一節(jié)。

小貼士:如果你不確定應(yīng)為服務(wù)設(shè)置多少個(gè)worker進(jìn)程宙彪,使用以下公式為你的系統(tǒng)計(jì)算一個(gè)worker進(jìn)程數(shù):

No. of workers = (No. of CPU * 2) + 1

這里矩动,一個(gè)worker進(jìn)程可以處理大約6個(gè)并發(fā)用戶。

擴(kuò)展內(nèi)容...

在使用worker進(jìn)程運(yùn)行時(shí)释漆,你可能會(huì)碰到如下針對(duì)該模式的具體問題:

  • 如果你在使用worker進(jìn)程運(yùn)行時(shí)獲得一些wkhtmltopdf未如預(yù)期運(yùn)行的奇怪報(bào)錯(cuò)(例如悲没,以狀態(tài)碼-11 或 -6過早的退出 ),那么很有可能你所設(shè)置的limit_memory_hard的值過低男图。試著做一些提升示姿,因?yàn)槟J(rèn)值是出名的過低。
  • 如果你在執(zhí)行長操作時(shí)得到超時(shí)錯(cuò)誤(包括CSV導(dǎo)入逊笆、導(dǎo)出以及插件模塊安裝)栈戳,試著提升limit_time_cpu和limit_time_real參數(shù),因?yàn)橥瑯铀鼈兊哪J(rèn)值也相當(dāng)?shù)湍疡伞H绻阌蟹聪虼?子檀,還應(yīng)檢查其超時(shí)限制(反向代理中的過低限制不會(huì)阻止事務(wù)的完成,但會(huì)在用戶的瀏覽器中展示錯(cuò)誤消息乃戈,這會(huì)導(dǎo)致他們嘗試重新導(dǎo)入并為服務(wù)器帶來不必要的負(fù)載)褂痰。
  • 如果你的實(shí)例在打印報(bào)表時(shí)完全卡住,試著提升worker進(jìn)程數(shù)症虑。這可能是由wkhtmltopdf在打印時(shí)占用所有可用worker進(jìn)程所導(dǎo)致的死鎖缩歪。

小貼士:不論什么情況下,保持在配置到生產(chǎn)環(huán)境前進(jìn)行設(shè)置的驗(yàn)證谍憔,并記住在啟用worker進(jìn)程時(shí)測(cè)試打印報(bào)表驶冒。

設(shè)置Odoo來作為系統(tǒng)服務(wù)

對(duì)于一個(gè)生產(chǎn)實(shí)例,在機(jī)器重啟時(shí)保持Odoo服務(wù)的啟動(dòng)非常的重要韵卤。在當(dāng)前的Linux系統(tǒng)中骗污,這通過systemd的配置來實(shí)現(xiàn)。如果你的操作系統(tǒng)不使用systemd沈条,則需要查看文檔來獲取這一結(jié)果需忿。

準(zhǔn)備工作

我們假定你按著前面部分進(jìn)行安裝和Odoo實(shí)例的配置,尤其是Odoo的部署源代碼應(yīng)為/home/odoo/odoo-prod/project/src/odoo/蜡歹,以及實(shí)例的配置文件應(yīng)為/home/odoo/odoo-prod/project/production.conf屋厘。該腳本還使用了安裝Odoo來供生產(chǎn)使用一節(jié)第9步中所創(chuàng)建的start-odoo 腳本。

如何操作...

你需要執(zhí)行如下步驟配置systemd來啟動(dòng)Odoo:

  1. 使用root權(quán)限(sudo su)月而,創(chuàng)建一個(gè)名為/lib/systemd/system/odoo.service的文件并添加如下內(nèi)容:
[Unit]
    Description=Odoo 12.0
    After=postgresql.service

    [Service]
    Type=simple
    User=odoo
    Group=odoo
    WorkingDirectory=/home/odoo/odoo-prod/project
    ExecStart=/home/odoo/odoo-prod/project/bin/start-odoo

    [Install]
    WantedBy=multi-user.target
  1. 使用root權(quán)限汗洒,注冊(cè)該服務(wù):
# systemctl enable odoo.service
  1. 使用root權(quán)限,啟動(dòng)服務(wù):
# service odoo start
  1. 可運(yùn)行如下命令來停止服務(wù):
# service odoo stop

運(yùn)行原理...

systemd 使用一些配置文件或腳本來識(shí)別在服務(wù)啟動(dòng)時(shí)必須運(yùn)行的程序父款。這一節(jié)中所提供的配置需要做一些微調(diào)來適配你自己實(shí)例的路徑溢谤。

??別忘記重啟服務(wù)并查看Odoo是否正常啟動(dòng)瞻凤!

使用nginx和Let's Encrypt配置反向代理及SSL

在你通過HTTP協(xié)議訪問Odoo服務(wù)時(shí),用戶瀏覽器與Odoo服務(wù)之前的所有信息都暴露在網(wǎng)絡(luò)中世杀,因此使用HTTPS協(xié)議來對(duì)傳輸信息進(jìn)行加密非常之有必要阀参。Odoo無法原生地實(shí)現(xiàn)這點(diǎn),有必要配置反向代理來為Odoo處理加密和解密瞻坝。這節(jié)向您展示使用nginx(http://nginx.net)來進(jìn)行實(shí)現(xiàn)蛛壳。我們還將向你展示在你的組織沒有自己簽署 SSL 證書的方式時(shí)使用Let's Encrypt(https:// letsencrypt.org)來管理證書和更新證書。

相關(guān)文章:

使用Let’s Encrypt免費(fèi)安裝SSL證書

Linode主機(jī)安裝 Let’s Encrypt

Nginx基礎(chǔ)知識(shí)和常見問題

準(zhǔn)備工作

你應(yīng)該知道服務(wù)器的對(duì)外名稱以及相應(yīng)地配置DNS所刀。這一節(jié)中衙荐,我們將使用 odoo.example.com來作為我們的服務(wù)器名。你將需要使用自己的域名替換它浮创。

如果你使用 Let's Encrypt來獲取SSL證書的話確保外界可通過DNS名稱訪問到你服務(wù)器的80和443端口赫模。

如何操作...

你需要按照如下步驟來通過NGINX使用HTTPS訪問你的實(shí)例:

譯者注:下例中安裝 ssl 證書需在公網(wǎng)進(jìn)行,因Let's Encrypt會(huì)通過 DNS 驗(yàn)證域名的有效性蒸矛,相關(guān)文件請(qǐng)見 GitHub 倉庫

  1. 使用root權(quán)限瀑罗,安裝Let's Encrypt客戶端certbot:
# apt-get update
    # apt-get install software-properties-common -y
    # add-apt-repository universe
    # add-apt-repository ppa:certbot/certbot
    # apt-get update
    # apt-get install certbot python-certbot-nginx -y
  1. 使用root權(quán)限,從Let's Encrypt請(qǐng)求一個(gè)證書(不要忘記修改email和服務(wù)器地址):
# certbot certonly --standalone -n --agree-tos\
     -m youremail@example.com -d odoo.example.com
**譯者注:**安80端口被占用可能會(huì)報(bào)Problem binding to port 80: Could not bind to IPv4 or IPv6.雏掠,需關(guān)閉相應(yīng)服務(wù)如:service nginx stop
  1. 使用root權(quán)限斩祭,安裝nginx:
 # apt-get install nginx -y
  1. 在/etc/nginx/sites-available/odoo-ssl中創(chuàng)建一個(gè)配置文件并添加上游引用如下:
upstream odoo {
        server 127.0.0.1:8069;
    }
    upstream odoochat {
        server 127.0.0.1:8072;
    }
  1. 在相同的文件中,添加rewrite規(guī)則來將http重寫向到https網(wǎng)站:
server {
         listen 80;
         server_name odoo.example.com;
         rewrite ^(.*) https://$host$1 permanent;
    }
  1. 在相同的文件中乡话,添加如下nginx配置來通過https提供Odoo實(shí)例的服務(wù):
server {
         listen 443;
         server_name odoo.example.com;
         proxy_read_timeout 720s;
         proxy_connect_timeout 720s;
         proxy_send_timeout 720s;

         # 在這里放置第7到12步的配置
    }
  1. 在server版塊中添加SSL配置:
# SSL Configuration
    ssl on;
    ssl_certificate /etc/letsencrypt/live/odoo.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/odoo.example.com/privkey.pem;
    ssl_session_timeout 30m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384";
    ssl_prefer_server_ciphers on;
  1. 在server版塊中添加日志文件配置:
# Add log files
    access_log /var/log/nginx/odoo.access.log;
    error_log /var/log/nginx/odoo.error.log;
  1. 通過在server版塊中添加如下配置來啟用gzip:
# enable gzip
    gzip on;
    gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
  1. 在server版塊中添加代理header配置:
# Add 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;
  1. 在server版塊中添加反向代理配置:
# Manage longpolling on 8072 port
    location /longpolling {
        proxy_pass http://odoochat;
    }
    # Redirect requests to odoo server on 8069
    location / {
        proxy_redirect off;
        proxy_pass http://odoo;
    }
  1. 通過在server版塊中添加如下配置來啟用靜態(tài)緩存:
# Enable static cache
    location ~* /web/static/ {
        proxy_cache_valid 200 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }
  1. 使用root權(quán)限摧玫,添加/etc/nginx/sites-enabled/中配置文件的鏈接:
# ln -s /etc/nginx/sites-available/odoo-ssl\
     /etc/nginx/sites-enabled/odoo-ssl
  1. 使用root權(quán)限,刪除/etc/nginx/sites-enabled/default:
# rm /etc/nginx/sites-enabled/default
  1. 使用Odoo用戶绑青,編輯實(shí)例的生產(chǎn)配置文件來啟動(dòng)proxy_mode:
proxy_mode = True
  1. 使用root權(quán)限诬像,重啟你的odoo實(shí)例和nginx:
# service odoo restart
    # service nginx restart
  1. 使用root權(quán)限,創(chuàng)建一個(gè)etc/cron.d/letsencrypt計(jì)劃任務(wù)文件來確保證書會(huì)被更新闸婴,添加如下內(nèi)容(譯者注:crontab -e):
11 5 * * * certbot renew

運(yùn)行原理...

在第1步和第2步中坏挠,我們安裝了certbot并為odoo.example.com網(wǎng)站生成了SSL證書。certbot程序是一個(gè)命令行工具邪乍,簡(jiǎn)化了與letsencrypt.org交互來生成免費(fèi)SSL證書的操作降狠。完整文檔參見https://certbot.eff.org/docs/。本節(jié)中庇楞,我們使用了子命令certbot certonly榜配,它將向Let's Encrypt請(qǐng)求一個(gè)-d 選項(xiàng)所傳遞域名的簽名證書。使用-m選項(xiàng)指定你的email地址吕晌。--standalone選項(xiàng)要求certbot設(shè)置本地臨時(shí)網(wǎng)頁服務(wù)蛋褥,Let's Encrypt將嘗試與其聯(lián)系來檢查你對(duì)請(qǐng)求證書的域名的控制權(quán)。因此在托管Odoo的服務(wù)器上運(yùn)行該命令睛驳、DNS指向該服務(wù)器以及沒有防火禁用80和443端口的訪問都很重要烙心。

??這一檢查通過連接http://<yourdomain>:80/.well-known/acme來實(shí)現(xiàn)膜廊。certbot的--standalone模式創(chuàng)建一個(gè)臨時(shí)web服務(wù)監(jiān)聽該端口并能響應(yīng)請(qǐng)求,但這僅在沒有其它進(jìn)程監(jiān)聽80端口及外部防火墻允許對(duì)該端口的外部訪問通過時(shí)生效弃理。

我們使用nginx作為反向HTTP代理。進(jìn)入的HTTP和HTTPS連接都由nginx處理屎蜓,它將該請(qǐng)求的處理代理至Odoo服務(wù)痘昌。Odoo服務(wù)配置為僅監(jiān)聽本地回環(huán)接口(127.0.0.1)的8069端口來接收正常請(qǐng)求(http_port)、監(jiān)聽8072端口來接收長輪詢請(qǐng)求(longpolling_port)炬转。你可能會(huì)需要按照自己的配置來調(diào)整這些端口號(hào):

image.png

在第4步中辆苔,我們添加了/etc/nginx/sites-available/odoo-ssl這一nginx配置文件。在這個(gè)文件中扼劈,我們添加了一個(gè)上游引用 驻啤。這是對(duì)本地服務(wù)器的引用 ,我們將在下一步中使用到它荐吵。

在第5步中骑冗,我們添加了服務(wù)器配置來使用HTTP協(xié)議管理80端口進(jìn)入的連接。我們不想要通過HTTP提供網(wǎng)站服務(wù)先煎,因?yàn)閿?shù)據(jù)以純文本進(jìn)行傳輸贼涩,這表示可以嗅探出密碼。因此薯蝎,我們添加了一個(gè)URL并重寫了一條規(guī)則來將所有URL永久重定向到使用HTTPS協(xié)議加密的443端口遥倦。

第6-13步要更為復(fù)雜些,添加了配置來使用HTTPS協(xié)議處理連接占锯。以下是配置中不同版塊的詳情:

  • 第6步中的配置版塊配置服務(wù)器處理對(duì)odoo.example.com域名443端口上的請(qǐng)求袒哥。
  • 第7步中的配置版塊配置了SSL協(xié)議,加密密鑰及證書消略。
  • 第8步中的配置版塊添加了日志文件的位置堡称。在請(qǐng)求通過Nginx進(jìn)行服務(wù)提供時(shí),該文件會(huì)用于存儲(chǔ)日志艺演。
  • 第9步中添加了gzip版塊粮呢,用于壓縮文件。這對(duì)減小頁面大小發(fā)揮了重要的作用钞艇。
  • 第10步中的配置版塊添加了額外的header來對(duì)每次請(qǐng)求提供更多的信息啄寡。這些額外的header用于向Odoo服務(wù)提供更多的信息。
  • 第11步中添加了location /版塊哩照,定義了進(jìn)入的請(qǐng)求的默認(rèn)處理挺物,它們會(huì)被代碼到監(jiān)聽8069端口的Odoo服務(wù)。
  • 第11步中添加了location /longpolling版塊飘弧,用于處理以/longpolling開頭的URL的查詢识藤,它們被通過8072端口轉(zhuǎn)發(fā)到Odoo砚著。這些連接由總線(bus)插件模塊使用來給網(wǎng)頁客戶端發(fā)送通知。
  • 第12步中添加了location ~* /web/static/版塊痴昧,使用了正則表達(dá)式來匹配Odoo各模塊靜態(tài)文件的URL稽穆。這些文件很少進(jìn)行更新,因此我們讓nginx對(duì)它們進(jìn)行緩存來減輕Odoo服務(wù)器的負(fù)載赶撰。

在最后一步中舌镶,我們使用了certbot renew命令,它檢查待更新證書豪娜,并自動(dòng)更新這些證書餐胀。默認(rèn)Let's Encrypt證書的有效期是90天,還是很短的瘤载。借助于這一每天運(yùn)行的工具否灾,即將過期的證書將會(huì)自動(dòng)被更新。

image.png

擴(kuò)展內(nèi)容...

這一部分集中于nginx配置鸣奔。你可能會(huì)更熟悉其它工具墨技,如Apache網(wǎng)頁服務(wù)器和mod_proxy。這時(shí)挎狸,你自然也可以使用它們來實(shí)現(xiàn)相似的設(shè)置健提。

如果不愿意使用Let's Encrypt,而偏好于使用其它證書機(jī)構(gòu)(CA)伟叛,你可以使用如下步驟:

  1. 安裝openssl:
$ sudo apt-get install openssl
  1. 為你的服務(wù)器生成密鑰:
$ mkdir ~/sslkey
    $ openssl genrsa -out ~/sslkey/server.key 2048
  1. 生成簽署請(qǐng)求:
$ openssl req -new -key ~/sslkey/server.key\
     -out ~/sslkey/server.csr
  1. 以上的命令會(huì)接著一系列的問題詢問你的公司名和Odoo服務(wù)URL等私痹。不要填錯(cuò)了,否則你的證書將不可用统刮。
  2. 你將可以發(fā)送~/sslkey/server.csr文件到你所選擇的證書機(jī)構(gòu)(CA)紊遵。CA會(huì)向你發(fā)回一個(gè)名為server.crt的文件。
  3. 你將需要在/etc/nginx/ssl/ 目錄中存儲(chǔ)該文件以及第2步中所生成的server.key文件:
# mkdir -p /etc/nginx/ssl
    # chown www-data /etc/nginx/ssl
    # mv server.key server.crt /etc/nginx/ssl
    # chmod 710 /etc/nginx/ssl
    # chown root:www-data /etc/nginx/ssl/*
    # chmod 640 /etc/nginx/ssl/*
  1. 那么侥蒙,在本節(jié)中所提供的/etc/nginx/sitesavailable/odoo-443這一nginx配置文件中暗膜,重寫ssl_certificate和ssl_certificate_key行如下:
ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
  1. 最后,重啟nginx鞭衩。

譯者注:還有很多其它選擇学搜,如使用阿里云可直接在后臺(tái)生成一年免費(fèi)證書,下載文件配置到 Nginx中即可

其它知識(shí)

使用Docker來運(yùn)行Odoo

Docker項(xiàng)目通過提供更高級(jí)別的工具來讓Linux容器(LXC)更易于管理炬丸。這些容器可易于應(yīng)用的發(fā)布以及依賴的管理。Docker周邊有一整套生態(tài)系統(tǒng)蜒蕾,用于方便容器化應(yīng)用的部署和管理稠炬。討論這些細(xì)節(jié)在本節(jié)的范疇之外焕阿,有興趣的讀者可閱讀Packt出版社的Learning Docker來獲取更深入的講解。

相關(guān)文章:【已完結(jié)】精通 Docker 第三版中文版

這一節(jié)中首启,我們將來了解如何使用官方Odoo Docker鏡像來運(yùn)行一個(gè)開發(fā)或生產(chǎn)服務(wù)暮屡。

準(zhǔn)備工作

我們假定在你的開發(fā)機(jī)器及生產(chǎn)服務(wù)器上都安裝了Docker。在Debian GNU/Linux上安裝Docker社區(qū)版的指南參見https://docs.docker.com/install/linux/docker-ce/debian/(其它平臺(tái)的安裝指南在該頁面上也可以找到)毅桃。而在Ubuntu服務(wù)器上你可以使用如下命令來進(jìn)行安裝:

$ sudo apt-get install docker.io -y

如何操作...

按照如下步驟來通過官方Odoo鏡像來運(yùn)行Docker(譯者注:以下操作使用的是 root 賬號(hào)褒纲,非 root 用戶可以添加 sudo來執(zhí)行命令):

  1. 通過如下命令設(shè)置PostgreSQL服務(wù)docker實(shí)例:
# docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10
  1. 通過如下命令運(yùn)行PostgresSQL數(shù)據(jù)庫:
# docker start db
  1. 通過如下命令設(shè)置Odoo docker實(shí)例:
# docker run -p 8069:8069 --name odoo --link db:db -t odoo
  1. 通過如下命令運(yùn)行odoo實(shí)例:
# docker start odoo

以上命令會(huì)在8069端口上啟動(dòng)Odoo服務(wù)。在你的本地機(jī)器上疾嗅,你可以通過http://localhost:8069來訪問該odoo實(shí)例外厂。

如果你想要查看運(yùn)行中的docker容器的狀態(tài)冕象,運(yùn)行如下命令即可:

# docker ps

docker ps命令會(huì)展示類似如下的輸出:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
4c1b4e50f632        odoo                "/entrypoint.sh odoo"    10 seconds ago      Up 9 seconds        0.0.0.0:8069->8069/tcp, 8071/tcp   odoo
58854bebe4cb        postgres:10         "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes        5432/tcp                           db

運(yùn)行原理...

Docker允許你創(chuàng)建系統(tǒng)鏡像并將它們分發(fā)到其它服務(wù)器上來運(yùn)行代承。Docker鏡像通過編寫Dockerfile來創(chuàng)建,該文件描述如何在已存在的Dockerfile上添加層渐扮。Docker鏡像托管在https://hub.docker.com上论悴,在這一節(jié)中,我們使用了PostgreSQL和Odoo的官方鏡像墓律。

在運(yùn)行Odoo實(shí)例容器之前膀估,我們需要為PostgreSQL設(shè)置一個(gè)容器。在第1步中耻讽,我們運(yùn)行了PostgreSQL 10的Docker鏡像察纯。該命令會(huì)搜索這一PostgreSQL Docker鏡像。如果在你的系統(tǒng)中不存在针肥,Docker會(huì)下載它饼记。在命令中,我們傳遞了--name db選項(xiàng)慰枕。這里具则,db是該P(yáng)ostgreSQL容器的名稱。在第2步中具帮,我們啟動(dòng)了PostgreSQL的Docker容器博肋。

在第3步中,我們運(yùn)行了Odoo的Docker鏡像蜂厅。這在8069端口上運(yùn)行了Odoo實(shí)例匪凡。如是你想要以不同的配置來運(yùn)行該命令,可以使用不同的選項(xiàng)掘猿。以下是進(jìn)一步地討論如何使用自定義選項(xiàng)來運(yùn)行Odoo實(shí)例的一些示例锹雏。

運(yùn)行帶有配置文件的Odoo鏡像

你可以使用自己的配置文件來運(yùn)行Odoo實(shí)例。這樣做你會(huì)需要使用-v volume選項(xiàng)术奖。以下是通過/path/to/config/odoo.conf配置文件運(yùn)行Odoo容器的命令:

# docker run -v /path/to/config.conf:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odoo

如果你不想載入該配置文件礁遵,而是想直接使用配置選項(xiàng)轻绞,那么你可以通過在命令行中傳遞帶有 -- 的選項(xiàng),類似這樣:

# docker run -p 8069:8069 --name odoo --link db:db -t odoo --db-filter=test

運(yùn)行帶有自定義插件的Odoo鏡像

默認(rèn)Odoo容器運(yùn)行社區(qū)版插件佣耐。如果你想要使用你自己的插件模塊來運(yùn)行Odoo政勃,你可以你下面這樣在/mnt/extra-addons目錄中掛載自己的插來進(jìn)行實(shí)現(xiàn):

$ docker run -v /path/to/my_addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo

運(yùn)行多Odoo實(shí)例

如果你想在單個(gè)服務(wù)器上運(yùn)行多個(gè)Odoo實(shí)例,那么你可以通過修改容器名及暴露的端口來進(jìn)行實(shí)現(xiàn)兼砖。查看如下的命令奸远,通過以odoo1和odoo2的名稱來運(yùn)行兩個(gè)odoo容器。這些Odoo實(shí)例將分別運(yùn)行在8070和8071端口上:

# docker run -p 8070:8069 --name odoo2 --link db:db -t odoo
# docker run -p 8071:8069 --name odoo3 --link db:db -t odoo

擴(kuò)展內(nèi)容...

如果使用官方Odoo Docker鏡像安裝的服務(wù)無法滿足你的要求讽挟,那么你可以通過Dockerfile創(chuàng)建你自己的Docker鏡像懒叛。Odoo官方的Dockerfile地址為https://github.com/odoo/docker。你可以修改該Dockerfile耽梅,然后使用docker build 命令構(gòu)建Docker鏡像薛窥。

通過docker-compose運(yùn)行Odoo

在上一節(jié)中,我使用兩個(gè)Docker容器來運(yùn)行Odoo實(shí)例眼姐,PostgreSQL和Odoo容器诅迷。這一節(jié)中,我們將來了解docker-compose众旗,docker-compose是用于管理多容器Docker應(yīng)用的工具罢杉。

準(zhǔn)備工作

為使用docker-compose工具來設(shè)置Odoo,你將在系統(tǒng)中需要安裝docker-compose贡歧。在終端中執(zhí)行如下命令來在系統(tǒng)中安裝docker-compose:

$ sudo apt-get install docker-compose -y

如何操作...

根據(jù)如下命令來通過docker-compose運(yùn)行Odoo實(shí)例:

  1. 新建docker-compose.yaml文件并添加如下內(nèi)容:
version: '2'
    services:
      web:
        image: odoo:12.0
        depends_on:
          - db
        ports:
          - "8069:8069"
      db:
        image: postgres:10
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_PASSWORD=odoo
          - POSTGRES_USER=odoo
  1. 在終端中執(zhí)行如下命令來運(yùn)行Odoo實(shí)例(譯者注:root 用戶或 sudo):
# docker-compose up -d

以上命令會(huì)在8069端口上啟動(dòng)Odoo服務(wù)滩租。在你的本地機(jī)器上,你可以通過http://localhost: 8069訪問Odoo實(shí)例利朵。使用docker ps命令來查看運(yùn)行中的容器律想。

運(yùn)行原理...

docker-compose需要一個(gè)YAML文件來設(shè)置服務(wù)。在YAML文件中哗咆,你需要添加想要部署的服務(wù)的明細(xì)蜘欲。在創(chuàng)建YAML文件之后,你可以使用單條命令啟動(dòng)所有服務(wù)晌柬。

在第1步中姥份,我們?yōu)樽约旱姆?wù)創(chuàng)建了YAML文件。要運(yùn)行Odoo實(shí)例年碘,我們需要兩個(gè)容器:一個(gè)給PostgreSQL數(shù)據(jù)庫澈歉,一個(gè)給Odoo自身。在services: 版塊中我們添加了兩個(gè)服務(wù)屿衅。第一個(gè)名為web埃难。該服務(wù)用于運(yùn)行Odoo實(shí)例。在該服務(wù)中,你需要指定你想要容器化的鏡像名稱涡尘。因此忍弛,在web服務(wù)中,我們添加了odoo:12.0來作為鏡像考抄。

Odoo實(shí)例不能無數(shù)據(jù)庫運(yùn)行细疚。因此,我們需要通過depends_on鍵來指定依賴川梅。接著疯兼,我們指定了PostgreSQL的服務(wù)。為該服務(wù)指定了名稱db贫途。注意這是這是我們?cè)趙eb服務(wù)的依賴中添加的相同服務(wù)吧彪。

第二步中,我們使用了docker-compose命令來運(yùn)行該Odoo實(shí)例丢早。docker-compose命令將運(yùn)行兩個(gè)容器救氯。你可以通過docker ps命令來查看細(xì)節(jié)纳令。在運(yùn)行了該命令之后居灯,可通過https://localhost:8069來訪問Odoo濒翻。

如果你想要使用自定義插件或你自己的配置中狂,可以像如下這樣在docker compose YAML文件中指定數(shù)據(jù)卷:

version: '2'
services:
  web:
    image: odoo:12.0
    depends_on:
      - db
    ports:
      - "8069:8069"
    volumes:
       - odoo-web-data:/var/lib/odoo
       - ./config:/etc/odoo
       - ./addons:/mnt/extra-addons
  db:
    image: postgres:10
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
volumes:
  odoo-web-data:
  odoo-db-data:

該YAML文件將通過自定義插件和自定義配置來運(yùn)行Odoo實(shí)例凫碌。它還使用volumes來作為Odoo和PostgreSQL數(shù)據(jù)目錄。

擴(kuò)展內(nèi)容...

我們?cè)谶@一節(jié)中設(shè)置的Docker鏡像僅僅是一個(gè)初始框架胃榕。你可能需要優(yōu)先大量參數(shù)來方例實(shí)例的管理盛险,修改Dockerfile來讓你通過本地源代碼運(yùn)行Odoo,而不是在每次編輯一個(gè)模塊時(shí)都要重建勋又,這些都不在本書的討論范疇之內(nèi)苦掘。

Docker是一個(gè)巨大的世界,提供了大量的選項(xiàng)楔壤。你可能會(huì)想要在一個(gè)Docker鏡像倉庫上發(fā)布你的鏡像鹤啡,以及使用docker push和docker pull來發(fā)布和獲取你項(xiàng)目的Docker鏡像。你還可能會(huì)想要運(yùn)行一個(gè)Docker管理平臺(tái)蹲嚣,如Rancher递瑰,來在一個(gè)有負(fù)載均衡的服務(wù)器集群上運(yùn)行你的鏡像。同時(shí)隙畜,你還可以通過持續(xù)集成環(huán)境集成鏡像的構(gòu)建步驟發(fā)布你的開發(fā)快照來進(jìn)行測(cè)試抖部。

管理網(wǎng)站的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)

內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)如今非常的流行。CDN通過在地理上非常近的服務(wù)器提供靜態(tài)資源的服務(wù)來降低網(wǎng)站的加載時(shí)間议惰。Odoo有一個(gè)內(nèi)置的選項(xiàng)來為網(wǎng)站應(yīng)用配置CDN慎颗。在下例中,我們將來了解如何在Odoo中設(shè)置CDN。

準(zhǔn)備工作

我們假定你啟動(dòng)了Odoo實(shí)例并且已安裝website應(yīng)用俯萎。如果你不知道如何在Odoo中安裝應(yīng)用傲宜,請(qǐng)參見第二章 管理Odoo服務(wù)器實(shí)例中的安裝并升級(jí)本地插件模塊一節(jié)。

市面上有很多可用的CDN服務(wù)提供商夫啊,如MaxCDN蛋哭、KeyCDN和CloudFlare。下例中涮母,我們將使用KeyCDN來作為我們的CDN服務(wù)提供商谆趾。如果你使用的是其它的CDN服務(wù)提供商,會(huì)發(fā)現(xiàn)相同類型的配置選項(xiàng)叛本,因?yàn)榇蟛糠諧DN服務(wù)提供商以相似的概念運(yùn)行沪蓬,因此你可以使用任意基于拉取的CDN服務(wù)提供商。

如何操作...

為Odoo網(wǎng)站設(shè)置CDN来候,你需要完成兩個(gè)配置:

  • 配置CDN提供商
  • 在Odoo上配置CDN

配置CDN提供商

請(qǐng)按照這些步驟來配置CDN提供商跷叉。這里我們將使用KeyCDN賬戶:

  1. 登錄你的KeyCDN賬戶
  2. 點(diǎn)擊Zones菜單并添加一個(gè)新區(qū)域:
    image
  3. 設(shè)置如下選項(xiàng)來激活該CDN區(qū)域:
    • Zone Name:任意標(biāo)識(shí)區(qū)域的名稱
    • Zone Status: active
    • Zone Type: Pull
    • Origin URL:你的Odoo實(shí)例所運(yùn)行的 URL
  4. 保存該pull區(qū)域并從該列表中拷貝Zone URL。我們?cè)谙旅娴膸撞街袑⒃?Odoo 配置中使用這一 URL
    image

在Odoo上配置CDN

使用管理員賬戶登錄你的Odoo實(shí)例并按照如下步驟來在Odoo中配置CDN:

  1. 激活開發(fā)者模式营搅,因?yàn)镃DN配置僅在激活了開發(fā)者模式之后才會(huì)顯示云挟。參照第一章 安裝Odoo開發(fā)環(huán)境激活Odoo開發(fā)者工具一節(jié)。

  2. 打開website應(yīng)用的Configuration菜單并搜索內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)選項(xiàng):


    image.png
  3. 在網(wǎng)站配置中設(shè)置如下選項(xiàng)并保存設(shè)置:

    • CDN Base URL:設(shè)置由CDN供應(yīng)商所提供的URL转质。在我們的例子中园欣,我們將使用在上一小節(jié)第3步中拷貝的區(qū)域 URL
    • CDN Filters:這是網(wǎng)站靜態(tài)資源的URL正則表達(dá)式列表。這些規(guī)則用于標(biāo)識(shí)將通過CDN提供服務(wù)的靜態(tài)資源休蟹。Odoo會(huì)在該字段中填寫默認(rèn)值沸枯,但如果你使用其它的 URL 來提供靜態(tài)資源,請(qǐng)手動(dòng)在單獨(dú)的行中添加這些 URL赂弓。

按照如下步驟來檢查CDN的集成是否正常:

  1. 登出Odoo并對(duì)網(wǎng)站進(jìn)行公開的訪問绑榴。
  2. 打開瀏覽器開發(fā)者工具并進(jìn)行入網(wǎng)絡(luò)(network)選項(xiàng)卡
  3. 重載頁面并在網(wǎng)絡(luò)日志中查看靜態(tài)資源的 URL。靜態(tài)資源應(yīng)該像下圖中那樣通過CDN的URL來進(jìn)行加載:


    image.png

譯者注:上圖及配置截圖使用的是MaxCDN盈魁,當(dāng)前使用 KeyCDN 嘗試多次未能成功注冊(cè)翔怎,相關(guān)截圖來自原書

你可能會(huì)獲取到 Cross-Origin Resource(跨域資源)的報(bào)錯(cuò),如下圖所示:

image.png

要修復(fù)這些錯(cuò)誤杨耙,你需要通過CDN激活CORS赤套。在keyCDN中,你會(huì)在高級(jí)特性中看到CORS選項(xiàng)按脚,如下圖所示:

image.png

運(yùn)行原理...

在你激活一個(gè)pull區(qū)域時(shí)于毙,KeyCDN會(huì)自動(dòng)從你的網(wǎng)站上抓取所有的靜態(tài)資源。它會(huì)在全球不同的服務(wù)器上緩存這些資源辅搬。要在你的Odoo網(wǎng)站上使用這些緩存資源唯沮,你需要通過CDN提供商所給出的 URL 來加載靜態(tài)資源脖旱。在第5步中,我們?yōu)镺doo網(wǎng)站配置了這一 URL介蛉,這樣在這一步后萌庆,Odoo將以CDN URL來加載靜態(tài)資源。

??為避免后臺(tái)用戶的問題币旧,Odoo僅對(duì)公開用戶通過CDN URL來加載靜態(tài)資源践险。一旦你做了登錄,Odoo會(huì)停止使用CDN URL并會(huì)從相同的域加載靜態(tài)資源吹菱。

擴(kuò)展內(nèi)容...

CDN服務(wù)商巍虫,如Cloudflare,使用基于DNS的技術(shù)來提供網(wǎng)站內(nèi)容的服務(wù)鳍刷。如果你想要使用Cloudflare配置CDN占遥,需要進(jìn)行更多的配置。要使用Cloudflare输瓜,你需要通過與你的網(wǎng)站域名不同的域名/子域名來提供緩存網(wǎng)站的服務(wù)瓦胎。例如,odoo.com使用odoocdn.com來提供CDN資源的服務(wù)尤揣。之后搔啊,你需要在Odoo的配置中設(shè)置該域名/子域名為CDN Base URL。

??警告

在通過不同 URL 為相同網(wǎng)站提供服務(wù)時(shí)需要格外小心北戏,因?yàn)槿绻闾峤辉揅DN域名給搜索引擎索引的話可能更改掉你的sitemap.xml文件负芋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市最欠,隨后出現(xiàn)的幾起案子示罗,更是在濱河造成了極大的恐慌惩猫,老刑警劉巖芝硬,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異轧房,居然都是意外死亡拌阴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門奶镶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迟赃,“玉大人,你說我怎么就攤上這事厂镇∠吮冢” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵捺信,是天一觀的道長。 經(jīng)常有香客問我,道長喇辽,這世上最難降的妖魔是什么雨席? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任菩咨,我火速辦了婚禮陡厘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糙置。我一直安慰自己缨硝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布查辩。 她就那樣靜靜地躺著宜岛,像睡著了一般功舀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列敲,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天帖汞,我揣著相機(jī)與錄音翩蘸,去河邊找鬼。 笑死扶踊,一個(gè)胖子當(dāng)著我的面吹牛郎任,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播分井,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼杂抽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了铸磅?” 一聲冷哼從身側(cè)響起杭朱,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弧械,沒想到半個(gè)月后八酒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羞迷,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衔瓮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年热鞍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衔彻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悴晰,靈堂內(nèi)的尸體忽然破棺而出铡溪,到底是詐尸還是另有隱情泪喊,我是刑警寧澤袒啼,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布纬纪,位于F島的核電站包各,受9級(jí)特大地震影響靶庙,放射性物質(zhì)發(fā)生泄漏六荒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砚亭。 院中可真熱鬧捅膘,春花似錦、人聲如沸膝捞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽混坞。三九已至,卻和暖如春啥酱,著一層夾襖步出監(jiān)牢的瞬間厨诸,已是汗流浹背微酬。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陷遮,地道東北人帽馋。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓茬斧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绣溜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娄蔼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345