ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Odoo 16 实施避坑指南:基础配置、单据凭证联动与部署调优

Odoo 16 实施避坑指南:基础配置、单据凭证联动与部署调优

简介:本资源是一份面向Odoo初学者与实施人员的系统性入门指南,聚焦Odoo 16生态下的中国本土化实践——GoodERP平台。内容覆盖从环境部署、基础配置到采购销售、仓库管理、生产制造(组装/委外/工序)、MRP分析及高级运维优化等全业务流程,同时包含权限设计、多币种外贸、PostgreSQL调优、Nginx反向代理、多核性能提升等实战要点,兼顾功能应用与技术布署双重需求。资源为单文件PDF文档,共1个,大小9.01MB,结构清晰、章节完整,含19章详实操作指引与大量配置截图提示(如用户权限设置、计量单位录入、销售退货处理、凭证号重排等),便于边学边练。目前已有276人学习下载,适合零基础转型ERP实施顾问、中小企业IT运维人员及希望深入理解Odoo中国版落地逻辑的技术爱好者。

1. Odoo 16 实施不是装完就能用:一份踩过37个坑、重配过5次数据库的实战指南

你刚下载完 Odoo 16,双击启动脚本,浏览器打开http://localhost:8069,看到那个熟悉的登录页——恭喜,你只完成了实施旅程的 8%。真正的门槛不在安装,而在「基础资料配置」那一章里埋着的 23 个隐性依赖:比如没提前设好“公司开户行”,后续采购付款单根本无法生成凭证;比如漏勾“根据发票确认应收应付”,销售发货后财务模块直接失联;再比如计量单位没建父子关系,BOM 层级一展开就报KeyError: 'uom_id'。这份《Odoo16 实施应用,入门必备》不是理论手册,而是某开发者在保定一间出租屋里,用三台不同配置的服务器、四套真实中小制造企业账套反复验证后,把 GoodERP(Odoo 16 中国化分支)从“能跑”推到“能管”的血泪笔记。它不讲 Python 类继承,不画 UML 图,只解决你明天上午 9 点就要给客户演示时卡住的问题:怎么让销售订单自动带出客户期初应收款?怎么让采购入库单过账后秒出应付凭证?怎么把 Excel 里那 2876 行商品一次性塞进系统还不崩?如果你正站在 Odoo 实施的第一道墙前——不是缺概念,是缺参数、缺顺序、缺那个“少点一下就全错”的关键动作——这篇就是为你写的。


2. 基础资料配置:所有流程崩溃的起点,也是唯一可控的修复锚点

GoodERP 的实施逻辑是“数据驱动流程”,而非“流程驱动数据”。这意味着:采购单能否生成入库单,取决于供应商是否绑定了正确的“应付科目”;销售发货能否触发库存扣减,取决于商品是否设置了“库存类型”和“计价方法”;甚至连“客户名称”字段能不能输入中文,都受制于 PostgreSQL 数据库初始化时的LC_COLLATE编码设置。本章不罗列菜单路径,只聚焦三个必须前置完成、且顺序不可逆的核心配置块:公司主体、资金账户、业务伙伴分类。每一步都附带验证方式和失败回滚指令——因为你在第 2.3 节设错一个税率,第 5.5 节销售退货时就会发现凭证借贷不平,而那时再回头改,已生成的 142 张凭证全得手动冲销。

2.1 公司主体配置:会计属性决定整个账套的血液流向

公司配置不是填个名字地址就完事。在配置 → 高级配置 → 公司页面,必须严格校验以下四个字段,缺一不可:

  • 进项税税率:必须为数值型(如13.0),不能带%符号,否则采购发票验证时报float() argument must be a string or a number
  • 销项税税率:同上,且需与税务登记证一致,后期开票模块强校验
  • 开户行:必须从资金 → 设置 → 账户中已存在的银行账户里选择,不能手输(手输会导致后续付款单找不到结算路径)
  • 根据发票确认应收应付:勾选此项后,销售发货不再自动生成应收账款,必须经资金 → 结算单手动确认;不勾选则发货即生凭证,但无法做账龄分析

提示:修改公司配置后,必须重启 Odoo 服务才能生效。执行sudo systemctl restart odoo后,检查日志末尾是否出现INFO ? odoo.service: Database updated.字样,否则配置未载入。

2.2 资金账户与期初余额:出纳权限用户的第一个生死线

资金账户是 GoodERP 的“心脏起搏器”。使用出纳权限账号(非 Administrator)登录,进入资金 → 设置 → 账户,创建主账户时注意三点:

  1. 账户类型必须选“银行”:即使你用的是微信/支付宝,也必须选“银行”,否则付款单无法关联结算方式
  2. 期初余额录入方式:点击“期初余额”按钮,在弹窗中输入金额后,系统会自动生成一张其他收入单和对应会计凭证(科目:银行存款 / 其他应付款)。此操作不可逆,若输错,需用管理员账号进入会计 → 过账 → 凭证手动作废并删除
  3. 开户行字段绑定:必须与 2.1 节中公司配置的“开户行”完全一致(字符、空格、标点均需匹配),否则采购付款时提示No bank account found for company XXX

验证是否成功:用出纳账号新建一笔资金 → 收款 → 客户收款,选择该账户,金额填100,保存后查看会计 → 过账 → 凭证,应存在一条银行存款 ↑100 / 应收账款 ↓100的凭证。

2.3 业务伙伴分类:客户/供应商不是“人”,而是“会计规则容器”

在 Odoo 体系里,“客户”和“供应商”本质是两套独立的会计规则集合。必须通过配置 → 基本配置 → 类别创建分类,并为每个分类指定会计科目:

分类名称适用对象必须指定的科目错误后果
一般纳税人客户开具专票的客户应收账款(1122)、应交税费-应交增值税(销项税额)(22210101)销售发票无法保存,报Account not set for partner category
小规模纳税人供应商接收普票的供应商应付账款(2202)、应交税费-应交增值税(减免税额)(22210105)采购入库单过账失败,提示No account defined for supplier category

注意:科目编码必须与会计 → 科目 → 科目表中完全一致。GoodERP 默认科目表基于《小企业会计准则》,编码如1122(应收账款)、2202(应付账款)等,不可擅自修改位数。

2.4 用户权限隔离:销售员看不到别人客户的底层实现

很多实施者卡在“权限设置”环节,以为勾选销售 → 客户就够了。实际需三步闭环:

  1. 创建用户组:配置 → 用户 → 组,新建组销售员-仅看本人客户
  2. 设置记录规则(Record Rule):在该组的“记录规则”标签页,添加规则:
    ['|', ('user_id', '=', user.id), ('create_uid', '=', user.id)]
    此规则限制该组用户只能看到自己创建或分配给自己的客户
  3. 分配用户到组:编辑销售员账号,在“群组”标签页勾选刚建的组,并取消勾选所有含销售 → 所有客户权限的默认组

验证:用销售员账号登录,进入销售 → 客户,列表应为空;新建一个客户并保存,该客户才可见。若仍能看到全部客户,说明未取消默认组权限——这是新手最高频翻车点。

2.5 避坑:基础资料配置的五个致命陷阱

现象 → 原因 → 解决,按真实发生频率排序:

  1. 现象:采购订单保存时报KeyError: 'currency_id'
    原因:未在配置 → 高级配置 → 公司中设置“本位币”,或公司页面未保存就跳转
    解决:返回公司配置页,下拉到底部点击“保存”,重启 Odoo 服务

  2. 现象:商品设置里勾选“管理批号”后,销售发货单无法选择该商品
    原因:“批号管理”需配合“库存类型”=“可存储”且“计价方法”=“先进先出”或“平均成本”,三者缺一不可
    解决:编辑商品 → “库存”选项卡 → 检查三项设置,全部启用后保存

  3. 现象:导入 Excel 客户数据时,1000 行只成功 327 行,无报错日志
    原因:Excel 中“国家”字段值为China,但 GoodERP 内置国家代码是CN,字段映射失败导致整行跳过
    解决:导入前用 Excel 替换China→CN,或在导入向导中将“国家”字段映射为country_id/id(使用外部 ID)

  4. 现象:设置好“月结30天”付款方式后,销售订单的“到期日”仍是创建日期
    原因:付款方式未绑定到客户分类,或客户档案中未选择该分类
    解决:进入客户分类 → “付款方式”字段选择“月结30天”;编辑客户 → “客户分类”选择该分类

  5. 现象:多币种客户下单时,金额自动按 1:1 换算,未走汇率表
    原因:未在会计 → 多币种 → 汇率中为该币种设置当日汇率,或汇率状态为“草稿”
    解决:进入汇率表 → 筛选币种 → 点击“发布”,确保状态为“已发布”


3. 采购与销售流程:从单据流转到凭证生成的完整链路拆解

Odoo 的魅力在于单据自动驱动财务,但前提是每张单据的“基因”必须正确。采购订单(PO)不是孤立文档,它是采购入库单(IN)、应付凭证(AP)、付款单(Payment)的父体;销售订单(SO)同理,是发货单(DO)、应收凭证(AR)、收款单(Receipt)的源头。本章不教你怎么点按钮,而是告诉你:当 PO 状态从确认变为收货时,系统后台究竟执行了哪 7 个原子操作?为什么你的 PO 卡在等待收货却始终不生成入库单?答案藏在采购 → 配置 → 设置的三个开关里——它们默认关闭,但却是中国财税合规的刚需。

3.1 采购流程:三单联动的触发条件与断点排查

标准采购流程:PO → IN → AP。但 GoodERP 要求显式开启联动开关:

  1. 开启“收货自动生成入库单”:采购 → 配置 → 设置→ 勾选收货时自动生成入库单

    • 若未勾选:PO 确认后,需手动进入库存 → 入库单创建,且必须关联 PO 编号
    • 若已勾选但未生效:检查 PO 的“供应商”是否属于2.3 节设置的“一般纳税人供应商”分类,且该分类绑定了应付科目
  2. 入库单过账生成应付凭证的条件:

    • 入库单状态必须为已收货(非草稿或等待收货)
    • 商品必须设置了“存货科目”(在商品档案 → “会计”选项卡 →存货科目字段)
    • 供应商必须设置了“应付科目”(在供应商档案 → “会计”选项卡 →应付科目字段)

验证链路:创建 PO → 确认 → 查看库存 → 入库单是否自动生成 → 点击“过账” → 查看会计 → 过账 → 凭证是否出现原材料 ↑ / 应付账款 ↑凭证。

3.2 销售流程:发货即生凭证的税务合规开关

国内销售场景要求“发货即确认收入”,这与 Odoo 默认的“开票确认收入”冲突。必须调整:

  1. 关闭“按发票确认应收”:配置 → 高级配置 → 公司→ 取消勾选根据发票确认应收应付

    • 勾选时:发货单过账 → 生成库存商品 ↓ / 发出商品 ↑,开票后才生成应收账款 ↑ / 主营业务收入 ↑
    • 不勾选时(推荐):发货单过账 → 直接生成应收账款 ↑ / 主营业务收入 ↑ / 应交税费-销项税额 ↑
  2. 强制发货单带出税率:编辑商品 → “会计”选项卡 →税金字段选择“13%销售税”,否则发货单税率为空,凭证无法过账

  3. 销售退货的凭证反向逻辑:

    • 正常退货:销售 → 退货单→ 选择原发货单 → 过账 → 自动生成红字凭证(应收账款 ↓ / 主营业务收入 ↓ / 应交税费 ↓)
    • 关键避坑:退货单必须与原发货单在同一会计期间,否则系统拒绝过账,报Period mismatch for reversal entry

3.3 采购付款与销售收款:银行流水与凭证的终极对账

付款/收款单不是简单记账,而是连接银行账户与总账的桥梁:

  • 采购付款单:资金 → 付款 → 供应商付款

    • 必须选择“付款账户”(2.2 节创建的银行账户)
    • “付款方式”必须与供应商分类绑定的付款方式一致(如“电汇”)
    • 过账后生成凭证:应付账款 ↓ / 银行存款 ↓
  • 销售收款单:资金 → 收款 → 客户收款

    • “收款账户”必须与公司开户行一致
    • “结算方式”必须与客户分类绑定的结算方式一致(如“支票”)
    • 过账后生成凭证:银行存款 ↑ / 应收账款 ↓

提示:所有付款/收款单过账后,可在资金 → 对账 → 银行对账单中导入银行 CSV 流水,系统自动匹配凭证。匹配失败的单据会标红,需人工核对金额、日期、摘要。

3.4 避坑:流程卡顿的六个高频断点

  1. 现象:PO 确认后,库存 → 入库单列表为空
    原因:采购 → 配置 → 设置中未勾选收货时自动生成入库单,或 PO 的“仓库”字段为空
    解决:编辑 PO → “仓库”选择默认仓库(如WH/Stock)→ 重新确认

  2. 现象:销售发货单过账时报No account defined for product
    原因:商品档案中“会计”选项卡的收入科目为空
    解决:编辑商品 → “会计”选项卡 →收入科目选择6001 主营业务收入

  3. 现象:付款单过账后,会计 → 过账 → 凭证中无记录
    原因:付款单的“付款账户”未设置“银行”类型,或该账户未启用
    解决:进入资金 → 设置 → 账户→ 编辑该账户 → 勾选启用

  4. 现象:客户收款单过账后,应收账款余额未减少
    原因:收款单的“客户”未选择,或选择了错误客户(ID 不匹配)
    解决:收款单页面 → 点击“客户”字段右侧放大镜 → 从列表选择,勿手输

  5. 现象:销售退货单过账时报You cannot create journal items on an archived account
    原因:退货涉及的“主营业务收入”科目被禁用(状态为“已归档”)
    解决:会计 → 科目 → 科目表→ 搜索6001→ 取消勾选已归档

  6. 现象:同一笔采购,入库单过账生成凭证,付款单过账又生成凭证,但银行对账不平
    原因:付款单的“付款日期”早于入库单过账日期,导致凭证期间错乱
    解决:付款单日期必须 ≥ 入库单过账日期,否则需调整会计期间或手工调整凭证日期


4. 仓库与库存管理:批次、序列号、多仓调拨的硬核配置

仓库不是“放货的地方”,而是 Odoo 的物理空间引擎。GoodERP 支持多仓库、多库位、批次追溯、序列号管控,但所有高级功能都依赖一个前提:库存类型(Inventory Type)必须正确设置。很多实施者把商品设成“可存储”,却忘了在“库存”选项卡勾选“管理批号”,结果上线后客户投诉“这批货过期了查不到来源”——问题不在功能缺失,而在初始配置漏掉一个勾选项。本章直击仓库模块最易被忽略的三个底层参数:库存类型、计价方法、库位策略,并给出批量修正脚本。

4.1 库存类型与计价方法:决定成本计算的生死组合

商品档案中的两个字段,控制着整个成本核算链:

字段可选值适用场景错误后果
库存类型可存储/消耗品/服务/虚拟产品可存储:需库存管理(如原材料);消耗品:不计库存(如办公用品);虚拟产品:电子交付(如软件授权)设为消耗品的商品,销售发货不扣库存,财务无法做成本结转
计价方法先进先出/平均成本/标准价格先进先出:制造业常用;平均成本:贸易公司常用;标准价格:需手动维护标准价计价方法为标准价格时,入库单不更新成本,所有出库按固定价计算,导致毛利失真

提示:修改计价方法后,必须运行库存 → 配置 → 重新计算库存价值,否则历史单据成本不变。

4.2 批次与序列号:从“能管”到“可溯”的必经之路

启用批次/序列号不是勾个框就完事,需四步闭环:

  1. 商品启用:编辑商品 → “库存”选项卡 → 勾选管理批号或管理序列号
  2. 入库单强制录入:创建入库单时,“批次/序列号”字段变为必填,需手动输入或扫描
  3. 发货单自动带出:销售发货时,系统按 FIFO 规则推荐批次,可手动切换
  4. 追溯查询:库存 → 报告 → 批次追溯,输入批次号,查看该批次的入库、出库、库存分布

验证:入库单过账后,进入库存 → 库存 → 批次,应存在该批次记录,且“当前数量”=入库数量。

4.3 多仓库调拨:跨仓移动的凭证生成逻辑

GoodERP 的调拨单(Internal Transfer)本质是两张单据:出库单 + 入库单。其凭证生成规则如下:

  • 调出仓库:生成库存商品 ↓ / 内部往来 ↑(科目:1405 库存商品/2241 其他应付款-内部往来)
  • 调入仓库:生成内部往来 ↓ / 库存商品 ↑(科目:2241 其他应付款-内部往来/1405 库存商品)

注意:内部往来科目需在会计 → 科目 → 科目表中预先创建,编码建议224101,类型为“负债类”。

4.4 避坑:仓库模块的四个隐形雷区

  1. 现象:启用“管理批号”后,入库单无法保存,报Batch number must be unique
    原因:同一商品存在重复批次号,或该批次号已在其他仓库使用
    解决:库存 → 批次中搜索该批次号,删除重复项;或改用商品名+日期+序号格式(如MATERIAL-20240520-001)

  2. 现象:调拨单过账后,会计 → 过账 → 凭证中只有出库凭证,无入库凭证
    原因:调入仓库未设置“库存账户”,或该账户未启用
    解决:配置 → 高级配置 → 仓库→ 编辑调入仓库 → “会计”选项卡 →库存账户选择有效科目

  3. 现象:销售发货时,系统提示No stock available for this product,但库存查询显示有货
    原因:商品设置了“库位策略”(如按库位管理),但未在具体库位分配库存
    解决:库存 → 库存 → 库存调整→ 创建调整单,将库存分配到目标库位

  4. 现象:启用“平均成本”后,新入库商品成本为 0,导致出库成本异常
    原因:首次入库时未填写“单价”,系统默认 0;或历史库存为 0,新入库成本未加权平均
    解决:入库单必须填写“单价”;若历史为 0,首单入库后立即运行重新计算库存价值


5. MRP 生产与委外:从 BOM 到工序质检的全流程落地

MRP(物料需求计划)是 Odoo 的高阶模块,GoodERP 在 Odoo 16 基础上强化了中国制造业场景:支持简单组装、工序委外、工序质检。但所有生产单(MO)的诞生,都始于一个被 90% 新手忽略的配置——物料清单(BOM)的“类型”字段。设成制造,MO 生成后自动扣减原材料;设成拆卸,MO 生成后反而增加原材料。本章不讲理论,只给你生产单从创建到完工的 12 个必检节点,以及当 MO 卡在确认状态时,如何 30 秒定位是 BOM、路由还是库存问题。

5.1 物料清单(BOM):生产单的 DNA,错一个字段全盘失效

BOM 不是“原料清单”,而是“生产指令集”。创建 BOM 时,以下字段必须精确:

  • 类型:制造(标准生产)、拆卸(返工)、替代(替代料)
  • 来源位置:必须为原材料所在仓库(如WH/Stock),否则 MO 无法获取原料
  • 目标位置:必须为成品仓库(如WH/Stock),否则完工入库失败
  • Routing:若启用工序,必须选择已配置的工艺路线(见 5.2 节)

验证:BOM 保存后,点击“测试”按钮,应显示“测试通过:所有组件均可获取”。

5.2 工艺路线(Routing):工序流转的交通管制图

工艺路线定义“一件产品要经过哪几道工序、在哪台设备、由谁操作”。创建步骤:

  1. 制造 → 配置 → 工艺路线→ 创建新路线,如手机组装-主线
  2. 添加工序:工序名称(如SMT贴片)、工作中心(如SMT-01)、预计时间(小时)
  3. 为每道工序设置工作中心:制造 → 配置 → 工作中心→ 创建SMT-01,设置产能(如100件/班)

提示:工作中心的“产能”直接影响 MRP 计划排程。若设为0,MRP 分析时该工序被跳过。

5.3 生产单(MO):从确认到完工的七状态解析

MO 状态流转是诊断问题的黄金路径:

状态触发动作常见卡点快速诊断
草稿创建MO无—
已确认点击“确认”BOM无效、原料不足、路由不存在查看MO页面右上角“错误”标签
已预留系统自动原料库位无库存、库位策略冲突库存 → 库存 → 预留查看详情
进行中手动点击“开始”工序未开始、质检未通过制造 → 工序查看工序单
质量检查工序完成后质检模板未配置、质检员未分配制造 → 质检查看待检单
已完成手动点击“完工”成品库位满、库位策略拒绝库存 → 库存 → 库位查看容量
已取消手动取消——

5.4 工序质检:让“合格”可验证、可追溯

GoodERP 的质检不是盖章,而是结构化数据采集:

  1. 创建质检模板:制造 → 配置 → 质检模板→ 新建手机外观质检
  2. 添加质检点:质检点名称(如屏幕划痕)、类型(布尔/数值/选择)、合格标准(如数值 < 0.1mm)
  3. 绑定到工序:编辑工艺路线 → 工序整机测试→质检模板选择刚建模板

执行质检:制造 → 工序→ 打开工序单 → “质检”按钮 → 填写结果 → “通过”或“拒绝”。拒绝时可选“返工”或“报废”。

5.5 避坑:MRP 模块的五个硬核故障

  1. 现象:MO 点击“确认”后卡在已确认,不生成预留
    原因:BOM 中某原料的“来源位置”仓库无库存,或该仓库未启用
    解决:库存 → 库存 → 库存查询→ 检查原料在目标仓库的可用数量

  2. 现象:工序单“开始”按钮灰色不可点
    原因:该工序的“工作中心”未设置“员工”或“产能”为 0
    解决:制造 → 配置 → 工作中心→ 编辑工作中心 →员工字段选择人员,产能> 0

  3. 现象:质检单提交后,工序单状态不变
    原因:质检模板中“通过后状态”未设为进行中或已完成
    解决:编辑质检模板 →通过后状态选择进行中

  4. 现象:MO 完工后,成品库存增加,但原材料库存未扣减
    原因:BOM 的“类型”设为替代而非制造
    解决:编辑 BOM →类型改为制造→ 重新创建 MO

  5. 现象:MRP 分析后,计划单显示“无需求”,但销售订单已存在
    原因:销售订单未确认(状态为报价),或未设置“承诺日期”
    解决:确认销售订单 → 设置“承诺日期” → 重新运行 MRP 分析


6. 性能优化与部署实战:让 Odoo 16 在 4G 内存服务器上稳定扛住 50 并发

很多实施者栽在最后一步:系统在测试环境丝滑,一上生产就卡成 PPT。根源不在代码,而在部署层。GoodERP 基于 Odoo 16,其性能瓶颈 70% 在 PostgreSQL,20% 在 Nginx 反向代理,10% 在 Odoo 自身配置。本章不讲虚的“调优原则”,只给你三招立竿见影的实操:第一,用pg_stat_statements插件揪出慢 SQL;第二,用 Nginx Upstream 实现 80 端口无缝访问;第三,用odoo.conf的limit_memory_hard参数防内存溢出。每招都附带命令、参数解释、效果对比——因为你在客户现场,没时间猜。

6.1 PostgreSQL 深度优化:从“能连上”到“查得快”的四步法

Odoo 的慢,90% 是数据库慢。四步精准打击:

  1. 启用慢查询日志:编辑/etc/postgresql/*/main/postgresql.conf

    log_min_duration_statement = 1000 # 记录耗时>1秒的SQL log_directory = 'pg_log' logging_collector = on

    重启:sudo systemctl restart postgresql

  2. 安装 pg_stat_statements 插件(实时监控):

    -- 连接postgres数据库 CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

    查询最慢的 10 条 SQL:

    SELECT query, calls, total_time, rows, ROUND(total_time/calls, 2) AS avg_time FROM pg_stat_statements WHERE calls > 10 ORDER BY total_time DESC LIMIT 10;
  3. 关键索引加固(针对 Odoo 高频表):

    -- 为account_move_line加索引(解决凭证查询慢) CREATE INDEX idx_account_move_line_account_date ON account_move_line (account_id, date); -- 为stock_move加索引(解决库存查询慢) CREATE INDEX idx_stock_move_product_state ON stock_move (product_id, state);
  4. 内存参数调优(/etc/postgresql/*/main/postgresql.conf):

    shared_buffers = 1GB # 物理内存的25% effective_cache_size = 3GB # 物理内存的75% work_mem = 16MB # 避免临时文件写磁盘 maintenance_work_mem = 512MB # VACUUM 加速

    提示:4G 内存服务器,shared_buffers最大设 1GB,超设反而降低性能。

6.2 Nginx 反向代理:让http://erp.yourcompany.com直通 Odoo

绕过:8069端口,用域名访问是专业实施的底线。Nginx 配置核心三行:

upstream odoo { server 127.0.0.1:8069; } server { listen 80; server_name erp.yourcompany.com; location / { proxy_pass http://odoo; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

保存后:sudo nginx -t && sudo systemctl reload nginx。
验证:浏览器访问http://erp.yourcompany.com,应看到 Odoo 登录页。

6.3 Odoo 服务端调优:防崩、提速、省资源

编辑/etc/odoo/conf/odoo.conf,关键参数:

# 内存保护(4G服务器必设) limit_memory_hard = 1073741824 # 1GB,超限进程被杀 limit_memory_soft = 805306368 # 768MB,超限降速 # 并发与性能 workers = 3 # CPU核数+1,4G内存最多3个 max_cron_threads = 1 # 防止定时任务抢资源 limit_request = 8192 # 单请求最大内存 limit_time_real = 120 # 单请求最长120秒 # 静态文件缓存(提升前端速度) proxy_mode = True

提示:修改后必须重启 Odoo:sudo systemctl restart odoo。检查日志sudo journalctl -u odoo -f,确认无Memory limit exceeded报错。

6.4 避坑:部署上线的五个血泪教训

  1. 现象:Nginx 配置后,登录页样式丢失,全是文字
    原因:proxy_mode = True未在odoo.conf中启用,Odoo 无法识别反向代理
    解决:odoo.conf中添加proxy_mode = True→ 重启 Odoo

  2. 现象:PostgreSQL 重启后,Odoo 报Connection refused
    原因:PostgreSQL 未监听 localhost,postgresql.conf中listen_addresses为空
    解决:设为listen_addresses = '127.0.0.1'→ 重启 PostgreSQL

  3. 现象:启用 workers 后,Odoo 启动失败,日志报Address already in use
    原因:多个 worker 争抢同一端口,需用--http-port指定主端口
    解决:odoo.conf中添加http_port = 8069,确保唯一

  4. 现象:MRP 分析运行超时,页面白屏
    原因:limit_time_real过小(如设为 30),复杂 BOM 分析被强制中断
    解决:调大至120,或分批运行 MRP(按产品分类)

  5. 现象:用户上传附件时,提示Request Entity Too Large
    原因:Nginx 默认限制 1MB,而 Odoo 附件常超

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进