高级主题

本节涵盖 Odoo.sh 的高级功能,包括 容器、Git 子模块 和 计划操作。

容器

每个构建都被隔离在其自己的容器(Linux namespace 容器)中。基础是一个基于 Ubuntu 的系统,其中安装了 Odoo 所需的所有依赖项以及常用且有用的软件包。

如果您的项目需要 额外的 Python 依赖项 或更新的版本,您可以在分支根目录定义一个 requirements.txt 文件列出它们。平台将确保这些依赖项安装在您的容器中。

另请参阅

注解

子模块 的 requirements.txt 文件也会被纳入考虑。平台会在包含 Odoo 模块的每个文件夹的父文件夹中查找此类文件。

目录结构

由于容器基于 Ubuntu,其目录结构遵循 Filesystem Hierarchy Standard。

与 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 访问容器时,您可以使用 psql 命令访问数据库。

odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.

odoo-master-1=>

警告

当 SQL 语句导致变更(例如 UPDATE 、 DELETE 、 ALTER 等)时,请务必使用 transactions (例如 BEGIN (…) COMMIT / ROLLBACK ),尤其是对于您的正式运行数据库。事务机制是您的安全网,以防出错。您只需回滚您的更改即可将数据库恢复到之前的状态。

不要忘记提交或回滚事务。未提交的事务可能会锁定表中的记录,正在运行的数据库可能会等待它们释放,导致服务器无限期挂起。

此外,请先使用您的预发布数据库测试语句。这为您提供额外的安全网。

Example

您忘记设置 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
    

另请参阅

CLI 文档

要找到 Odoo.sh 运行您的服务器所使用的 addons 路径,请在日志 (~/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 平台的特殊性与限制,并假设您已经了解如何使用调试器。

您可以在 Odoo.sh 上使用 pdb、pudb 或 ipdb 调试代码。由于服务器在 shell 之外运行,您无法直接从 Odoo 后台启动调试器,因为它需要 shell 才能工作。

pdb 默认安装在每个容器中。

小技巧

要使用 pudb 或 ipdb,您必须通过以下任一方式安装它们:

  • 永久安装:将 pudb 或 ipdb 添加到项目的 requirements.txt 文件中,或者

  • 临时安装(仅在当前构建中):运行相应的命令:

    pip install pudb --user
    
    pip install ipdb --user
    
  1. 要触发调试器,请在您想调试的代码中添加以下代码:

    import sys
    if sys.__stdin__.isatty():
        import pdb; pdb.set_trace()
    

    注解

    条件 sys.__stdin__.isatty() 是一种变通方案,用于检测您是否正在从 shell 运行 Odoo。

  2. 接下来,保存文件并运行 Odoo shell:

    odoo-bin shell
    
  3. 使用 Odoo shell 触发您想调试的代码。

    在 Odoo.sh shell 中运行 pdb

子模块

Git submodules 让您无需复制粘贴代码即可将外部仓库直接链接到项目中,通过将依赖项与主代码库一并克隆来简化部署。您可以通过选择精确的分支并固定特定的提交修订版本来实现精确的版本控制,并按需更新。

在 Odoo.sh 上,平台会自动检测子模块并将其添加到您的 addons 路径中以用于数据库安装,前提是您 在项目和仓库设置中配置部署密钥,以便在集成私有仓库时使用。

添加子模块

注解

目前,无法通过 Odoo.sh 添加 私有 仓库。不过,您仍可以使用 Git 来完成此操作。

  1. 从 Odoo.sh 项目的 分支 视图中,选择您想添加子模块的分支。

  2. 在右上角,点击 Submodule,然后点击 Run on Odoo.sh。

  3. 在对话框中填写以下内容:

    • Repository URL:仓库的 SSH URL

      小技巧

      在 GitHub 上,点击 克隆,选择 SSH,并复制 URL。

    • Branch:应使用的具体分支

    • Path:应添加子模块的文件夹

小技巧

当添加包含许多模块的仓库时,如果其中某些模块会被自动安装,您可能希望忽略它们。为此,请在子模块文件夹前添加 . 前缀(例如 .folder)。平台将忽略此文件夹,您可以通过从另一个文件夹创建指向这些模块的 symbolic links 来手动选择它们。

计划操作

在 Odoo.sh 平台上,计划任务的实现方式与普通 Odoo 服务器略有不同,且采用尽力而为的方式运行。这是因为同一服务器上可能存在多个客户,每个客户都能获得服务器资源的公平份额。因此,无法保证计划任务的精确运行时间。

重要

请勿期望任何计划任务的运行频率超过每五分钟一次。

由于计划任务的执行时间有限,建议确保您的计划任务:

  • 以小批次的记录进行处理。

  • 在处理完每个批次后提交它们的工作,这样即使因时间限制被中断,它们也无需重新开始。

  • 是幂等的,即它们即使被比预期更频繁地启动,也绝不能产生副作用。