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 儲存庫 了解更多。