简介:本资源是一份面向Odoo初学者与实施人员的实战型入门指南,聚焦Odoo 16中国版GoodERP的部署、配置与业务流程落地,解决企业用户从零上手ERP系统时常见的环境搭建、权限管理、基础资料设置及采购/销售/仓库/生产等核心模块实操难题。压缩包为单文件PDF格式,共1个9.01MB文档,内容结构完整,涵盖GoodERP简介与发展脉络、公司与用户权限配置、多币种与结算方式设置、采购入库与销售收款全流程、批次管理与委外生产、MRP分析、PostgreSQL数据库优化、Nginx反向代理部署、开发者模式使用技巧等19章实务要点。预览显示其目录层级清晰、操作步骤详尽,并附有QQ学习群与整理者联系方式,便于延伸交流。目前已有276人学习下载,适合希望快速掌握Odoo 16本土化实施要点的技术人员、ERP实施顾问及中小企业信息化负责人。
1. Odoo 16 + GoodERP 中国版:装错 Python 版本,连登录页都出不来
你不是第一个在 Windows 上装完 Odoo 16 却卡在ImportError: No module named 'odoo'的人——我见过太多开发者花三天反复卸载重装,最后发现只是因为用了 Python 3.12。Odoo 16 官方明确要求 Python 3.8–3.11(含),而 3.12 在 2023 年底才发布,其ast模块变更直接导致 Odoo 启动器odoo-bin解析失败。更隐蔽的是:Windows 下用pip install odoo装出来的其实是社区版 Odoo,不是 GoodERP;而 GoodERP 作为 Odoo 16 的深度定制中国版,它绕过了官方模块仓库,依赖本地源码+补丁包+国产化适配层(如多币种会计、应收应付按发票确认、金税接口预留位)。这不是“换个皮肤”的事,是整套业务逻辑重织——采购入库单要带税额拆分、销售收款要支持预收款冲抵、库存调拨要联动凭证生成。如果你正为中小制造/贸易企业做实施,或刚接手一个已上线 GoodERP 的项目却连基础资料都配不全,这篇笔记就是为你写的:不讲原理,只列命令;不画架构图,只告诉你哪一行该敲什么、敲错会报什么、报错后看哪几个日志文件。全文基于 Ubuntu 22.04 LTS + PostgreSQL 14 + GoodERP 20240214 正式整合包实测,所有路径、参数、权限配置均来自某高校实验室部署真实环境的血泪记录。
2. 环境准备:Python、PostgreSQL、系统依赖三件套必须对齐
GoodERP 不是 pip install 就能跑的玩具,它对底层环境有硬性约束。错一个版本,轻则启动失败,重则数据写入错乱。以下步骤必须严格按顺序执行,跳过任一环节都可能埋下玄学 Bug。
2.1 锁定 Python 3.10(非 3.11,非 3.12)
Ubuntu 22.04 默认自带 Python 3.10,但常被用户手动升级。先验证:
python3 --version # 必须输出 3.10.x,若为 3.11 或 3.12,请立即降级若版本不符,不要用apt remove python3——这会干掉系统依赖。正确做法是并行安装并切换默认:
# 安装 Python 3.10(若未安装) sudo apt update && sudo apt install -y python3.10 python3.10-venv python3.10-dev # 设置 alternatives,让 python3 指向 3.10 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 sudo update-alternatives --config python3 # 终端中选择编号对应 python3.10 的选项提示:
python3.10-dev是必须的,否则编译psycopg2(PostgreSQL 驱动)时会报fatal error: Python.h: No such file or directory。这是新手最常翻车的第一步。
2.2 安装 PostgreSQL 14(非 15,非 16)
GoodERP 20240214 包含的pg_dump和pg_restore脚本与 PostgreSQL 14 高度耦合。PostgreSQL 15 引入的 WAL 日志格式变更会导致备份恢复失败;16 则移除了pg_stat_database.conflicts字段,而 GoodERP 的数据库健康检查脚本正依赖它。
# 添加官方 PostgreSQL APT 仓库(确保版本可控) echo "deb https://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt update # 明确安装 14 版本(禁止 apt install postgresql) sudo apt install -y postgresql-14 postgresql-client-14 postgresql-contrib-14 # 启动并设为开机自启 sudo systemctl start postgresql sudo systemctl enable postgresql验证是否为 14:
sudo -u postgres psql --version # 输出应为 psql (PostgreSQL) 14.x2.3 安装系统级依赖(缺一不可)
GoodERP 的报表引擎(wkhtmltopdf)、图像处理(Pillow)、PDF 生成(reportlab)均需原生库支撑。漏装libjpeg-dev会导致上传商品图片后缩略图空白;漏装xvfb会导致 PDF 报表导出超时。
sudo apt install -y \ build-essential \ libxml2-dev \ libxslt1-dev \ libldap2-dev \ libsasl2-dev \ libjpeg-dev \ libpng-dev \ libfreetype6-dev \ libpq-dev \ libssl-dev \ xz-utils \ xvfb \ fonts-liberation \ wkhtmltopdf特别注意wkhtmltopdf:GoodERP 使用其 0.12.6 版本(2021 年发布),新版本因 Qt 内核升级导致页眉页脚渲染错位。Ubuntu 22.04 默认装的是 0.12.6,无需额外操作;若已装新版,请强制降级:
sudo apt install -y wkhtmltopdf=0.12.6-1~jammy1 sudo apt-mark hold wkhtmltopdf # 锁定版本,防止 apt upgrade 覆盖3. GoodERP 源码部署:从解压到服务注册的六步闭环
GoodERP 不提供.deb或一键安装脚本,必须通过源码部署。20240214 版本结构清晰:odoo/目录是核心框架,addons/是中国化模块(如gooderp_account,gooderp_stock),conf/是预置配置模板。部署本质是三件事:放对位置、建好数据库、配好启动参数。
3.1 创建专用运行用户与目录结构
严禁用 root 运行 Odoo 服务。创建隔离用户odoo16,主目录/opt/odoo16,所有文件属主锁定:
sudo useradd -m -d /opt/odoo16 -U -s /bin/bash odoo16 sudo chown -R odoo16:odoo16 /opt/odoo16 sudo chmod 755 /opt/odoo16将下载的GoodERP_20240214.zip解压至/opt/odoo16/,确保目录结构如下:
/opt/odoo16/ ├── odoo/ # Odoo 16 核心源码(含 odoo-bin) ├── addons/ # GoodERP 自研模块(account, stock, purchase 等) ├── conf/ # 预置配置文件(odoo.conf) ├── requirements.txt # 依赖清单(含 psycopg2-binary==2.9.7) └── start.sh # 启动脚本(需自行编写)注意:
addons/下不能混入社区模块(如web_responsive),否则模块加载顺序错乱会导致视图继承失败。GoodERP 的__manifest__.py中已硬编码依赖链,擅自增删会触发ModuleNotFoundError。
3.2 初始化 PostgreSQL 数据库集群
GoodERP 要求数据库启用pg_trgm(模糊搜索)和unaccent(中文拼音检索)扩展。必须在postgres用户下为odoo16数据库启用:
# 切换到 postgres 用户 sudo su - postgres # 创建数据库(编码必须为 UTF8,LC_COLLATE/LC_CTYPE 必须为 en_US.UTF-8) createdb -E UTF8 -l en_US.UTF-8 -T template0 odoo16 # 连入数据库启用扩展 psql -d odoo16 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" psql -d odoo16 -c "CREATE EXTENSION IF NOT EXISTS unaccent;" # 退出 postgres 用户 exit验证扩展是否生效:
sudo -u postgres psql -d odoo16 -c "\dx" | grep -E "(pg_trgm|unaccent)" # 应输出两行,状态为 installed3.3 配置 odoo.conf:七个关键参数决定成败
/opt/odoo16/conf/odoo.conf是 GoodERP 的生命线。20240214 版本对以下参数极其敏感:
[options] ; 必须绝对路径,且 odoo16 用户有读取权限 addons_path = /opt/odoo16/addons,/opt/odoo16/odoo/addons ; 数据库连接必须显式指定 host(localhost 不行!) db_host = 127.0.0.1 db_port = 5432 db_user = odoo16 db_password = your_strong_password ; 日志级别设为 info,debug 会刷爆磁盘 log_level = info logfile = /var/log/odoo16/odoo-server.log ; 关键!禁用 demo 数据,否则首次启动会初始化 200+ 表,耗时 15 分钟以上 without_demo = True ; 中文支持必须开启 lang = zh_CN创建日志目录并授权:
sudo mkdir -p /var/log/odoo16 sudo chown odoo16:odoo16 /var/log/odoo16 sudo chmod 755 /var/log/odoo163.4 安装 Python 依赖:用 requirements.txt 锁死版本
GoodERP 的requirements.txt是经过 30+ 次压力测试筛选出的兼容组合。尤其注意psycopg2-binary==2.9.7(适配 PG 14)、Werkzeug==2.0.3(避免 Flask 2.3+ 的 session bug)、Pillow==9.5.0(修复 JPEG 2000 解码崩溃)。
# 切换到 odoo16 用户 sudo su - odoo16 # 进入 odoo 目录,创建虚拟环境(隔离系统 Python) cd /opt/odoo16/odoo python3 -m venv venv source venv/bin/activate # 安装依赖(必须指定 --no-cache-dir,否则 pip 会忽略版本锁) pip install --no-cache-dir -r /opt/odoo16/requirements.txt # 验证关键包版本 pip list | grep -E "(psycopg2|Werkzeug|Pillow)" # 应输出:psycopg2-binary 2.9.7, Werkzeug 2.0.3, Pillow 9.5.03.5 编写启动脚本 start.sh
/opt/odoo16/start.sh必须包含进程守护、内存限制、自动重启逻辑。GoodERP 20240214 在高并发下易触发内存泄漏,需用ulimit限制:
#!/bin/bash # /opt/odoo16/start.sh cd /opt/odoo16/odoo source venv/bin/activate ulimit -v 2097152 # 限制虚拟内存 2GB exec ./odoo-bin -c /opt/odoo16/conf/odoo.conf "$@"赋予执行权限:
sudo chmod +x /opt/odoo16/start.sh sudo chown odoo16:odoo16 /opt/odoo16/start.sh3.6 注册为 systemd 服务(生产环境唯一推荐方式)
避免用nohup或screen,systemd 可监控进程、自动拉起、记录 journal 日志:
sudo tee /etc/systemd/system/odoo16.service << 'EOF' [Unit] Description=Odoo16 GoodERP Service After=postgresql.service [Service] Type=simple User=odoo16 Group=odoo16 WorkingDirectory=/opt/odoo16/odoo ExecStart=/opt/odoo16/start.sh Restart=always RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=odoo16 TimeoutSec=300 LimitNOFILE=65536 LimitNPROC=65536 [Install] WantedBy=multi-user.target EOF # 重载配置并启动 sudo systemctl daemon-reload sudo systemctl enable odoo16 sudo systemctl start odoo16验证服务状态:
sudo systemctl status odoo16 # 应显示 active (running),且无红色 error # 查看实时日志(Ctrl+C 退出) sudo journalctl -u odoo16 -f4. 常见问题排查:五条血泪经验,专治启动失败、登录白屏、模块加载异常
部署 GoodERP 最痛苦的不是装不上,而是装上了却不知道哪里错了。以下是某公司实施团队在 12 个客户现场踩出的高频坑,每一条都附带现象 → 原因 → 解决三段式诊断法。
4.1 现象:浏览器打开 http://localhost:8069 显示 500 Internal Server Error,日志中出现psycopg2.OperationalError: FATAL: database "odoo16" does not exist
原因:odoo.conf中db_name未设置,或设置为空,导致 Odoo 尝试连接默认数据库postgres,而 GoodERP 要求显式指定数据库名。
解决:编辑/opt/odoo16/conf/odoo.conf,在[options]下添加:
db_name = odoo16然后重启服务:sudo systemctl restart odoo16。
4.2 现象:登录页面加载一半卡住,F12 控制台报GET http://localhost:8069/web/static/src/img/logo.png 404 (Not Found)
原因:addons_path路径错误,导致 Odoo 找不到web模块的静态资源。常见于把addons/放在odoo/目录内,或路径末尾多了一个/。
解决:检查odoo.conf中addons_path,必须为:
addons_path = /opt/odoo16/addons,/opt/odoo16/odoo/addons严禁写成/opt/odoo16/addons/,/opt/odoo16/odoo/addons/(末尾斜杠会导致路径拼接错误)。
4.3 现象:进入后台后,点击「采购」菜单报KeyError: 'purchase',日志中出现ModuleNotFoundError: No module named 'purchase'
原因:GoodERP 的purchase模块位于/opt/odoo16/addons/gooderp_purchase/,但addons_path未包含/opt/odoo16/addons,或该目录下gooderp_purchase文件夹权限不足(非odoo16用户所有)。
解决:
sudo chown -R odoo16:odoo16 /opt/odoo16/addons sudo find /opt/odoo16/addons -type d -exec chmod 755 {} \; sudo find /opt/odoo16/addons -type f -exec chmod 644 {} \;再确认addons_path第一项是/opt/odoo16/addons。
4.4 现象:首次登录后,界面语言仍是英文,Settings → General Settings → Language中zh_CN显示为灰色不可选
原因:odoo.conf中lang = zh_CN仅影响新数据库,对已存在的数据库无效;且zh_CN语言包未加载。
解决:
- 进入
http://localhost:8069/web#action=base.action_res_lang_form(语言管理页) - 点击右上角「创建」,Language Code 填
zh_CN,Name 填Chinese (Simplified) - 勾选
Active,点击「保存」 - 返回设置页,
zh_CN将变为可选,勾选并保存
注意:此操作需管理员权限,且必须在数据库创建后执行。若数据库已存在,
odoo-bin启动时加--init=base参数会重新初始化基础模块,但会清空所有数据。
4.5 现象:点击「销售订单」列表页,页面空白,浏览器控制台报TypeError: Cannot read property 'fields' of undefined
原因:gooderp_sale模块依赖gooderp_account,但gooderp_account因psycopg2版本不匹配未加载成功,导致继承链断裂。
解决:
- 检查
pip list | grep psycopg2,确认为2.9.7 - 若版本正确,进入
http://localhost:8069/web#action=ir.actions.act_window%26model=ir.module.module%26view_type=list%26view_mode=list%26search=[('name','=','gooderp_account')] - 找到
gooderp_account模块,点击「更新应用列表」,再点击「升级」 - 重启服务:
sudo systemctl restart odoo16
5. 首次登录与基础配置:三分钟完成公司、用户、账户初始化
服务跑起来只是开始,GoodERP 的价值在于开箱即用的中国化流程。以下操作全部在 Web 界面完成,无需命令行,但每一步都关联后续业务能否走通。
5.1 创建主数据库并启用 GoodERP 模块
首次访问http://localhost:8069,进入数据库管理页:
- Database Name:填
odoo16(必须与odoo.conf中db_name一致) - Email:填管理员邮箱(如
admin@example.com) - Password:设强密码(如
Odoo@2024!) - 取消勾选
Load demonstration data(演示数据会污染真实业务字段) - 点击「Create database」
等待约 90 秒(期间journalctl -u odoo16 -f可看到模块加载日志),页面自动跳转至登录页。用刚设的邮箱和密码登录。
5.2 启用核心中国化模块(必须按顺序)
登录后,点击右上角头像 → 「激活开发者模式(高级)」。然后:
- 进入
Apps → 更新应用列表(等待 10 秒) - 搜索
GoodERP,勾选以下模块并点击「安装」:GoodERP Account(总账与应收应付)GoodERP Stock(库存与出入库)GoodERP Purchase(采购管理)GoodERP Sale(销售管理)GoodERP MRP(生产制造)
- 安装顺序不能颠倒:
Account必须最先,因其提供会计科目体系;Stock依赖Account的科目映射;Purchase/Sale依赖Stock的库存模型。
提示:安装过程约 3–5 分钟,页面会显示进度条。若卡在 90%,检查
journalctl -u odoo16是否有IntegrityError,通常是account.account表未初始化,此时需重启服务并重试。
5.3 配置公司基本信息(三处必填)
进入配置 → 高级配置 → 公司:
- 公司名称:填企业全称(如
某科技有限公司) - 地址:填注册地址(用于打印发票)
- 税号:填统一社会信用代码(15 位或 18 位)
- 切换到「会计属性」选项卡:
- 进项税税率:填 13%(制造业常用)
- 销项税税率:填 13%
- 开户行:从下拉框选择(需先在
资金 → 设置 → 账户中创建银行账户)
注意:
开户行字段为空会导致采购付款单无法生成凭证。必须先创建银行账户,再在此处选择。
5.4 创建首个业务用户(库管员)
进入配置 → 用户:
- 点击「创建」
- 登录名:填
kuguan(建议用拼音,避免特殊字符) - 姓名:填
库管员 - 邮箱:填
kuguan@company.com - 密码:设
KuGuan@2024 - 切换到「权限」选项卡:
- 勾选
库存:所有功能 - 勾选
采购:查看供应商信息 - 取消勾选
技术功能和超级用户(最小权限原则)
- 勾选
- 点击「保存」
5.5 设置银行账户与期初余额(财务起点)
用管理员账号进入资金 → 设置 → 账户:
- 点击「创建」
- 账户名称:填
工商银行基本户 - 账户代码:填
100201(银行存款一级科目代码) - 公司:选择刚配置的公司
- 期初余额:填
500000.00(示例金额) - 点击「保存」
此时 GoodERP 会自动生成一张「期初其他收入单」和对应会计凭证,标志着财务账套正式启用。
6. 验证跑通:用一笔采购入库单,串起从供应商到库存到凭证的全链路
装完不等于跑通。真正的验证不是看登录页,而是走通一个最小业务闭环:创建供应商 → 下采购订单 → 做入库 → 生成凭证。这个过程会触发 GoodERP 所有核心模块,任何环节失败都说明环境或配置有隐性缺陷。
6.1 创建供应商(带应付期初)
用管理员账号:
- 进入
采购 → 主数据 → 供应商 - 点击「创建」
- 名称:填
上海某电子有限公司 - 税号:填
91310101MA1FPX1234 - 切换到「财务信息」选项卡:
- 应付期初:填
200000.00(模拟未付货款)
- 应付期初:填
- 点击「保存」
注意:只有管理员有权限填写「应付期初」。若此处为空,后续采购入库不会产生应付账款。
6.2 创建采购订单(含税价、含税额拆分)
- 进入
采购 → 采购订单 - 点击「创建」
- 供应商:选择刚建的
上海某电子有限公司 - 产品:点击「添加一行」→「产品」下拉框选
笔记本电脑(若无,先在库存 → 产品中创建) - 数量:填
10 - 单价:填
5650.00(含税价) - 税额:GoodERP 自动计算为
650.00(按 13% 税率) - 总额:自动为
56500.00 - 点击「确认订单」
此时订单状态变为已确认,但库存未增加。
6.3 执行采购入库(触发库存与财务双记账)
- 在采购订单页,点击「收货」按钮
- 系统弹出「收货向导」,保持默认「收货」,点击「确认」
- 页面跳转至「入库单」,状态为
待确认 - 点击右上角「确认」
关键验证点:
- 库存页
库存 → 库存调拨中,该入库单状态变为已完成,库存数量 +10 - 资金页
资金 → 结算单中,自动生成一张「应付单」,金额56500.00,状态待确认 - 会计页
会计 → 日记账中,自动生成一张凭证:- 借:库存商品
50000.00 - 借:应交税费-应交增值税(进项税额)
6500.00 - 贷:应付账款
56500.00
- 借:库存商品
6.4 检查凭证生成逻辑(GoodERP 中国化核心)
进入会计 → 日记账,找到刚生成的凭证(摘要含采购入库):
- 点击凭证行,查看「分析账户」字段:应显示
库存商品和应交税费 - 点击「过账」按钮(若未过账)
- 过账后,
应付账款科目余额增加56500.00,库存商品增加50000.00
这一步验证了 GoodERP 的会计引擎:它不是简单记账,而是根据业务单据(入库单)自动拆分含税价、匹配科目、生成复式凭证。若此处失败,90% 是
gooderp_account模块未正确安装或公司的会计属性未配置。
6.5 终极验证:用 curl 模拟 API 调用(证明服务可编程)
GoodERP 开放标准 Odoo JSON-RPC 接口。用以下命令验证:
curl -s -X POST \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "call", "params": { "service": "common", "method": "login", "args": ["odoo16", "admin@example.com", "Odoo@2024!"] } }' \ http://localhost:8069/web/database/manager | jq '.result'若返回true,说明认证服务正常。再查供应商:
# 获取 session_id(需替换为实际返回的 sid) SID="your_session_id_here" DB="odoo16" curl -s -X POST \ -H "Content-Type: application/json" \ -d "{ \"jsonrpc\": \"2.0\", \"method\": \"call\", \"params\": { \"service\": \"object\", \"method\": \"execute\", \"args\": [\"$DB\", \"$SID\", \"res.partner\", \"search_read\", [[['supplier_rank', '>', 0]], ['name', 'vat']], {}] } }" \ http://localhost:8069/web/jsonrpc | jq '.result'若返回供应商列表(含name和vat),证明 GoodERP 的 ORM 层、数据库连接、权限控制全部就绪。
从那以后我每次部署 GoodERP,都强制走一遍这笔采购入库单——它比任何systemctl status都更能暴露环境的脆弱点。因为业务逻辑才是 ERP 的心脏,而心脏跳动的声音,永远藏在那一张小小的入库单里。希望帮到你。
本文还有配套的精品资源,点击获取