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 | 営業 | 購買 | 在庫 | 人事  │
├─────────────────────────────────────┤
│       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 は複数のデプロイ方法に対応しています。このセクションでは最も一般的な 3 つの方法を詳しく解説します:Docker デプロイ(推奨)、手動インストール、Frappe Cloud ホスティング。

方法一:Docker デプロイ(推奨)

Docker デプロイは最も簡単でクリーンなインストール方法で、迅速なテストと本番環境の両方に対応します。

システム要件

  • CPU: 2 コア以上
  • メモリ: 4GB 以上(推奨 8GB)
  • ストレージ: 20GB 以上
  • OS: Ubuntu 20.04/22.04、CentOS 8+、Debian 11+

docker-compose で一括デプロイ

BASH
# 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 リバースプロキシの設定(本番環境)

BASH
# 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

方法二:手動インストール(深いカスタマイズ向け)

手動インストールはシステムの深いカスタマイズやデバッグが必要なデベロッパー向けです。

BASH
# 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 Manager)→ 人事モジュール

ユーザーの作成

PYTHON
# 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 の販売、購買、在庫操作は自動的に仕訳を生成します:

PYTHON
# 売上請求書の自動仕訳
借方:売掛金           ¥10,000
    貸方:営業収益         ¥8,849.56
        仮受消費税         ¥1,150.44

# 購買入庫の自動仕訳
借方:商品             ¥5,000
    貸方:買掛金           ¥5,000

財務諸表

  • 貸借対照表 — 会社の財務状況をリアルタイムに反映
  • 損益計算書 — 期間ごとの収益と支出を集計
  • キャッシュフロー計算書 — 現金の流入・流出を追跡
  • 売掛金/買掛金のエージング分析 — 回収リスクをモニタリング

📦 在庫モジュール(Stock)

倉庫管理

複数倉庫、複数ロケーションの管理に対応:

本社倉庫
├── エリア A - 原材料
│   ├── A-01 電子部品
│   └── A-02 構造部品
├── エリア B - 完成品
│   ├── B-01 発送待ち
│   └── B-02 検品済み
└── エリア C - 返品

在庫操作

操作 説明
入庫 購買入庫、生産入庫、返品入庫
出庫 販売出庫、生産出庫、廃棄出庫
振替 倉庫間の移動
棚卸 帳簿と実物の定期的な照合
シリアル番号/ロット追跡 各製品を正確に追跡

在庫アラート

最小在庫閾値を設定し、閾値を下回ると自動的に補充を通知:

PYTHON
# 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)

従業員管理

  • 従業員プロフィール(個人情報、契約書、緊急連絡先)
  • 組織図(部門、職位、報告関係)
  • 入社/退職フロー

勤怠と休暇

PYTHON
# 勤怠ルールの設定
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 フレームワークをベースに、ごく少量のコードでカスタムニーズを実現できます。

開発環境の構築

BASH
# 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
# 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 1 行テキスト プロジェクト名
Long Text 複数行テキスト プロジェクト説明
Select ドロップダウン選択 ステータス(進行中/完了/キャンセル)
Date 日付 開始日
Currency 金額 予算
Link 他の DocType へのリンク 顧客にリンク
Table サブテーブル(1 対多) タスクリスト
Attach ファイル添付 プロジェクトドキュメント

カスタム API

PYTHON
# 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

カスタムワークフロー

PYTHON
# 購買承認ワークフローの定義
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"},
    ]
}

カスタムレポート

PYTHON
# 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 テンプレートを使用しており、カスタマイズできます:

JAVASCRIPT
// カスタムフォームスクリプト
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% を超えることはできません');
        }
    }
});

運用と最適化

バックアップと復元

BASH
# サイトをバックアップ
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

パフォーマンス最適化

PYTHON
# 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

モニタリングとログ

BASH
# 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 を提供しており、以下のシステムと統合できます: - EC プラットフォーム:Shopify、WooCommerce、有賛 - 決済ゲートウェイ:支付宝(アリペイ)、WeChat Pay、Stripe - 物流システム:順豊(SF Express)、中通(ZTO)、FedEx - サードパーティシステム:API を介して任意の外部システムと連携

PYTHON
# 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 リポジトリ で詳細をご確認ください。