全書完整目錄請(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 腳本):
- 以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/
- 以root用戶創(chuàng)建一個(gè)名為odoo的用戶:
# adduser odoo
- 配置PostgreSQL數(shù)據(jù)庫:
# sudo -u postgres createuser odoo
# sudo -u postgres createdb -O odoo odoo_project
- 以odoo用戶克隆項(xiàng)目倉庫:
# su odoo
$ mkdir ~/odoo-prod
$ cd ~/odoo-prod
$ git clone https://github.com/yourlogin/project.git project
$ mkdir -p project/src
- 以odoo用戶,克隆Odoo源代碼:
$ cd project/src
$ git clone -b 12.0 --single-branch https://github.com/odoo/odoo.git odoo
- 創(chuàng)建virtualenv并安裝依賴:
$ virtualenv -p python3 ~/env-odoo-12.0
$ source ~/env-odoo-12.0/bin/activate
$ pip3 install -r odoo/requirements.txt
- 在project/src子目錄中克隆所有第三方插件倉庫:
$ git clone -b 12.0 https://github.com/OCA/partner-contact.git
- 創(chuàng)建~/odoo-prod/project/bin目錄:
$ mkdir ~/odoo-prod/project/bin
- 創(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} "$@"
- 讓該腳本可執(zhí)行:
$ chmod +x ~/odoo-prod/project/bin/start-odoo
- 以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/:
訪問該網(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)整配置文件炊昆,你需要按照如下步驟:
- 在開發(fā)環(huán)境的基礎(chǔ)上新建一個(gè)生產(chǎn)環(huán)境的配置文件:
$ cd ~/odoo-prod/project
$ cp development.conf production.conf
- 編輯生產(chǎn)環(huán)境配置production.conf 文件桨吊。
- 修改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
- 修改數(shù)據(jù)路徑:
data_dir = /home/odoo/odoo-prod/project/filestore
- 修改服務(wù)服務(wù)日志路徑來匹配生產(chǎn)環(huán)境的根路徑:
logfile = /home/odoo/odoo-prod/project/logs/odoo.log
- 配置日志輪詢:
logrotate = True
- 配置日志處理器:
log_level = warn
log_handler = :WARNING,werkzeug:CRITICAL,odoo.service.server:INFO
- 調(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
- 配置數(shù)據(jù)庫過濾器并禁用數(shù)據(jù)庫列出顯示:
dbfilter = odoo-project$
list_db = False
- 使用pwgen生成的隨機(jī)密碼來修改master密碼
admin_password = 使用一個(gè)隨機(jī)密碼
- 配置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
- 僅監(jiān)聽本地網(wǎng)卡:
http_interface = 127.0.0.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:
- 使用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
- 使用root權(quán)限汗洒,注冊(cè)該服務(wù):
# systemctl enable odoo.service
- 使用root權(quán)限,啟動(dòng)服務(wù):
# service odoo start
- 可運(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)文章:
準(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 倉庫
- 使用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
- 使用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
- 使用root權(quán)限斩祭,安裝nginx:
# apt-get install nginx -y
- 在/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;
}
- 在相同的文件中,添加rewrite規(guī)則來將http重寫向到https網(wǎng)站:
server {
listen 80;
server_name odoo.example.com;
rewrite ^(.*) https://$host$1 permanent;
}
- 在相同的文件中乡话,添加如下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步的配置
}
- 在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;
- 在server版塊中添加日志文件配置:
# Add log files
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
- 通過在server版塊中添加如下配置來啟用gzip:
# enable gzip
gzip on;
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
- 在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;
- 在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;
}
- 通過在server版塊中添加如下配置來啟用靜態(tài)緩存:
# Enable static cache
location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
- 使用root權(quán)限摧玫,添加/etc/nginx/sites-enabled/中配置文件的鏈接:
# ln -s /etc/nginx/sites-available/odoo-ssl\
/etc/nginx/sites-enabled/odoo-ssl
- 使用root權(quán)限,刪除/etc/nginx/sites-enabled/default:
# rm /etc/nginx/sites-enabled/default
- 使用Odoo用戶绑青,編輯實(shí)例的生產(chǎn)配置文件來啟動(dòng)proxy_mode:
proxy_mode = True
- 使用root權(quán)限诬像,重啟你的odoo實(shí)例和nginx:
# service odoo restart
# service nginx restart
- 使用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):
在第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)被更新。
擴(kuò)展內(nèi)容...
這一部分集中于nginx配置鸣奔。你可能會(huì)更熟悉其它工具墨技,如Apache網(wǎng)頁服務(wù)器和mod_proxy。這時(shí)挎狸,你自然也可以使用它們來實(shí)現(xiàn)相似的設(shè)置健提。
如果不愿意使用Let's Encrypt,而偏好于使用其它證書機(jī)構(gòu)(CA)伟叛,你可以使用如下步驟:
- 安裝openssl:
$ sudo apt-get install openssl
- 為你的服務(wù)器生成密鑰:
$ mkdir ~/sslkey
$ openssl genrsa -out ~/sslkey/server.key 2048
- 生成簽署請(qǐng)求:
$ openssl req -new -key ~/sslkey/server.key\
-out ~/sslkey/server.csr
- 以上的命令會(huì)接著一系列的問題詢問你的公司名和Odoo服務(wù)URL等私痹。不要填錯(cuò)了,否則你的證書將不可用统刮。
- 你將可以發(fā)送~/sslkey/server.csr文件到你所選擇的證書機(jī)構(gòu)(CA)紊遵。CA會(huì)向你發(fā)回一個(gè)名為server.crt的文件。
- 你將需要在/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/*
- 那么侥蒙,在本節(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;
- 最后,重啟nginx鞭衩。
譯者注:還有很多其它選擇学搜,如使用阿里云可直接在后臺(tái)生成一年免費(fèi)證書,下載文件配置到 Nginx中即可
其它知識(shí)
- 有關(guān)nginx配置選項(xiàng)的更多信息论衍,參見http://nginx.org/en/docs/瑞佩。
- 有關(guān)Apache2作為反向代理配置的教程及個(gè)人證書機(jī)構(gòu)的使用,參見http://antiun.github.io/odoo-reverse-proxy-howto/坯台。
使用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í)行命令):
- 通過如下命令設(shè)置PostgreSQL服務(wù)docker實(shí)例:
# docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10
- 通過如下命令運(yùn)行PostgresSQL數(shù)據(jù)庫:
# docker start db
- 通過如下命令設(shè)置Odoo docker實(shí)例:
# docker run -p 8069:8069 --name odoo --link db:db -t odoo
- 通過如下命令運(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í)例:
- 新建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
- 在終端中執(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賬戶:
- 登錄你的KeyCDN賬戶
- 點(diǎn)擊Zones菜單并添加一個(gè)新區(qū)域:
- 設(shè)置如下選項(xiàng)來激活該CDN區(qū)域:
- Zone Name:任意標(biāo)識(shí)區(qū)域的名稱
- Zone Status: active
- Zone Type: Pull
- Origin URL:你的Odoo實(shí)例所運(yùn)行的 URL
- 保存該pull區(qū)域并從該列表中拷貝Zone URL。我們?cè)谙旅娴膸撞街袑⒃?Odoo 配置中使用這一 URL
在Odoo上配置CDN
使用管理員賬戶登錄你的Odoo實(shí)例并按照如下步驟來在Odoo中配置CDN:
激活開發(fā)者模式营搅,因?yàn)镃DN配置僅在激活了開發(fā)者模式之后才會(huì)顯示云挟。參照第一章 安裝Odoo開發(fā)環(huán)境中激活Odoo開發(fā)者工具一節(jié)。
-
打開website應(yīng)用的Configuration菜單并搜索內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)選項(xiàng):
-
在網(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的集成是否正常:
- 登出Odoo并對(duì)網(wǎng)站進(jìn)行公開的訪問绑榴。
- 打開瀏覽器開發(fā)者工具并進(jìn)行入網(wǎng)絡(luò)(network)選項(xiàng)卡
-
重載頁面并在網(wǎng)絡(luò)日志中查看靜態(tài)資源的 URL。靜態(tài)資源應(yīng)該像下圖中那樣通過CDN的URL來進(jìn)行加載:
譯者注:上圖及配置截圖使用的是MaxCDN盈魁,當(dāng)前使用 KeyCDN 嘗試多次未能成功注冊(cè)翔怎,相關(guān)截圖來自原書
你可能會(huì)獲取到 Cross-Origin Resource(跨域資源)的報(bào)錯(cuò),如下圖所示:
要修復(fù)這些錯(cuò)誤杨耙,你需要通過CDN激活CORS赤套。在keyCDN中,你會(huì)在高級(jí)特性中看到CORS選項(xiàng)按脚,如下圖所示:
運(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文件负芋。