對於中小企業來說,數位轉型最大的障礙往往不是意願,而是成本。傳統 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 儲存庫 了解更多。
