高级主题¶
容器¶
每个构建都隔离在自己的容器(Linux 命名空间容器)中。基础环境是一个基于 Ubuntu 的系统,其中安装了 Odoo 所需的全部依赖项,以及常用的实用软件包。
如果您的项目需要 额外的 Python 依赖项 或更新的版本,可以在分支根目录下定义一个列出这些依赖项的 requirements.txt 文件。平台会确保这些依赖项安装在您的容器中。
更多内容
如需具体示例,请参阅 Odoo 社区版的 requirements.txt 文件 。
注解
此外,还会考虑 子模块 的 requirements.txt 文件。平台会在每个包含 Odoo 模块的文件夹的上级文件夹中查找此类文件。
目录结构¶
由于容器基于 Ubuntu,其目录结构遵循 文件系统层次结构标准 。
更多内容
与 Odoo.sh 相关的目录如下:
.
├── home
│ └── odoo
│ ├── backup.daily
│ ├── data
│ │ ├── filestore Database attachments, as well as the files of binary fields
│ │ └── sessions Visitors and users sessions
│ ├── logs
│ │ ├── install.log Database installation logs
│ │ ├── odoo.log Running server logs
│ │ ├── update.log Database updates logs
│ │ └── pip.log Python packages installation logs
│ └── src
│ ├── odoo Odoo Community source code
│ │ └── odoo-bin Odoo server executable
│ ├── enterprise Odoo Enterprise source code
│ ├── themes Odoo Themes source code
│ └── user Your repository branch source code
└── usr
├── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX standard libraries
├── local
│ └── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX third-party libraries
└── usr
└── bin
└── pythonX.X Python X.XX executable
数据库 Shell¶
在通过 Shell 访问容器时,您可以使用 psql 命令访问数据库。
odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.
odoo-master-1=>
警告
当 SQL 语句会导致更改(例如 UPDATE、DELETE、ALTER 等)时,请始终使用 事务 (例如 BEGIN (…) COMMIT / ROLLBACK),尤其是在生产数据库中。事务机制是您犯错时的安全保障。您只需回滚更改,即可将数据库恢复到之前的状态。
请勿忘记提交或回滚事务。未结束的事务可能会锁定表中的记录,正在运行的数据库可能会等待这些锁被释放,从而导致服务器无限期挂起。
此外,请先使用暂存数据库测试您的语句。这能为您提供额外的安全保障。
示例
您忘记设置 WHERE 条件。在这种情况下,您可以回滚以撤销不需要的更改:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK
然后,重写语句并提交更改:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-master-1=> COMMIT;
COMMIT
运行 Odoo 服务器¶
您可以从容器 Shell 启动一个 Odoo 服务器实例。您将无法通过 Web 浏览器从外部访问该实例,但可以执行以下操作,例如:
使用 Odoo Shell:
odoo-bin shell >>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1) >>> partner.name 'ASUSTeK' >>> partner.name = 'Odoo' >>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name 'Odoo'
安装模块:
odoo-bin -i sale --without-demo=all --stop-after-init小技巧
参数
--without-demo=all可阻止为所有模块加载演示数据。参数
--stop-after-init会在操作完成后立即关闭服务器实例。
更新模块:
odoo-bin -u sale --stop-after-init
运行模块的测试:
odoo-bin -i sale --test-enable --log-level=test --stop-after-init
更多内容
要查找 Odoo.sh 运行服务器时使用的插件路径,请在日志 ~/logs/odoo.log 中查找 “odoo: addons paths”。
2025-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 18.0
2025-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2025-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/18.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']
警告
您在 Odoo 服务器实例上执行的操作并非隔离的;更改会反映到数据库中。请记住始终在暂存数据库中进行测试。
在 Odoo.sh 中调试¶
注解
调试 Odoo.sh 构建与调试其他 Python 应用程序并没有太大区别。因此,本节旨在介绍 Odoo.sh 平台的特性与限制,并假定您已经知道如何使用调试器。
您可以使用 pdb、pudb 或 ipdb 在 Odoo.sh 上调试代码。由于服务器在 Shell 之外运行,您无法直接从 Odoo 后端启动调试器,因为它需要有 Shell 才能运行。
pdb 默认安装在每个容器中。
小技巧
要使用 pudb 或 ipdb ,必须通过以下任一方式安装它们:
将其永久添加到项目的
requirements.txt文件中,或通过运行相关命令临时安装(仅限当前构建):
pip install pudb --user
pip install ipdb --user
要触发调试器,请将以下内容添加到要调试的代码中:
import sys if sys.__stdin__.isatty(): import pdb; pdb.set_trace()
注解
条件
sys.__stdin__.isatty()是一种用于检测您是否从 Shell 运行 Odoo 的变通方法。接下来,保存文件并运行 Odoo Shell:
odoo-bin shell
使用 Odoo Shell 触发您要调试的代码。
子模块¶
Git 子模块 让您可以将外部仓库直接链接到项目中,而无需复制粘贴代码,并通过将依赖项与主代码库一起克隆来简化部署。您可以通过选择确切的分支并固定特定的提交版本来保持精确的版本控制,以便随时按需更新。
在 Odoo.sh 上,平台会自动检测子模块并将其添加到您的插件路径中以便安装数据库,前提是在集成私有仓库时,您已在 项目与仓库设置中配置部署密钥。
添加子模块¶
注解
目前,无法通过 Odoo.sh 添加 私有 仓库。不过,您仍可以使用 Git 来完成。
在 Odoo.sh 项目的 分支 视图中,选择要在其中添加子模块的分支。
在右上角,点击 子模块 ,然后点击 在 Odoo.sh 上运行 。
在对话框中,填写以下内容:
仓库 URL :仓库的 SSH URL
小技巧
在 GitHub 上,点击 克隆 ,选择 SSH ,然后复制 URL。
分支 :应使用的特定分支
路径 :子模块在您的分支中应添加到的文件夹
在终端中,在克隆 Git 存储库的文件夹中,检出要在其中添加自有模块的分支:
git checkout <branch>
添加子模块:
git submodule add -b <branch> <git@yourprovider.com>:<username/repository.git> <path>
<git@yourprovider.com>:<username/repository.git>:要作为子模块添加的仓库的 SSH URL
<branch>:您要在上述仓库中使用的分支
<path>:您要在其中添加此子模块的文件夹
提交并推送更改:
git commit -a && git push -u <remote> <branch><remote>:您要将更改推送到的仓库。在标准 Git 设置中,这通常是 origin。
<branch>:您要将更改推送到的分支。很可能就是您在第一步中检出的分支。
小技巧
添加包含许多模块的仓库时,如果其中某些模块会被自动安装,您可能希望忽略它们。为此,请在子模块文件夹前加上 . (例如 .folder)。平台将忽略此文件夹,您可以通过从另一个文件夹创建指向这些模块的 符号链接 来手动挑选模块。
计划操作¶
在 Odoo.sh 平台上,计划操作的实现方式与常规 Odoo 服务器略有不同,并且是在尽力而为的基础上运行的。这是因为同一服务器上可能有多个客户,而每个客户都保证能公平地分享服务器资源。因此,无法保证计划操作的准确运行时间。
重要
请不要期望任何计划操作的运行频率高于每五分钟一次。
由于计划操作的执行时间有限,建议确保您的计划操作:
处理小批量的记录。
在处理完每一批后提交其工作成果,这样即使它们因时间限制而中断,也无需从头开始。
具有幂等性,即如果它们的启动频率高于预期,也不得产生副作用。
IP 地址变更¶
此外,当生产实例的 IP 地址发生变化时,Odoo 会 主动提示变更 ,会向路径 /_odoo.sh/ip-change 发出 HTTP GET 请求,并将新的 IP 地址作为查询字符串参数 (new) 和以前的 IP 地址作为附加参数 (old) 。
此机制允许在 IP 地址变更时触发自定义操作(例如发送电子邮件、调用防火墙 API、配置数据库对象等)。
出于安全原因,/_odoo.sh/ip-change 路由只能由平台本身内部访问,如果通过任何其他方式访问,将返回 403 响应。
下面是一个伪实现示例:
class IPChangeController(http.Controller):
@http.route('/_odoo.sh/ip-change', auth='public')
def ip_change(self, old=None, new=None):
_logger.info("IP address changed from %s to %s", old, new)
# Then perform whatever action is required for your use case, e.g., update an
# ir.config_parameter, send an email, contact an external firewall service's API, ...
return 'ok'