全書完整目錄請見:Odoo 12開發者指南(Cookbook)第三版
本章中,我們將講解如下主題:
- Odoo生態系統
- 從源碼輕松安裝Odoo
- 使用start命令管理Odoo環境
- 管理Odoo服務端數據庫
- 在一個文件中存儲實例配置
- 激活Odoo開發者工具
- 從源碼更新Odoo
簡介
有很多的方式來設置Odoo開發環境。本章中采用了其中的一種,你一定可以在網上找到其它的教程講解其它方法。請記住本章中為開發環境,與生產環境的要求是不同的。關于生產環境會在第三章 服務器部署中講解。
如果你是一個Odoo開發新手,必須要了解Odoo生態的某些方面。下一部分會給出這些方面的簡短介紹,然后我們就會進入到開發用的Odoo的安裝。
Odoo生態系統
Odoo為開發者提供了開箱即用的模塊結構。它強大的框架有助于開發者很快地創建項目。在開始成為成功的Odoo開發者之旅以前,Odoo生態中有一些你應該要熟悉的特性。
Odoo版本
Odoo有兩個版本。第一個是社區版,完全開源,第二是企業版,需要授權證書費用。不同于其它軟件供應商,Odoo企業版僅僅是在社區版基礎上添加了一些附加特性/應用的高級應用。基本上,企業版運行于社區版之上。社區版采用Lesser General Public License v3.0 (LGPLv3)許可證書,并帶有企業版企業資源計劃(ERP)的所有基礎應用,如銷售、客戶關系管理(CRM)、發票、采購、網站構建器等等。而企業版采用 Odoo 企業版許可證書,這是一個自有證書。Odoo 企業版帶有高級功能如完整的財務、studio、基于IP的語音傳輸(VoIP)、移動端響應式設計、電子簽名、營銷自動化和快遞與銀行的集成。企業版還為你提供無限的漏洞修復。下圖顯示企業版依賴于社區版,這也是為什么你需要社區版來使用企業版:
你可以通過https://www.odoo.com/page/editions查看這兩個版本的完整對比。
??Odoo有最大數量的社區開發人員,這也是你在應用商店中看到有大量的第三方應用(模塊)的原因。大部分免費應用使用Affero General Public License version 3 (AGPLv3)許可證書。如果你的應用依賴于這些應用就不能使用其自有證書。Odoo自有證書的應用僅能在擁有LGPL或其它自有證書的模塊基礎上進行開發。
Git倉庫
Odoo的完整代碼托管在GitHub上。你可以在這里對穩定版提交漏洞/問題。你還可以通過提交拉取請求(Pull Request - PR)來提議添加新功能。Odoo有許多個倉庫,參見下表來獲取更多信息:
倉庫 | 用途 |
---|---|
https://github.com/odoo/odoo | 這是 Odoo 的社區版。對公眾開放。 |
https://github.com/odoo/enterprise | 這是 Odoo 的企業版。僅對Odoo 官方合作伙伴開放。 |
https://github.com/odoo-dev/odoo | 這是不斷開發中的倉庫。對公眾開放。 |
每年,Odoo會發布一個大版本(長期支持(LTS)版本)和幾個小版本。小版本多用于Odoo的在線SaaS服務,表示Odoo的SaaS用戶可以更早地使用這些功能。GitHub 上大版本分支的名稱像12.0, 11.0和10.0,而小版本分支名稱有saas-12.1, saas-11.1和saas-11.2。master分支處于開發中,并隨時可能發生改變。因此,不建議在生產環境中使用它,因為它可能導致數據庫的崩潰。
Runbot
Runbot是Odoo的自動化測試環境。這會從Odoo的Git倉庫拉取最新分支并創建最近4個提交的構建。這里,你可以測試所有的穩定版和開發中分支。你甚至可以使用企業版并測試它的開發分支。
每個構建有不同的背景色,表明測試用例的狀態。綠色背景表示所有的測試用例成功運行,你可以測試該分支,而紅色背景表示在這個分支上有些測試用例出錯了,有些功能在該構建上可能崩潰了。你可以查看所有測試用例的日志,會顯示在安裝過程中所發生的具體事項。每個構建有兩個數據庫。數據庫all安裝了所有的模型,而數據庫base僅安裝了基本的Odoo模塊。每個構建安裝了基本演示數據,因此你可以快速進行測試而無需額外的配置。
??你使用如下 URL 來訪問runbot:http://runbot.odoo.com/runbot
以下賬戶信息可用于訪問任一runbot構建:
- 登錄ID: admin 密碼: admin
- 登錄ID:demo 密碼: demo
- 登錄ID: portal 密碼: portal
??這是公共測試環境,因此有時可能會有其它用戶使用/測試你所測試的相同分支。
Odoo應用商店
Odoo幾年前發布了應用商店,當時就獲得了成功。現在,那里托管著15,000多個不同的應用。在應用商店中,你可以找到大量的針對不同版本的免費和付費應用。這包含不同垂直業務領域的具體解決方案,如教育、食品行業和醫藥業。它還包含一些繼承了已有Odoo應用或添加了新功能的應用。應用商店還為Odoo網站構建器提供了大量的美觀的主題。在第四章 創建Odoo插件模塊中,我們將來看如何為你的自定義模塊設置價格和幣種。
你可以通過如下鏈接訪問Odoo應用商店:https://www.odoo.com/apps。
Odoo社區聯盟(OCA)
Odoo社區聯盟(OCA)是一個開發/管理Odoo社區模塊的非營利組織。所有的OCA模塊都開源并由Odoo社區成員維護。在OCA的GitHub中,你會發現針對不同Odoo應用的多個倉庫。除Odoo模塊外,它還包含很多工具、一個遷移庫、會計本地化等等。
以下是OCA官方GitHub賬戶的URL:https://github.com/OCA。
官方Odoo幫助論壇
Odoo 有一個非常強大的框架,大量的事只需通過使用/激活選項或遵循指定的模式即可實現。因此,如果你碰到了一些技術問題或如果你對一些復雜用例不確定,那么你就可以在Odoo官方幫助論壇上提交問詢。這個論壇上有大量活躍的開發人員,包含一些Odoo官方的員工。
你可以在如下 URL 上搜索或提交你的問題:https://help.odoo.com/。
從源碼輕松安裝Odoo
推薦使用GNU/Linux環境來部署Odoo。你可能更習慣于使用Microsoft Windows或Mac OS X,但事實上大部分的Odoo開發人員都使用GNU/Linux,使用GNU/Linux而非Windows你也更有機會獲取操作系統級別問題的社區支持。
也推薦使用和生產環境相同的環境(相同發行版和版本號)進行開發。這樣可以避免討厭的“彩蛋”,比如在部署當天發現有個庫有一個預料外的版本,會有一些不同和不兼容的問題。如果你的工作站使用不同的操作系統,一個好的方法是在工作站上設置虛擬機(VM)并在 VM 上安裝 GNU/Linux發行版。
小貼士:避免在運行開發環境的工作站和運行 Odoo 的虛擬機之間拷貝文件,你可以在VM中配置一個SAMBA共享并將源碼存儲在那里。然后在你的工作站上掛載該共享目錄來輕松的編輯文件。
本書假定你運行 Debian GNU/Linux的穩定版(在寫本書時為版本9,代號Stretch)。Ubuntu是另一個常用的選擇,因為它是構建在Debian之上的,本書中大部分的示例應該都不需要進行修改即可在其上運行。不論你選擇哪個Linux發行版,你都應該要有一個從命令行使用它的概念,有系統運維相關知識顯然也沒有什么壞處。
準備工作
我們假定你已運行了Linux并因擁有 root 密碼或配置了 sudo 而擁有root訪問權限。下面的部分中,我們將在命令行中需要你的工作用戶的登錄名時使用$(whoami)。這是代替你輸入命令的登錄用戶的shell命令。
譯者注:Debian 的安裝請參見Odoo 12開發者指南補充知識
如果你有GitHub賬戶的話有些操作一定會更容易。如果你尚未擁有GitHub賬戶,請訪問https://github.com并創建賬戶。
如何安裝...
使用源碼安裝 Odoo,需要按照如下的步驟:
譯者注:如需使用Python 3.6請參照Odoo 12開發者指南補充知識,另 Alan 也按照下面的命令制作了一個安裝腳本@GitHub
- 運行如下命令來安裝主要依賴
$ sudo apt-get update
$ sudo apt-get install -y git python3.5 postgresql nano \
virtualenv xz-utils wget fontconfig libfreetype6 libx11-6 \
libxext6 libxrender1 xfonts-75dpi
> ??Odoo v12的樣式預處理由less變成了scss。因此,如果你使用12以下的版本,那么你需要安裝node-less node-clean-css來獲取正確的樣式。
- 下載并安裝wkhtmltopdf:
$ 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
$ sudo mv wkhtmltox/lib/* /usr/local/lib/
$ sudo mv wkhtmltox/bin/* /usr/local/bin/
$ sudo mv wkhtmltox/share/man/man1 /usr/local/share/man/
# 譯者補充:當前官方推薦的版本為0.12.5,可通過如下命令進行安裝
$ 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 install -y gcc python3.5-dev libxml2-dev \
libxslt1-dev libevent-dev libsasl2-dev libssl1.0-dev libldap2-dev \
libpq-dev libpng-dev libjpeg-dev
- 配置PostgreSQL
$ sudo -u postgres createuser --createdb $(whoami)
$ createdb $(whoami)
- 配置git(以下信息請自行修改):
$ git config --global user.name "Your Name"
$ git config --global user.email youremail@example.com
- 克隆 Odoo 基礎代碼:
$ mkdir ~/odoo-dev
$ cd ~/odoo-dev
$ git clone -b 12.0 --depth 1 --single-branch https://github.com/odoo/odoo.git
$ cd odoo
**譯者注:**建議像上面這樣在原文的基礎上添加--depth 1,否則將下載2G多的文件,國內網絡環境耗時會非常久
- 創建一個odoo-12.0 虛擬環境并激活它:
$ virtualenv -p python3 ~/odoo-12.0
$ source ~/odoo-12.0/bin/activate
- 在virtualenv中安裝Odoo的Python依賴:
$ pip3 install -r requirements.txt
- 創建并啟動你的第一個Odoo實例:
$ createdb odoo-test
$ python3 odoo-bin -d odoo-test --addons-path=addons \
--db-filter=odoo-test$
**譯者注:**初次啟動可能會需要添加-i base參數來初始化數據庫
- 在瀏覽器中訪問http://localhost:8069(虛擬機請修改為對應的 IP 地址),并使用admin賬戶和密碼admin來進行登錄
譯者注:此處省略小貼士關于下載代碼相關內容,在翻譯和實操的過程中,Alan 會將相關代碼上傳到 GitHub 上
運行原理...
依賴來自不同的數據源。首先,你需要Odoo的核心依賴、Python解釋器用于運行源代碼,PostgreSQL數據庫服務用于存儲實例數據。Git用于源碼版本控制以及獲取Odoo本身的源代碼。
??在11.0之前,Odoo的各版本以Python 2.7進行運行。從Odoo 11.0開始,支持的Python最小版本為3.5。Python的這兩版本并不兼容,因此在Python 2.7上運行的模塊(Odoo 9.0或10.0)會要求移植為符合Odoo 11.0 以及Python 3的具體要求。
因為我們需要在服務器上以root或postgres(PostgreSQL的管理用戶)編輯一些文件,我們需要安裝一個基本控制臺的文本編輯器。我們推薦使用nano,因為它使用上非常簡單,但請自由選擇你自己所喜歡的編輯器,只要能在Console中使用即可。例如,你可以使用vim, e3或emacs-nox。
Wkhtmltopdf是Odoo的一個運行時依賴,用于生成PDF報告。Odoo 12.0所要求的版本為0.12.4,在當前的GNU/Linux發行版中并沒有包含。所幸wkhtmltopdf的維護者提供對不同發行版的預構建包,地址為http://wkhtmltopdf.org/downloads.html.
有很多其它的運行時依賴為Python模塊,我們可以在虛擬環境中使用pip3進行安裝。但是,其中一些Python模塊會包含對原生C語言庫的依賴,Python綁定需要它來進行編譯。因此,我們安裝了這些C語言庫的開發包以及Python開發包和C編譯器。在安裝了這些構建依賴之后,我們就可以使用pip3 install -r requirements.txt(Odoo源代碼中的一個文件)來下載、編譯和安裝這些Python模塊了。
虛擬環境
Python虛擬環境或簡稱virtualenv,是隔離的Python工作空間。這些對于Python開發者非常有用,因為它們允許安裝不同Python解釋器版本上不同版本Python庫的不同工作空間。
你可以使用virtualenv -p python3 path/to/newenv命令來創建所需數量的環境。這會在指定位置創建一個newenv目錄,其中包含一個bin/子目錄和一個lib/python3.5(譯者注:或你安裝的其它 Python 3版本)子目錄。請記得加上-p python3,不加的話你有可能會創建一個Python 2.7的虛擬環境,那就無法運行Odoo 12.0了。
在bin/目錄,你會發現一些腳本:
- activate:這腳本不被執行,由內置的source命令來進行加載。這會通過調整PATH環境變量來包含virtualenv的bin/目錄來激活該環境。它還會安裝名為的deactivate的shell函數,通過運行它可以退出virtualenv,并通過改變shell提示符來告訴你virtualenv當前已激活。
- pip3:這是pip3的一特殊版本,僅在virtualenv中生效。
- python3:這是對系統的Python解釋器的封裝,它使用在virtualenv中已安裝的包。
??shell內置的source命令也可使用 . (單個點,接空格和要進行source的文件路徑)。這表示你可以使用 . ~/odoo-12.0/bin/activate 來代替source ~/odoo-12.0/bin/activate。簡寫形式完全沒有問題,但本書將出于易讀性的考慮保持使用source。
使用virtualenv有兩種主要方法。你可以像前例中那樣激活它(并在完成后調用deactivate),或者你可以顯式地使用該環境下bin/目錄中的腳本來以完整路徑進行調用,這樣你無需激活virtualenv腳本。這是一個偏好問題,你應該通過嘗試來看哪種方式更適合你。
你可以在第一行放上可執行Python腳本。應該會是這樣:
#! /usr/bin/env python3
通過一個激活的virtualenv腳本這些會更易于使用。
odoo-bin腳本就屬于這種情況,你可以通過如下方式來進行調用:
$ ./odoo-bin -d odoo-test --addons-path=addons --db-filter=odoo-test
PostgreSQL配置
在GNU/Linux系統中,Odoo使用psycopg2 Python庫來與PostgreSQL數據庫進行連接。Odoo可以使用默認值非常好地運作,這些默認值用于通過psycopg2訪問PostgreSQL數據庫。它使用如下的默認值:
- 默認psycopg2嘗試使用本地連接的當前用戶相同的用戶名來連接數據庫,這會啟動無密碼認證
- 本地連接使用Unix域套接字
- 數據庫服務監聽5432端口
這里沒什么特別的要做,因此我們只是使用了postgres管理員用戶創建了一個與系統當前用戶相同的用戶名,并給其使用同名新用戶新建數據庫的權限。在我們使用psql命令時這會被用作默認數據庫。
在開發服務器上,給予PostgreSQL用戶更多的權限并使用 --superuser命令行參數而不僅僅是--createdb沒有問題。效果是該用戶可以創建其它用戶并可全局管理數據庫實例。如果你覺得--superuser太過了,在創建你的數據庫用戶時仍可以在--createdb之外用--createrole。在生產服務器上要避免這么做,因為這會給予黑客在一些部署代碼中更多地利用漏洞的機會(參見第三章 服務器部署)。
如果你想使用不同的數據庫用戶,則需提供該用戶的密碼。這通過在創建用戶時在命令行傳遞--pwprompt標記來實現,此時命令行會提示你輸入密碼。
如果用戶已存在而你又想要為其設置密碼(或修改一個已忘記的密碼),可以使用如下命令:
$ psql -c "alter role $(whoami) with password 'newpassword'"
小貼士:如果這個命令執行報錯提示數據庫不存在,這是因為你沒按照操作步驟的第4步創建一個與當前登錄名相同的數據庫。不必擔心,僅需使用 --dbname選項來添加已有數據庫名,例如 --dbname template1。
Git配置
在本書的某些部分,你會需要使用git commit進行提交。必須要進行一些基礎設置否則會報錯,你需要提供自己的Git用戶名和email地址。Git會很好的提示你這做,但你也可以現在就提前設置好。
??如果你使用一些諸如Travis或持續集成的服務這也是需要謹記于心的,你的測試腳本會需要執行一些git合并。你需要提供一個名稱和email來讓合并成功執行。
下載Odoo源碼
下載Odoo源代碼由git clone操作來執行;保持耐心,這會花費一些時間。--branch 12.0 --single-branch選項會避免下載其它分支,節約一些時間。也可以使用--depth選項來避免下載整個倉庫歷史記錄,但該選項的缺點是你在查找問題時將無法去查看歷史記錄。
Odoo開發者還建議了nightly構建,可以通過tarball和發行包進行獲取。使用git clone的主要優勢在于在源代碼樹提交了新的漏洞修復時你可以更新自己的倉庫。你也將可以輕松地測試所建議的修復并追蹤回退,這會讓你的漏洞報告更精確及對開發者更有幫助。
啟動實例
到了你期待已久的時刻了。要啟動我們的第一個實例,首先我們創建一個新的空數據庫,然后使用odoo-bin以及如下命令行參數:
- -d database_name:默認使用這一數據庫。
- --db-filter=database_name
很重要,因為在匹配模式中使用了正則表達式,這會避免選擇以相同的指定字符串開頭的名稱。
- --addons-path=directory1,directory2,...:Odoo通過這一逗號分隔列表中的目錄來查找插件(add-on)。在實例創建的時候掃描該列表來添加實例中可用的插件模塊列表。
如果你使用了與Linux當前登錄用戶不同的數據庫用戶,則需要再傳遞如下的參數:
- --db_host=localhost: 使用一個數據庫服務的 TCP連接
- --db_user=database_username: 使用指定的數據庫登錄用戶
- --db_password=database_password: 這是用于認證PostgreSQL服務的密碼
使用--help可獲取所有可用選項的一個總覽。我們在本章后面及第二章 管理Odoo服務器實例中還會來了解odoo-bin腳本更多的知識。
Odoo在一個空數據庫上啟動時,它會首先創建一個支持其操作所需的數據庫結構。它還會掃描插件路徑來查找可用的插件模塊,并將一些內容插入到數據庫的初始記錄中。這包括admin用戶及默認admin密碼,在登錄時你將需要使用。
Odoo包含一個HTTP服務器。默認,它監聽TCP端口8069上的所有本地網絡接口,因此在瀏覽器中訪問http://localhost:8069/( 譯者注:非本地請自行修改為 IP 地址)可以訪問到你所新創建的實例。
使用start命令管理Odoo環境
我們會經常要在Odoo實例中用到自定義或社區模塊。將它們放在一個單獨的目錄中會讓為Odoo安裝升級或調試自定義模塊的問題更為簡單。我們只需將該目錄添加到插件路徑中,它們就可以同核心模塊一樣在實例中使用了。
可以將這個模塊路徑看作一個Odoo環境。Odoo的start命令讓以目錄組織Odoo實例更為方便,每個目錄中包含自己的模塊。
準備工作
這一節要求已安裝過 Odoo。我們假定代碼的目錄為~/odoo-dev/odoo并且已激活虛擬環境。
這表示運行如下命令可以成功地啟動Odoo服務:
>$ ~/odoo-dev/odoo/odoo-bin
如何啟動...
為你的實例創建一個工作環境,需要按照如下步驟:
- 更改到Odoo所在目錄
$ cd ~/odoo-dev
-
選擇該環境的名稱并為其創建一個目錄:
$ mkdir my-odoo
3. 更改到這個目錄并為該環境啟動Odoo服務實例
```
$ cd my-odoo/
$ ../odoo/odoo-bin start
運行原理...
Odoo的start命令是使用當前目錄啟動服務實例的一個快捷方式。目錄名自動作為數據庫名(-d選項),只要其包含Odoo插件模塊當前目錄也自動插入到插件路徑(--addons-path選項)中。在前面的操作步驟中,你不會看到插件路徑中有當前目錄,因為它還不包含任何模塊。
??如果你在虛擬環境中使用start命令,它會使用虛擬環境的名稱來代替所處目錄名稱來作為數據庫名。但如果你不在虛擬環境中,就會使用當前目錄名。
更多內容...
默認使用當前目錄,但--path選項允許你轉而設置一個具體的路徑來供使用。例如,可在任何目錄下使用這條命令:
$ ~/odoo-dev/odoo/odoo-bin start --path=~/odoo-dev/my-odoo
所使用的數據庫也可以使用常用的-d 選項來進行重選。事實上,所有其它的odoo-bin 常用命令行參數都可以使用,除--addons-path外。例如,使用如下命令來設置服務監聽端口:
$ ../odoo/odoo-bin start -p 8080 -i base
可以看到,Odoo的start命令是以自己的模塊路徑快速啟動Odoo實例的一種很便捷的方式。
管理Odoo服務端數據庫
在使用Odoo時,你的實例所有的數據都存儲在PostgreSQL數據庫中。你習慣的所有標準數據庫管理工具都可以使用,但Odoo為一些通過操作提供了一個網頁界面。
準備工作
我們假定你的工作環境已設置,并且你已運行了一個實例。不要使用前面操作中所介紹的odoo-bin start命令來啟動,因為這會使用一些牽涉到多數據庫管理選項的服務配置。
如何管理...
Odoo數據庫管理界面提供創建、復制、刪除、備份和恢復數據庫的工具。還有一種修改master密碼的方式,用于保持對數據庫管理界面的訪問。
訪問數據庫管理界面
需要執行如下步驟來訪問數據庫:
- 進入實例的登錄頁面(如果已登錄請先登出)。
- 點擊Manage Databases鏈接。這會導航至http://localhost:8069/web/database/manager(你也可以在瀏覽器中直接訪問這個URL)。
設置或修改master密碼
如果你已經以默認值設置了實例且尚未像下面講解的那樣做過修改,數據庫管理頁面會顯示一條警告,告訴你還沒有設置master密碼并建議你通過點擊鏈接來進行設置:
你需要執行如下步驟來設置master:
-
點擊Set Master Password按鈕。會彈出一個對話框來要求你提供新的 master 密碼:
輸入一個復雜的新密碼并點擊Continue
如果已設置了master密碼,點擊頁面底部的Set Master Password按鈕來進行修改。在彈出的對話框中輸入老的master密碼再輸入新密碼,然后點擊Continue。
??master密碼是在admin_password鍵下的服務配置文件。如果啟動服務時沒有指定配置文件,新的配置會在~/.odoorc中生成。查看下一部分獲取更多有關配置文件的信息。
創建新數據庫
這個對話框用于創建一個由當前Odoo服務處理的新數據庫實例:
-
在數據庫管理窗口,點擊頁面底部的Create Database按鈕:
-
填寫表單,如下:
- Master Password:這是這一實例的master密碼。
- Database Name:輸入你所想要創建的數據庫名稱。
- Password:輸入你想為新實例所設置的admin用戶密碼。
- Phone Number:設置電話號碼(可選)。
- Language:在下拉列表中選擇你希望新數據庫默認安裝的語言。
- Country:在下拉列表中選擇主公司的國家。選擇這一項后會自動做一些配置,如公司的幣種。
- Load demonstration data:勾選獲取演示數據。這對于運行交互式測試或為用戶設置演示項目非常有用,但針對包含生產數據的數據庫設計時則不應勾選。
??如果你想使用該數據庫來運行模塊的自動化測試(參見第八章 調試),你會需要有演示數據,因為Odoo中的大多數自動化測試依賴于這些記錄來成功運行。
點擊Continue按鈕并等待新數據庫初始化完成。然后你會被重定向到該實例并以管理員進行連接。
小貼士:問題解決:如果你被重定向到登錄頁,這可能是因為向Odoo傳遞了--db-filter選項并且與新數據庫名不匹配造成的。注意odoo-bin start會默默地進行這一操作,僅讓當前數據庫可用。解決這一問題,只需不使用start命令來對Odoo進行重啟,在本章中的從源碼輕松安裝 Odoo 一節展示過這一做法。如果你有一個配置文件(參見本章后面的在一個文件中存儲實例配置一節),那么請檢查db_filter并未進行設置或設置一個與新數據庫匹配的值。
復制數據庫
通常你已經有一個數據庫了,你會想要使用它做一存儲過程的試驗或運行一個測試,但又不修改已有數據。這里的方案很簡單:復制該數據庫并在拷貝上運行測試。可以按需重復多次:
-
在數據庫管理頁面,在想要復制的數據庫旁點擊Duplicate Database 鏈接:
- 填寫表單如下:
- Master Password:這是Odoo服務的master密碼
- New Name:給予拷貝的名稱
- 點擊Continue按鈕。
- 你可以在數據庫管理頁面點擊新創建的數據庫名稱來訪問該數據庫的登錄頁面。
刪除數據庫
在完成測試之后,你會想要清理掉所復制的數據庫。通過如下步驟來進行清理:
-
在數據庫管理頁面,點擊想刪除的數據庫名稱旁的Delete Database鏈接:
- 填寫表單并輸入 Master Password,即Odoo服務的master密碼。
- 點擊Delete按鈕。
??小心!數據丟失!
如果你選擇了錯誤的數據庫,并且沒有備份,則無法恢復損失的數據。
備份數據庫
需執行如下步驟來創建一個備份:
-
在數據庫管理頁面,點擊想要備份的數據庫旁的Backup Database鏈接:
-
填寫表單
- Master Password:Odoo服務的master密碼。
- Backup Format:對生產數據庫請保持使用zip,因為這是唯一真正的全量備份格式。僅在備份不關心文件存儲的開發數據庫時使用pg_dump格式。
點擊Backup。然后瀏覽器會下載備份文件。
恢復數據庫備份
如果你需要恢復一個備份,需要按如下步驟操作:
-
在數據庫管理頁面,點擊頁面詢問的Restore Database按鈕:
-
填寫表單:
- Master Password:這是Odoo服務的master密碼。
- File:這是之前所下載的Odoo備份
- Database Name:提供你需進行備份恢復的數據庫名稱。該數據庫在服務器上一定不能存在。
- This database might have been moved 或copied:如果原數據庫在另一臺服務器上或是為從當前服務器刪除則選擇數據庫被移動。否則選擇數據庫是一個拷貝,這也是安全的默認選項。
點擊Continue按鈕。
??不能在數據庫自身之上恢復數據庫。這么做會得到一條錯誤消息(Database restore error: Database already exists)。你需要先刪除該數據庫。
運行原理...
除Change master password以外的這些頁面上的功能,在服務器上運行PostgreSQL運維命令并通過網頁界面回報結果。
master密碼是非常重要的信息,存儲在Odoo服務的配置文件中,從不在數據庫中進行存儲。曾經有一個admin默認值,但使用這個值是一個廣為人知的安全問題。在Odoo v9之后的版本中,這被識別為一個未設置的master密碼,并在訪問數據庫管理頁面時會敦促你修改密碼。雖然這在配置文件中以admin_passwd進行存儲,它與admin的密碼是不同的,它們是兩個獨立的密碼。master密碼是為Odoo服務進程設置的,進程本身可以處理多個數據庫實例,每個實例都一個獨立的admin用戶及其自己的密碼。
??安全考慮:記住本章中我們所考慮的是開發環境。Odoo數據庫管理界面在我們運行生產服務時是需要進行安全保護的,因此不會給到太多的敏感信息的訪問權限,尤其是如果服務器托管了多個不同客戶端的Odoo實例時。這會在第三章 服務器部署中進行講解。
Odoo使用PostgreSQL的createdb工具來新建數據庫,它通過和以空數據庫啟動Odoo時相同的方式調用內部的Odoo函數來初始化新數據庫。
Odoo使用createdb的--template選項傳遞原數據庫作為參數來復制數據庫。這基本上使用內部優化的PostgreSQL例行程序在新數據庫中復制模板數據庫的結構,這比創建備份和恢復備份的速度會快很多(尤其是在使用網頁界面時,還要求你下載備份文件然后再重新上傳)。
備份和恢復備份操作分別使用pg_dump和pg_restore工具。在使用zip格式時,備份還包含文件存儲的拷貝,其中為配置Odoo所不保存在數據庫中的文件的拷貝,這是12.0中的默認選項。如果沒做過修改的話,這些文件存放在~/.local/share/Odoo/filestore中。
??如果備份很大,下載時會失敗。這可能是因為Odoo服務無法在內存中處理這么大的文件或者是因為服務在反向代理之后運行(參見第三章 服務器部署)而這個代理設置了HTTP請求大小的限制。反過來,出于某些原因,你可能會在恢復數據庫的操作中遇到問題。當你開始碰到這些問題時,是投入時間建立更健壯的外部備份方案的時候了。
更多內容...
有經驗的Odoo開發人員通常不使用數據庫管理界面,而在命令行執行相關操作。比如使用演示數據初始化新數據庫,可以使用如下的一行代碼:
$ createdb testdb && odoo-bin -d testdb
命令行的另一個彩蛋是你可以在使用時要求安裝一些插件,比如 -i sale,purchase,stock(更多內容請見第二章 管理Odoo服務器實例)。
停止服務并運行如下這些命令來復制數據庫:
$ createdb -T dbname newdbname
$ cd ~/.local/share/Odoo/filestore # 如果你修改了data_dir請調整此處
$ cp -r dbname newdbname
$ cd -
注意在開發的上下文中,文件存儲通常會被省略。
??createdb -T 僅在數據庫沒有活躍會話方能使用,這表示在通過命令行復制數據庫之前你需要關閉Odoo服務。
可運行如下命令來刪除一個實例:
$ dropdb dbname
$ rm -rf ~/.local/share/Odoo/filestore/dbname
可運行如下命令來創建一個備份(假設PostgreSQL服務在本地運行):
$ pg_dump -Fc -f dbname.dump dbname
$ tar cjf dbname.tgz dbname.dump ~/.local/share/Odoo/filestore/dbname
可運行如下命令來恢復備份:
$ tar xf dbname.tgz
$ pg_restore -C -d dbname dbname.dump
??當心!
如果你的Odoo實例使用了另一個用戶來連接數據庫,需要傳遞-U username來使用正確的用戶作為恢復數據庫的所有者。
在一個文件中存儲實例配置
odoo-bin有幾十個選項,記住所有這些以及記得在啟動服務時適當的進行配置會非常單調費力。所幸可以將所有這些存儲在一個配置文件中,只需對想要修改的選項進行手動修改,比如為開發環境。
如何配置
運行如下命令來為你的Odoo實例生成一個配置文件:
$ ./odoo-bin --save --config myodoo.cfg --stop-after-init
你可以添加其它選項,它們的值就會被保存到所生成的文件中了。所有未設置的值都會以默認值進行保存。使用如下命令來獲取選項列表:
$ ./odoo-bin --help | less
這會提供一些不同選項所執行內容的幫助文檔。要從命令行形式轉化為配置形式,使用長選項名,刪除前面的中間杠,并將中間的中間杠轉換為下劃線:
--without-demo就變成了without_demo。對大多數選擇都是如此,但有一些例外,在下一部分中會列出。
編輯myodoo.cfg文件(使用下一部分中的表示來查看所要修改的參數)。然后運行如下命令來以所保存的選項啟動服務:
$ ./odoo-bin -c myodoo.cfg
??-config選項通常簡寫為-c。
運行原理
啟動時,Odoo通過三個步驟來加載它的配置。首先,所有選項的一組默認值會從源碼中進行初始化,然后解析配置文件,該文件中所定義的任意值會覆蓋默認值。最后,會分析命令行選項,它們的值會覆蓋前面步驟中所獲取的配置。
前面我們已提到,配置變量的名稱可通過刪除命令行選項的前置中間杠以及將中間的連接符轉換為下劃線來獲取。其中有一些例外,特別是下面這些:
命令行 | 配置文件 |
---|---|
--db-filter | dbfilter |
--no-http | http_enable = True/False |
--database | db_name |
--dev | dev_mode |
--i18n-import/--i18n-export | 不可用 |
以下是通過配置文件設置的常用選項列表:
選項 | 格式 | 用途 |
---|---|---|
without_demo | 逗號分隔的模塊名列表,或 all(取消所有模塊的演示數據),或 False(為所有模塊啟用演示數據) | 該選項阻止模塊演示數據被加載 |
addons_path | 逗號分隔的路徑列表 | 這是一個服務查找插件的路徑名列表(參見第二章 管理Odoo服務器實例) |
admin_passwd | 文本 | 這是 master 密碼(參見前面部分的內容) |
data_dir | 一個目錄路徑 | 這個目錄中服務會存儲session信息、從網上下載的插件以及在啟用了文件存儲時存放文檔。 |
db_host | 主機名 | 這是運行PostgreSQL服務的服務器名。使用 False 來使用本地 Unix 域套接字,以及 localhost 來使用本地 TCP 套接字。 |
db_user | 數據庫登錄用戶 | 在db_host為 False 時這通常為空。這將是用于連接數據庫的用戶。 |
db_password | 數據庫用戶密碼 | 在db_host為 False以及 db_user 與運行服務的用戶相同時通常為空。閱讀pg_hba.conf的主頁面來獲取更多相關信息。 |
db_name | 數據庫名 | 用于設置一些默認執行命令作用的數據庫名。這不會限制服務所操作的數據庫。參照下面的 dbfilter 參數。 |
dbfilter | 一個正則表達式 | 該表達式應匹配服務所使用的數據庫名。如果你運行網站,應該匹配單個數據庫,類似^databasename$。更多相關信息請參見第三章 服務器部署。 |
http_interface | 網絡接口的 IP 地址 | 默認為0.0.0.0,表示服務監聽所有接口。 |
http_port | ||
longpolling_port | 端口號 | 這些是 Odoo 服務所會監聽的端口。你需要指定這兩者來在同一臺主機上運行多個 Odoo 服務;longpolling_port僅在workers不為0時使用。 |
http_port默認值為8069,longpolling_port默認為8072。 | ||
logfile | 文件路徑 | Odoo 寫入日志的文件。 |
log_level | 日志信息級別 | 指定日志的級別。可接受的值(內容逐漸增加)包括critical, error, warn, info, debug, debug_rpc, debug_rpc_answer, debug_sql。 |
workers | 整數 | worker進程的數量,更多信息參見第三章 服務器部署。 |
list_db | True/False | 設置為 True 來取消列出數據庫。更多信息請參見第三章 服務器部署。 |
proxy_mode | True/False | 激活反向代理WSGI封裝。僅在運行于可信任的 web 代理后啟用它。 |
譯者注:表中的pg_hba.conf文件位置:/etc/postgresql/xxx/main/pg_hba.conf
??Odoo對配置文件的解析現在使用Python的ConfigParser模塊。但是在Odoo 11.0中的實現發生了變化,它不再支持使用變量插值。因此,如果你習慣了使用%(section.variable)s表達式從其它變量的值定義變量值的話,你會需要改變這一習慣并恢復使用顯示的值。
有些選項不在配置文件 使用,但廣泛用于開發之中:
選項 | 格式 | 用途 |
---|---|---|
-i或--init | 逗號分隔的模塊名列表 | 它會在初始化數據庫時默認安裝給定的模塊 |
-u 或-update | 逗號分隔的模塊名列表 | 它會在重啟服務時更新給定的模塊。多在修改了源代碼或從 git 更新了分支時使用 |
--dev | all, reload, qweb, | |
werkzeug, xml | 這會啟用開發者模式并自動加載功能。 |
激活Odoo開發者工具
開發人員在使用Odoo時,應當知道如何在網頁界面激活開發者模式,這樣你就可以訪問技術設置菜單及開發者信息。啟動調試模式會暴露出一些高級配置項及字段。在Odoo中隱藏這些選項和字段來獲取更佳的易用性,因為日常不會使用到它們。
如何激活
按照如下步驟來在網頁界面中激活開發者模式:
- 連接到你的實例并以 admin 登錄
- 訪問Settings菜單
- 找到Share the love版塊,應該是在頁面的右手邊
譯者注:原書中使用企業版進行截圖,Alan 將盡量全部使用社區版本進行操作 - 點擊Activate the developer mode鏈接
- 等待用戶界面重載
??其它方式:也可以通過編輯 URL 來激活開發者模式。在鏈接的#號前,插入?debug。例如,如果你的鏈接是http://localhost:8069/web#menu_id=102&action=94,那么你需要將其修改為http://localhost:8069/web?debug#menu_id=102&action=94。此外,如果你想要使用帶靜態文件的調試模式,則將 URL修改為http://localhost:8069/web?debug=assets#menu_id=102&action=94
譯者注:加(with assets)的模式會將靜態文件(css, js)分拆每一個具體文件,這將有助于調試,但相對于合并的靜態文件而言會損失一些加載速度
通過如下其中一種方式可退出開發者模式:
- 編輯URL并刪除該字符串
- 在開發者模式激活時使用Share the love版塊中的Deactivate the developer mode鏈接
很多開發者使用瀏覽器插件來切換調試者模式。通過使用插件,你可以無需訪問settings菜單快速地切換調試模板。這些插件可在Firefox和Chrome瀏覽器中使用。參見如下截圖,它有助于你在Chrome商店中找到該插件:
運行原理
開發者模式中,會發生兩件事情:
- 鼠標在表單視圖的字段上或列表視圖的列名上懸浮時會給出提示信息,提供有關字段的技術信息(內部名稱、類型等)。
- 調試圖標下拉菜單會顯示在右上角用戶菜單旁,給到顯示的模型相關技術信息的訪問,有各種關聯的視圖定義、工作流、自定義過濾管理等等。
開發模式有一個變體:Developer mode (with assets)。這一模式和普通的開發者模式相似,但除此之外,發送到瀏覽器的avaScript 和 CSS沒有做最小化處理,這表示你瀏覽器的網頁調試工具可以方便地用于調試JavaScript代碼(更多內容請見第十五章 CMS網站開發)。
??注意!
使用非開發者模式及開發者模式來測試你的插件,因JavaScript庫的非最小化版本會隱藏最小化版本中傷你至深的 bug。
從源碼更新Odoo
在第一部分中,我們看到了如何使用git倉庫從源碼安裝Odoo。這一設置的主要好處是可以使用git更新源碼獲取最新的 bug 修復。
準備工作
停止任意當前需更新源代碼的運行中Odoo實例,然后對所有你關心的數據庫做備份,以免更新出現問題。顯然這是你對生產數據庫所需做的事情。參見本章中的管理Odoo服務端數據庫一節獲取更新操作指南。
接下來,記錄下你所運行源碼的當前版本號。這么做最好的方式是使用如下命令創建一個輕量的標簽:
$ cd ~/odoo-dev/odoo
$ git checkout 12.0
$ git tag 12.0-before-update-$(date --iso)
如何更新
使用如下代碼來更新Odoo源碼:
$ git pull –-ff-only origin 12.0
這會獲取提交到當前分支的最新版源代碼。
運行如下代碼更新運行這一代碼的實例:
$ ./odoo-bin -c myodoo.cfg --stop-after-init -u base
??-u是odoo-bin的--update選項的簡寫方式。
如果你沒有在配置文件中設置數據庫,則需添加-d database_name選項。該命令在運行這一版本源代碼的所有實例上都要執行。
如果更新失敗了,不必慌張,因為你有備份:
- 仔細閱讀報錯信息并將其保存到一個文件中,因為這稍后做漏洞報告時會有用。
- 如果你不能確定問題,將服務和Odoo源代碼恢復到上一個版本,我們已知這個本版本可用并在更新源碼版本前使用了標簽進行設置。
$ git reset --hard 12.0-before-update-$(date --iso)
- 刪除出問題的數據庫并從所做的備份進行恢復(參見本章的管理Odoo服務端數據庫一節獲取操作指南)。
- 重啟實例并告知用戶更新延遲了。
??注意在現實生活中,這絕不應該發生在生產數據庫上,因為你應該使用一個復制數據庫來對升級先進行測試、修復問題,并僅在確保其運行沒有問題時在生產服務器上進行升級。但是有時還是會中招,所以即便你很確定,還是要做備份。
運行原理
更新源碼要確保使用git checkout來確定我們處于正確的分支上,然后使用git pull獲取最新的代碼。如果本地做了提交卻沒有在遠程倉庫中時--ff-only會產生錯誤。如果發生了這一錯誤且你想要保留自己的修改,你可以使用git pull(不加--ff-only)來將遠程的修改與你自己的進行合并。如果不保留,使用 git reset --hard origin/12.0來強制更新,這會丟失掉本地的修改。
更新命令使用如下選項:
- -c:指定配置文件
- --stop-after-init:在更新結束時停止實例
- -u base或--update base:請求base模塊的更新
在更新模塊時,Odoo進行如下操作:
- 它更新結構變化了的模塊中所定義的模型數據庫結構。對于Odoo穩定分支的更新,應該不會有這些變化 ,對你自己的插件或第三方插件上可能會發生。
- 它更新存儲在模塊數據文件中的數據庫記錄,尤其是視圖。然后遞歸更新聲明依賴這一模塊的已安裝模塊。
因為base模塊是所有Odoo模塊的隱式依賴,更新它會觸發你的實例中所有已安裝模塊的更新。要更新所有已安裝模塊,可使用別名 all 來替代 base。