2026 年 10 月 31 日,Odoo 14 在 Odoo.sh 上被永久封锁(end-of-life 闸门落下)。对跑在托管版上的企业来说,这只是一个日期;但对大量跑在自有服务器、靠社区生态活着的 Odoo 用户来说,这其实是一次「免费午餐」的账单到期提醒。
过去一周,"开源 ERP 升级" 这个老话题,突然有了新重量。Odoo 20 已经在 9 月底布鲁塞尔 Odoo Experience 正式发布,首批稳定补丁 20.0.1 预期在 10 月底到 11 月落地。表面看,升级窗口照常打开。但只要你用的是 Community 版、且依赖一批社区与第三方模块,真实情况就完全两样——版本 EOL 只是倒计时,社区生态能不能追上,才是真正的截止日。
一、版本 EOL 不是终点,开源社区"追上"才是
先厘清一个常被混为一谈的事实:Odoo 的"标准支持"只覆盖最近三个大版本,而 Odoo.sh 的 EOL 闸门会硬性切断老版本的托管运行。Odoo 14 已于 2026-10-31 在 Odoo.sh 被永久封锁,Odoo 15 的封锁日定在 2027-10-31。也就是说,停在上两个版本以上的用户,先面临"托管跑不了",再面临"标准不支持"。
但 Enterprise 用户和 Community 用户,面对的是两套完全不同的升级现实。这就是 10 月 25 日我们谈"版本生命周期治理"时没有展开的隐藏层:
| 升级路径 | Enterprise(付费订阅) | Community(社区版) |
|---|---|---|
| 官方升级服务 | upgrade.odoo.com / Odoo.sh 一键请求 | 无官方服务,需自执行 |
| 跨版本跳级 | 一次请求直达目标版本 | OpenUpgrade 逐版本迁移,跳级=多次运行 |
| 20.0 脚本就绪度(截至 2026-10-16) | 官方平台已支持 | OCA OpenUpgrade 20.0 仅初始提交,无迁移脚本 |
| 自托管主机要求 | PostgreSQL 16 + Python 3.12 | PostgreSQL 16 + Python 3.12(相同) |
关键差异在中间两行。OCA(Odoo Community Association)维护的开源升级项目 OpenUpgrade,其 20.0 分支截至 2026-09-28 只有初始提交,到 10 月 16 日仍"没有可用的迁移脚本"——而每一次大版本的标准模块迁移脚本,通常要"用数月时间慢慢补齐"。换句话说,等社区把 20.0 的迁移能力铺齐,最早也要到 2027 年第一季度前后。这期间,卡在 v14/v15/v16 的 Community 用户,没有官方安全网。
开源的"免费"从来不是零成本,而是把"版本升级的工程责任"从厂商转移给了企业自己。版本号到期那天,账单才刚寄到。
二、三个"看不见"的技术断点,让 v20 比往常更贵
如果说社区脚本滞后是一个"时间"问题,那么 Odoo 20 本身的三处技术断点,就是实打实的"钱"的问题。多家实施伙伴在 10 月的迁移指南里一致警告:这是一次"高于平均水平的基建账单"。
- 权限模型重写(ir.access)。Odoo 20 移除了
ir.model.access与ir.rule,合并为统一的ir.access(一个可选组、一组操作子集、一个可选域)。安全数据文件从ir.model.access.csv改为ir.access.csv。任何写了自定义权限规则、全局记录规则的模块,都要在升级时重新转换并人工复核。 - 运行底座强制抬升。
release.py中MIN_PG_VERSION = 16、MIN_PY_VERSION = (3, 12)。Odoo 19 还接受 PostgreSQL 13 与 Python 3.10,很多在跑的老服务器必须重装系统组件才能启动 Odoo 20。Ubuntu 24.04 才同时自带 PG16 与 Python 3.12。 - 前端框架 Owl 3 + RPC 退役。Web 客户端迁到 Owl 3,旧的 RPC 接口进入退役倒计时。任何自定义 JavaScript、依赖旧接口的第三方模块,都需要重写。实施伙伴称这次的"破坏性"超过 18→19 那一跳。
一位独立实施顾问的总结很直白:"Odoo 20 是一次正常的发布,但附带了一张高于平均水平的基建账单。决定你的不是版本号,而是你属于三种压力里的哪一种——一个不再受支持的 v17 安装、一台无论如何都要为 PG16/Python3.12 重建的服务器,还是一个会被权限重写打穿的自定义模块。"
OCA 社区模块历史滞后于大版本发布的时间差——你依赖的第三方模块,往往要等主版本发布后两三个月才出兼容版
三、社区依赖风险:一个缺失的模块,能堵死整次升级
真正的升级杀手,往往不是 Odoo 标准功能,而是企业自己堆叠的那一层:OCA 模块、App Store 第三方应用、以及团队写的自定义模块。
实施伙伴在 10 月的迁移指南里反复强调一个朴素事实:"一次迁移里,数据库本身的升级并不难,真正的工程量在自定义模块和第三方应用上。"更致命的是——一个缺失 20.0 版本的模块,就能堵死整次升级。如果你的进销存靠某个 OCA 库存增强、财务靠某个本地化税模、报表靠某个社区看板,而这些模块的 20.0 版本还没发布,那么即便标准库能升,业务也跑不起来。
Enterprise
走官方升级服务,数据库标准部分由厂商负责;但自定义模块、伙伴模块、第三方应用的移植不在 SLA 内——"属于你自己的,还是你自己的"。
Community
OpenUpgrade 脚本需自己或伙伴执行,且 20.0 脚本尚未就绪;模块兼容性风险完全内化,无厂商兜底。
这也是为什么 DACH 地区的实施伙伴会直白建议:如果你依赖 OCA 扩展,请"据此规划"——在 20.0 兼容模块铺齐之前,先升到 19(已有一年修复),等社区就绪后再走最后一步。这个"两段式"策略,本质是用时间换确定性。
最常见的三个误判:① 以为 Odoo 20 发布=随时可升,结果 OpenUpgrade 20.0 脚本空仓;② 以为"免费升级"=零成本,结果忽略了 PostgreSQL 16 / Python 3.12 的主机重建与 Owl 3 的前端重写;③ 以为标准库升完就万事大吉,结果被一个未兼容的第三方模块卡在半路。三者叠加,正是 Community 用户升级"翻车"的典型路径。
四、给 CIO 的实操建议:把"升级"当成项目,而不是操作
落到可执行的清单,建议任何正评估 Odoo 20 的数字化负责人,按下面的顺序做一遍"升级前置体检":
第一步:列全模块清单,而不是只看版本号。逐项标注哪些自定义/第三方模块定义了 ir.rule 记录、硬编码了图标类、或依赖被合并的模块(如 Field Service 在 19.2 已并入 Planning)。一个模块缺失 20.0 版本,就足以阻断整次升级。
第二步:先核对主机,再谈版本。用一条命令确认 python3 --version 与 psql --version 是否满足 PG16 / Python 3.12。不满足的,把"服务器重建"一并计入预算与时间窗。
第三步:决定"一步到 20"还是"先 19 再 20"。若依赖的第三方模块尚无 20.0 版本,先停在 19(已有一年的修复沉淀)是更低风险的路径;否则一次上传到 20 省掉二次迁移。
第四步:用"中性化副本"做多轮演练。切勿在生产副本上直接试升级(它会连真实客户发邮件、连真实支付)。先用 odoo-bin neutralize 关掉外部连接,跑 UAT 时按部门、按关键流程签字验收。
最后一句提醒:把 AI 的问题和版本的问题分开决策。Odoo 20 的内置 AI(AI 代理、MCP 服务器)属于 Enterprise 模块,Community 代码里根本不存在;社区版的"AI 能力"只能靠外部 MCP 客户端或自建方案补齐。因此"要不要上 AI"不应和"要不要升 v20"绑在一起拍板——前者是战略,后者是工程。
写到这里,结论很清楚:Odoo 14 在 Odoo.sh 被封锁的 10 月 31 日,并不是故事的结尾,而是"开源 ERP 真实成本"这一课的开学日。版本 EOL 是厂商给出的公开截止日,而社区生态追上、模块兼容、主机重建、权限重写,才是企业自己要扛的隐藏截止日。谁先把这份账单看清,谁就能把"免费"两个字,真正算成一笔明白账。
本文基于公开信息整理分析:Odoo Community Upgrade(winotto.com,2026-10-16)、Cybrosys《How to Plan Your Odoo 20 Migration》(2026-10-05)、Ruetech《Odoo 20 – What the New 2026 Release Brings》(2026-10)、Goran Štimac《Odoo 20: what actually changed》(2026-10)、CODEerts《Odoo 20: What's New》(2026-10)。数据截至 2026-11-01。
众谛信息 · 专注 Odoo 与企业管理数字化解决方案
