news 2026/9/13 11:13:22

Odoo 如何用 deploy 命令把本地模块打包成 zip 上传并安装到远程实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Odoo 如何用 deploy 命令把本地模块打包成 zip 上传并安装到远程实例

Odoo 如何用 deploy 命令把本地模块打包成 zip 上传并安装到远程实例

【免费下载链接】odooOdoo. Open Source Apps To Grow Your Business.项目地址: https://gitcode.com/GitHub_Trending/od/odoo

当你有一个只包含数据、视图和静态资源的小型 Odoo 模块,想装到一台不在本地的 Odoo 实例上时,不需要把代码目录复制到服务器、改addons_path再重启。Odoo 自带的deploy命令行命令会做三件事:把本地模块目录打包成 zip、带登录凭据把 zip 上传到目标实例、由实例端自动解包并安装该模块。整个流程在 部署命令实现 中,服务端对应逻辑在 上传接口 里。本文按实际执行顺序说明前置条件、命令用法、服务端约束和结果判断。

deploy 命令内部做了什么

理解流程有助于判断报错出在哪一环,deploy.py 的执行链是:

  1. 打包zip_module()把模块目录里的所有文件写入一个临时 zip,每个文件在包内的路径是相对于模块的上级目录的,因此 zip 顶层会是一个以模块名命名的目录(如my_module/__manifest__.py)。路径不是目录时会抛出Could not find module directory '%s'。上传完成后这个临时 zip 会被删除。
  2. 登录定位数据库:先向{url}/web/login?db={db}发起 GET 请求,把目标数据库写入会话。
  3. 上传:向{url}/base_import_module/login_uploadPOST,把 zip 作为mod_file文件字段,并附带loginpassworddbforce字段。服务端鉴权通过后调用_import_zipfile()完成安装(见 ir_module.py)。

前置条件

  • 目标实例已安装base_import_module。该模块auto_install: True且依赖web(见manifest.py),常规 web 实例会自动带上。如果实例上没有它或版本过旧,命令会收到 404 并报错:The server '<url>' does not have the 'base_import_module' installed or is not up-to-date.
  • 使用管理员账号,且该账号未启用 MFA。服务端接口用密码登录,代码中明确request.env.uid is None in case of MFA,此时会抛出Only administrators can upload a module;非管理员同样得到此错误。
  • 本地运行odoo-bin的环境已具备依赖deploy模块直接import requestsrequests在 requirements.txt 中是固定版本的依赖(Python < 3.11 为 2.25.1,>= 3.11 为 2.31.0),随 Odoo 的依赖一起安装即可。

命令格式与参数

命令行帮助信息(command.py 中命令的标准形式为odoo-bin [--addons-path=PATH,...] deploy)对应的参数如下:

./odoo-bin deploy <path> [url] [--db DB] [--login LOGIN] [--password PASSWORD] [--verify-ssl] [--force]
参数说明
path必填,模块目录路径("Path of the module to deploy"),必须是指向模块根目录本身,不是 addons 父目录
url可选,目标实例地址,默认http://localhost:8069;若不以http://https://开头,命令会自动补上https://前缀
--db"Database to use if server does not use db-filter.",服务器未配置 db-filter 时必须用它指定数据库
--login登录名,默认admin
--password密码,默认admin
--verify-ssl校验 SSL 证书;不加此参数时命令会把会话的verify设为False,即默认不校验证书
--force"Force init even if module is already installed. (will updatenoupdate=\"1\"records)",对已安装模块强制重新初始化

执行示例

下面示例中./my_module是本机的模块根目录,http://odoo.example.com是远程实例地址,mydb是目标数据库,密码按实际账号替换:

./odoo-bin deploy ./my_module http://odoo.example.com \ --db mydb --login admin --password <你的admin密码>

若实例启用了 HTTPS 且证书自签、不需要校验,可以加--verify-ssl与否按实际需要选择;向已装过该模块的实例重新初始化时加--force。命令执行时先打印Zipping module directory...Uploading module file...,随后输出服务端返回的响应文本。

服务端对 zip 的约束

上传后,服务端 _import_zipfile 会按以下规则处理,不符合时直接报错:

  • 只接受 zip 文件,且只有管理员可触发安装(Only administrators can install data modules.)。
  • zip 内任何单个文件超过 100 MB(MAX_FILE_SIZE = 100 * 1024 * 1024)会报File '%s' exceed maximum allowed file size
  • manifest 文件必须位于 zip 的第二层,即<模块名>/目录下(代码判断file.filename.count('/') == 1且文件名属于MANIFEST_NAMES)。deploy打包时天然生成这种结构,不要手动改包内路径。
  • 实际导入的是 manifest 中datainit_xmlupdate_xml声明的.xml.csv.sql文件,以及static/目录和i18n/下的.po文件。不会导入 demo 数据——deploy走的上传接口调用_import_zipfile时未启用with_demo
  • zip 里含多个模块时,会按 manifest 的depends做拓扑排序逐个安装;某个目录找不到 manifest 时报No manifest found in '<modules>'. Can't import the zip file.
  • 单个模块导入失败时报Error while importing module '<module>'.,并附带完整的 Python traceback,可按其中的数据错误定位修复。

结果验证

成功时命令不抛异常:打包与上传的两条进度提示后,服务端响应体为空(接口返回_import_zipfile()结果元组的第一个元素,即空字符串),不会打印额外内容。真正的确认要去实例端:该模块会以已安装状态出现在实例的应用列表(设置 → 应用)中,数据、视图和静态资源随之生效。

失败时表现为以下几类输出,均可在 deploy.py 和 controller 中对应到来源:

现象含义
ERROR: The server '<url>' does not have the 'base_import_module' installed or is not up-to-date.实例未安装该模块或版本过旧,升级实例后重试
Could not find module directory '<path>'传入的path不是目录,检查是否误传了 addons 父目录
500 响应,Only administrators can upload a module账号不是管理员,或账号启用了 MFA(密码登录拿不到有效 uid),换用未启用 MFA 的管理员账号
500 响应,Could not select database ...会话里没有定位到数据库,服务器未用 db-filter 时补上--db
500 响应,No manifest found in '...'/Error while importing module '...'zip 结构或模块数据本身的问题,按报错中给出的 traceback 修改模块

限制与边界

  • 该命令只负责打包、上传和安装,不会在目标服务器上保留模块源码目录;导入的模块以ir.module.module记录形式存在于数据库里。
  • demo 数据不会随deploy上传导入(接口未启用with_demo);如需 demo,只能在实例端另行处理。
  • 默认不校验 SSL 证书,对安全要求高的环境应显式加--verify-ssl
  • 临时 zip 由命令在本地系统临时目录创建并在上传结束后删除,不需要手工清理。

相关源码入口:deploy 命令、上传接口、zip 安装实现、命令注册机制。

【免费下载链接】odooOdoo. Open Source Apps To Grow Your Business.项目地址: https://gitcode.com/GitHub_Trending/od/odoo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 11:12:46

LabVIEW水声采集系统实战:NI PXIe+TDMS+FFT深海应用

1. 项目概述&#xff1a;为什么深海高压舱里需要“顺风耳”LabVIEW 实时水声采集——这个标题乍看像科幻片里的装备代号&#xff0c;其实它背后是一套真实部署在海洋科考船、水下试验平台甚至潜艇模拟训练舱里的专业系统。我第一次接触这个项目是在2018年参与某所海洋装备研究院…

作者头像 李华
网站建设 2026/9/13 11:09:40

基于Simulink的IEEE 14节点微电网建模与仿真实践

1. 复合微电网模型构建背景与意义现代电力系统正经历着从集中式向分布式转型的关键时期。在这个背景下&#xff0c;微电网作为整合分布式能源的核心载体&#xff0c;其建模与仿真研究具有重要的工程价值。IEEE 14节点系统作为电力系统分析领域的"标准尺"&#xff0c;…

作者头像 李华
网站建设 2026/9/13 11:09:29

Java集合框架深度解析:从ArrayList到HashMap底层原理

1. 为什么JAVA集合是绕不过去的一道坎不管你是刚接触Java的新人&#xff0c;还是已经在写业务代码的初级工程师&#xff0c;集合框架迟早会找上你。我第一次面试的时候&#xff0c;被问了一个到现在都记得很清楚的问题&#xff1a;"ArrayList和LinkedList到底该用哪个&…

作者头像 李华