对于中小企业来说,数字化转型的最大障碍往往不是意愿,而是成本。传统 ERP 系统(如 SAP、Oracle)动辄数十万甚至上百万的授权费用,让大多数中小企业望而却步。而免费的替代品往往功能残缺、界面老旧、缺乏维护。
ERPNext 的出现改变了这个局面。作为一款 100% 免费开源 的企业资源规划(ERP)系统,ERPNext 提供了涵盖财务、CRM、销售、采购、库存、制造、人力资源等核心业务模块的完整解决方案。它基于 Frappe 框架构建,采用 Python + JavaScript 技术栈,拥有现代化的 Web 界面和强大的二次开发能力。
本文将带你从零开始,完成 ERPNext 的安装部署、基础配置、核心模块使用,并深入讲解二次开发实战,帮助你快速搭建一套适合自身业务的企业级 ERP 系统。
ERPNext 是什么?
ERPNext 是由印度公司 Frappe Technologies 开发和维护的开源 ERP 系统,采用 GNU General Public License (GPL) v3 协议发布。这意味着你可以:
- ✅ 免费使用 — 无需支付任何授权费用
- ✅ 自由修改 — 可以根据业务需求定制功能
- ✅ 商业可用 — 可以用于商业环境,无用户数限制
- ✅ 社区驱动 — 全球活跃社区持续贡献代码和插件
技术架构
┌─────────────────────────────────────┐
│ ERPNext (应用层) │
│ 财务 | CRM | 销售 | 采购 | 库存 | HR │
├─────────────────────────────────────┤
│ Frappe Framework (框架层) │
│ DocType | REST API | 权限 | 工作流 │
├─────────────────────────────────────┤
│ Python (后端) | MariaDB (数据库) │
│ JavaScript/Vue (前端) | Redis (缓存) │
└─────────────────────────────────────┘
ERPNext 的核心是 Frappe Framework,这是一个用 Python 编写的全栈 Web 应用框架。Frappe 最大的特色是 低代码/无代码(Low-Code/No-Code) 能力——通过定义 DocType(文档类型),你可以快速创建数据模型、表单、列表视图和 API,而无需编写大量代码。
为什么选择 ERPNext?
| 对比维度 | ERPNext | Odoo (社区版) | SAP Business One |
|---|---|---|---|
| 授权费用 | 免费(GPL v3) | 社区版免费,核心模块付费 | 数万-数十万/年 |
| 开源程度 | 100% 开源 | 开放核心(部分模块闭源) | 闭源 |
| 用户限制 | 无限制 | 社区版无限制 | 按用户数计费 |
| 技术栈 | Python + MariaDB | Python + PostgreSQL | 专有 |
| 二次开发 | Frappe 框架,低代码 | 需要 Python 开发能力 | 需要认证开发者 |
| 中文支持 | 原生支持 | 社区翻译 | 官方支持 |
| 部署方式 | 自托管 / Frappe Cloud | 自托管 / Odoo.sh | 本地 / 云端 |
安装部署
ERPNext 支持多种部署方式,本节将详细介绍最常用的三种:Docker 部署(推荐)、手动安装和 Frappe Cloud 托管。
方案一:Docker 部署(推荐)
Docker 部署是最简单、最干净的安装方式,适合快速测试和生产环境。
系统要求
- CPU: 2 核以上
- 内存: 4GB 以上(推荐 8GB)
- 存储: 20GB 以上
- 操作系统: Ubuntu 20.04/22.04、CentOS 8+、Debian 11+
使用 docker-compose 一键部署
# 1. 安装 Docker 和 Docker Compose
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker
# 2. 安装 Docker Compose(如果未自带)
sudo apt install docker-compose-plugin
# 3. 克隆官方 docker-compose 配置
git clone https://github.com/frappe/frappe_docker.git
cd frappe_docker
# 4. 创建环境变量文件
cp example.env .env
# 编辑 .env 文件,设置以下关键参数:
# SITE_NAME=erp.yourdomain.com
# DB_ROOT_USER=root
# DB_ROOT_PASSWORD=your_secure_password
# ADMIN_PASSWORD=your_admin_password
# 5. 启动服务
docker compose -f compose.yaml \
-f overrides/compose.mariadb.yaml \
-f overrides/compose.redis.yaml \
-f overrides/compose.noproxy.yaml \
config > ~/docker-compose.yml
docker compose -f ~/docker-compose.yml up -d
# 6. 创建新站点
docker compose -f ~/docker-compose.yml exec backend \
bench new-site erp.yourdomain.com \
--mariadb-root-password your_secure_password \
--admin-password your_admin_password \
--install-app erpnext
# 7. 访问 ERPNext
# 浏览器打开 http://your-server-ip:8080
# 默认管理员账号:Administrator
# 密码:你在 .env 中设置的 ADMIN_PASSWORD
配置 Nginx 反向代理(生产环境)
# 使用 Let's Encrypt 获取免费 SSL 证书
docker compose -f ~/docker-compose.yml exec backend \
bench setup nginx
# 或使用 Traefik 自动管理 HTTPS
docker compose -f compose.yaml \
-f overrides/compose.traefik.yaml \
config > ~/docker-compose-traefik.yml
docker compose -f ~/docker-compose-traefik.yml up -d
方案二:手动安装(适合深度定制)
手动安装适合需要对系统进行深度定制和调试的开发者。
# 1. 安装依赖
sudo apt update
sudo apt install python3-dev python3-setuptools python3-pip \
python3-distutils python3.10-venv software-properties-common \
mariadb-server mariadb-client redis-server nodejs npm \
yarn cron xvfb libfontconfig wkhtmltopdf
# 2. 配置 MariaDB
sudo mysql -u root -e "
CREATE DATABASE erpnext;
CREATE USER 'erpnext'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON erpnext.* TO 'erpnext'@'localhost';
FLUSH PRIVILEGES;
"
# 3. 安装 bench(Frappe 的 CLI 工具)
pip3 install frappe-bench
# 4. 初始化 bench
bench init --frappe-branch version-15 frappe-bench
cd frappe-bench
# 5. 创建新站点
bench new-site erp.yourdomain.com \
--db-name erpnext \
--db-password your_password \
--admin-password your_admin_password
# 6. 安装 ERPNext 应用
bench get-app --branch version-15 erpnext
bench --site erp.yourdomain.com install-app erpnext
# 7. 启动开发服务器
bench start
# 访问 http://localhost:8000
方案三:Frappe Cloud 托管
如果你不想自己运维服务器,可以使用官方的 Frappe Cloud 托管服务:
- 价格:$50/月(小型企业方案)
- 包含:无限用户、自动备份、SSL 证书、技术支持
- 适合:没有 IT 运维团队的中小企业
访问 frappecloud.com 注册即可,无需任何技术操作。
基础配置
安装完成后,进入系统的第一步是完成基础配置。
1. 公司设置
进入 设置 → 公司,添加你的公司信息:
- 公司名称
- 注册地址
- 税号
- 默认货币
- 财务年度起始月份
# 多公司架构
如果你的集团有多个子公司,可以添加多家公司,
ERPNext 支持公司间的交易和合并报表。
2. 用户与权限
ERPNext 采用基于角色的权限控制(RBAC):
管理员(System Manager)→ 所有权限
会计(Accounts Manager)→ 财务模块
销售(Sales Manager)→ 销售模块
仓库(Stock Manager)→ 库存模块
HR(HR Manager)→ 人力资源模块
创建用户
# 通过 Frappe API 创建用户(Python 脚本)
import frappe
user = frappe.get_doc({
"doctype": "User",
"email": "zhangsan@company.com",
"first_name": "张三",
"roles": [{"role": "Sales Manager"}]
})
user.insert()
3. 基础数据导入
ERPNext 支持通过 Excel/CSV 批量导入基础数据:
| 数据类型 | 导入模板 | 说明 |
|---|---|---|
| 客户 | Customer |
客户信息、地址、联系方式 |
| 供应商 | Supplier |
供应商信息、账期、结算方式 |
| 产品 | Item |
SKU、规格、价格、库存 |
| BOM | BOM |
物料清单(制造模块) |
| 员工 | Employee |
员工信息、部门、岗位 |
进入各模块的 列表视图 → 导入(Import),下载模板、填写数据、上传即可。
4. 打印模板定制
ERPNext 允许你定制各种业务单据的打印格式:
- 发票
- 采购订单
- 销售订单
- 发货单
- 报价单
进入 设置 → 打印设置,可以选择内置模板或使用 HTML/Jinja 自定义。
核心模块详解
ERPNext 包含 20+ 个业务模块,以下是最常用的核心模块。
💰 财务模块(Accounting)
财务是 ERP 系统的核心,ERPNext 的财务模块功能完善:
科目表(Chart of Accounts)
ERPNext 内置了多国标准科目表,支持自定义:
资产(Assets)
├── 流动资产
│ ├── 现金及银行存款
│ ├── 应收账款
│ └── 存货
├── 固定资产
│ ├── 房屋建筑
│ └── 设备
负债(Liabilities)
├── 流动负债
│ ├── 应付账款
│ └── 短期借款
权益(Equity)
├── 实收资本
└── 未分配利润
收入(Income)
├── 主营业务收入
└── 其他业务收入
费用(Expenses)
├── 主营业务成本
├── 销售费用
├── 管理费用
└── 财务费用
自动会计分录
ERPNext 的销售、采购、库存操作会自动生成会计分录:
# 销售发票的自动分录
借:应收账款 ¥10,000
贷:主营业务收入 ¥8,849.56
应交税费-销项税 ¥1,150.44
# 采购入库的自动分录
借:库存商品 ¥5,000
贷:应付账款 ¥5,000
财务报表
- 资产负债表 — 实时反映公司财务状况
- 利润表(损益表) — 按期间统计收入与支出
- 现金流量表 — 跟踪现金流入流出
- 应收账款/应付账款账龄分析 — 监控回款风险
📦 库存模块(Stock)
仓库管理
支持多仓库、多库位管理:
总部仓库
├── A 区 - 原材料
│ ├── A-01 电子元器件
│ └── A-02 结构件
├── B 区 - 成品
│ ├── B-01 待发货
│ └── B-02 已检验
└── C 区 - 退货
库存操作
| 操作 | 说明 |
|---|---|
| 入库 | 采购入库、生产入库、退货入库 |
| 出库 | 销售出库、生产领料、报废出库 |
| 调拨 | 仓库间转移 |
| 盘点 | 定期核对账面与实物 |
| 序列号/批次追踪 | 精确追踪每个产品 |
库存预警
设置最低库存阈值,低于阈值自动提醒补货:
# 通过 Frappe 脚本设置库存预警
frappe.db.set_value("Item", "ITEM-001", "re_order_level", 100)
frappe.db.set_value("Item", "ITEM-001", "warehouse", "总部仓库")
🤝 CRM 与销售模块
销售流程
线索(Lead)
↓
商机(Opportunity)
↓
报价单(Quotation)
↓
销售订单(Sales Order)
↓
发货单(Delivery Note)
↓
销售发票(Sales Invoice)
↓
收款(Payment Entry)
CRM 功能亮点
- 线索管理 — 跟踪来源、分配销售、记录跟进
- 商机漏斗 — 可视化销售管道
- 报价模板 — 快速生成专业报价单
- 客户门户 — 客户自助查看订单、发票
- 邮件集成 — 收发邮件自动关联客户
👥 人力资源模块(HRMS)
员工管理
- 员工档案(个人信息、合同、紧急联系人)
- 组织架构(部门、岗位、汇报关系)
- 入职/离职流程
考勤与请假
# 考勤规则配置
attendance_policy = {
"working_hours": "09:00-18:00",
"late_entry_threshold": 15, # 分钟
"early_exit_threshold": 15,
"holiday_list": "2026-法定节假日"
}
# 请假类型
leave_types = [
{"name": "年假", "max_leaves": 10},
{"name": "病假", "max_leaves": 5},
{"name": "事假", "max_leaves": 0}, # 需审批
{"name": "婚假", "max_leaves": 3},
]
薪资管理
- 薪资结构(基本工资、绩效、津贴、扣款)
- 自动计算个税
- 工资条生成与发放
- 社保公积金计算
🏭 制造模块(Manufacturing)
BOM(物料清单)
产品:智能音箱 V2.0
├── 主板组件 (x1)
│ ├── 主控芯片 (x1)
│ ├── 内存模块 (x2)
│ └── WiFi 模块 (x1)
├── 音频组件 (x1)
│ ├── 扬声器 (x2)
│ └── 功放板 (x1)
├── 外壳 (x1)
└── 电源适配器 (x1)
生产工单流程
生产计划(Production Plan)
↓
工单(Work Order)
↓
领料(Material Transfer)
↓
生产(Manufacture)
↓
质检(Quality Inspection)
↓
入库(Stock Entry)
二次开发实战
ERPNext 最强大的地方在于它的可扩展性。基于 Frappe 框架,你可以用极低的代码量实现定制需求。
开发环境搭建
# 1. 创建开发站点
bench new-site dev.localhost --force
bench use dev.localhost
# 2. 创建自定义应用
bench new-app my_custom_app
# 目录结构:
# my_custom_app/
# ├── my_custom_app/
# │ ├── __init__.py
# │ ├── hooks.py # 应用钩子配置
# │ ├── modules.txt # 模块列表
# │ ├── custom_doctype/ # 自定义文档类型
# │ └── api.py # 自定义 API
# └── setup.py
自定义 DocType(低代码方式)
DocType 是 Frappe 的核心概念,相当于数据库表 + 表单 + API 的集合。
示例:创建"项目管理"模块
# 通过 Python 代码定义 DocType
import frappe
from frappe.model.document import Document
class ProjectTask(Document):
pass
# hooks.py 中注册
# doc_events = {
# "Project Task": {
# "on_update": "my_custom_app.tasks.notify_assignee"
# }
# }
DocType 字段类型
| 字段类型 | 用途 | 示例 |
|---|---|---|
| Data | 单行文本 | 项目名称 |
| Long Text | 多行文本 | 项目描述 |
| Select | 下拉选择 | 状态(进行中/已完成/已取消) |
| Date | 日期 | 开始日期 |
| Currency | 金额 | 预算 |
| Link | 关联其他 DocType | 关联客户 |
| Table | 子表(一对多) | 任务列表 |
| Attach | 文件附件 | 项目文档 |
自定义 API
# my_custom_app/api.py
import frappe
from frappe import _
@frappe.whitelist()
def get_project_summary(project_name):
"""获取项目摘要信息"""
project = frappe.get_doc("Project", project_name)
tasks = frappe.get_all("Project Task",
filters={"project": project_name},
fields=["task_name", "status", "assigned_to", "deadline"]
)
return {
"project_name": project.project_name,
"status": project.status,
"budget": project.budget,
"tasks": tasks,
"completion": project.percentage_complete
}
# 调用方式:
# GET /api/method/my_custom_app.api.get_project_summary?project_name=PRJ-001
自定义工作流
# 定义采购审批工作流
workflow = {
"workflow_name": "Purchase Approval",
"document_type": "Purchase Order",
"states": [
{"state": "Draft", "allow_edit": "Purchase Manager"},
{"state": "Pending Approval", "allow_edit": "Purchase Manager"},
{"state": "Approved", "allow_edit": "Director"},
{"state": "Rejected", "allow_edit": "Director"},
],
"transitions": [
{"from": "Draft", "to": "Pending Approval", "action": "Submit", "allowed": "Purchase Manager"},
{"from": "Pending Approval", "to": "Approved", "action": "Approve", "allowed": "Director"},
{"from": "Pending Approval", "to": "Rejected", "action": "Reject", "allowed": "Director"},
]
}
自定义报表
# my_custom_app/reports/sales_summary.py
import frappe
def execute(filters=None):
columns = [
{"fieldname": "customer", "label": "客户", "fieldtype": "Link", "options": "Customer", "width": 200},
{"fieldname": "total_sales", "label": "销售额", "fieldtype": "Currency", "width": 150},
{"fieldname": "total_qty", "label": "数量", "fieldtype": "Int", "width": 100},
]
conditions = ""
if filters.get("from_date"):
conditions += f" AND si.posting_date >= '{filters.from_date}'"
if filters.get("to_date"):
conditions += f" AND si.posting_date <= '{filters.to_date}'"
data = frappe.db.sql(f"""
SELECT
si.customer,
SUM(si.grand_total) as total_sales,
SUM(si.total_qty) as total_qty
FROM `tabSales Invoice` si
WHERE si.docstatus = 1 {conditions}
GROUP BY si.customer
ORDER BY total_sales DESC
""", as_dict=True)
return columns, data
前端定制
ERPNext 使用 Vue.js 和 Jinja 模板,你可以自定义:
// 自定义表单脚本
frappe.ui.form.on('Sales Order', {
refresh: function(frm) {
// 添加自定义按钮
frm.add_custom_button('导出 PDF', function() {
frappe.call({
method: 'my_custom_app.api.export_pdf',
args: { docname: frm.doc.name },
callback: function(r) {
window.open(r.message.url);
}
});
});
},
validate: function(frm) {
// 自定义验证
if (frm.doc.discount > 20) {
frappe.throw('折扣不能超过 20%');
}
}
});
运维与优化
备份与恢复
# 备份站点
bench --site erp.yourdomain.com backup
# 备份到云端
bench --site erp.yourdomain.com backup --with-files
# 恢复备份
bench --site erp.yourdomain.com restore /path/to/database.sql.gz
# 定时备份(添加到 crontab)
0 2 * * * cd /home/frappe/frappe-bench && bench backup-all-sites
性能优化
# 1. 启用 Redis 缓存(在 site_config.json 中)
{
"cache_redis": "redis://localhost:6379"
}
# 2. 数据库索引优化
# 对高频查询字段添加索引
frappe.db.add_index("Sales Invoice", ["customer", "posting_date"])
# 3. 启用 Gunicorn 多进程
# 在 bench 配置中设置
bench config set-common-config -c gunicorn_workers 4
监控与日志
# 查看 bench 日志
bench --site erp.yourdomain.com logs
# 查看 MariaDB 慢查询
mysql -u root -e "SHOW VARIABLES LIKE 'slow_query_log%';"
# 监控服务器资源
htop
iotop
ERPNext 常见问题 FAQ
Q1: ERPNext 适合什么规模的企业?
A: ERPNext 适合从小微到中型企业(1-500 人): - 小微企业(1-50 人):免费自托管,零授权成本,快速上线 - 中型企业(50-500 人):支持多公司、多仓库、多币种,满足复杂业务 - 大型企业(500 人以上):可通过 Frappe Cloud 或自建集群扩展
Q2: ERPNext 有中文版本吗?
A: 是的,ERPNext 原生支持中文(简体),包括界面、报表、打印模板等。你可以在系统设置中切换语言。社区也在持续完善中文本地化,包括中国会计准则、税制等。
Q3: ERPNext 和 Odoo 有什么区别?
A: 核心区别: - 开源程度:ERPNext 100% 开源(GPL),Odoo 社区版缺少财务等核心模块 - 定价:ERPNext 完全免费,Odoo 企业版按用户收费 - 二次开发:ERPNext 的 Frappe 框架低代码能力更强,Odoo 需要更多编码 - 中文生态:ERPNext 中文社区活跃,Odoo 中文资料更成熟
Q4: 自托管 ERPNext 需要什么样的服务器?
A: 最低配置: - 2 核 CPU + 4GB 内存 + 20GB 存储 — 适合测试和小团队(<20 人) - 4 核 CPU + 8GB 内存 + 50GB 存储 — 适合中型企业(20-100 人) - 8 核 CPU + 16GB 内存 + 100GB+ SSD — 适合大型企业(100+ 人)
推荐使用 SSD 存储以提升数据库性能。
Q5: ERPNext 可以与其他系统集成吗?
A: 可以。ERPNext 提供 REST API 和 Webhook 支持,可以与以下系统集成: - 电商平台:Shopify、WooCommerce、有赞 - 支付网关:支付宝、微信支付、Stripe - 物流系统:顺丰、中通、FedEx - 第三方系统:通过 API 对接任何外部系统
# ERPNext REST API 示例
import requests
# 获取客户列表
response = requests.get(
"https://erp.yourdomain.com/api/resource/Customer",
headers={"Authorization": "token api_key:api_secret"}
)
customers = response.json()
# 创建销售订单
response = requests.post(
"https://erp.yourdomain.com/api/resource/Sales Order",
headers={"Authorization": "token api_key:api_secret", "Content-Type": "application/json"},
json={"customer": "CUST-001", "items": [{"item_code": "ITEM-001", "qty": 10}]}
)
总结
ERPNext 是目前最成熟、最完整的开源 ERP 解决方案之一。它不仅能满足中小企业日常业务管理的需求,还能通过 Frappe 框架的强大扩展能力,实现高度定制化的二次开发。
快速上手路径: 1. Docker 一键部署(5 分钟) 2. 完成公司、用户、基础数据配置 3. 从财务或 CRM 模块开始使用 4. 根据业务需求逐步启用其他模块 5. 必要时进行二次开发定制
无论你是一家刚起步的创业公司,还是一家正在数字化转型的传统企业,ERPNext 都值得你认真考虑。100% 免费、完全开源、社区活跃——这就是 ERPNext 的核心竞争力。
访问 ERPNext 官网 或 GitHub 仓库 了解更多。
