全书完整目录请见: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开发者指南补充知识
- 运行如下命令来安装主要依赖
$ 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 [email protected]
- 克隆 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$:仅尝试连接匹配所提供正则表达式的数据库。一个Odoo安装可以为使用不同数据库的多个实例提供服务,通过这一参数限制可用的数据库。最后的那个$很重要,因为在匹配模式中使用了正则表达式,这会避免选择以相同的指定字符串开头的名称。
- --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。