ERPNext

对于中小企业来说,数字化转型的最大障碍往往不是意愿,而是成本。传统 ERP 系统(如 SAP、Oracle)动辄数十万甚至上百万的授权费用,让大多数中小企业望而却步。而免费的替代品往往功能残缺、界面老旧、缺乏维护。

ERPNext 的出现改变了这个局面。作为一款 100% 免费开源 的企业资源规划(ERP)系统,ERPNext 提供了涵盖财务、CRM、销售、采购、库存、制造、人力资源等核心业务模块的完整解决方案。它基于 Frappe 框架构建,采用 Python + JavaScript 技术栈,拥有现代化的 Web 界面和强大的二次开发能力。

本文将带你从零开始,完成 ERPNext 的安装部署、基础配置、核心模块使用,并深入讲解二次开发实战,帮助你快速搭建一套适合自身业务的企业级 ERP 系统。

ERPNext Dashboard

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 仓库 了解更多。