OSS人事管理システム比較:OrangeHRM vs Odoo HR vs Leave Management で従業員管理をセルフホスト
オープンソースラボ編集部 ・ 2026年6月14日
OSS人事管理システム比較:OrangeHRM vs Odoo HR vs Leave Management で従業員管理をセルフホスト
BambooHR(Essentialプランで月$5.25/従業員〜)・Workday(大企業向けで年数百万円〜)に対して、OrangeHRM(コミュニティ版無料のフルスタックHRM)・Odoo HR(ERPと統合したHRモジュール)・Leave Management(Django-leave-management)(有給管理特化のシンプルなOSS)はセルフホスト可能なOSSのHRツールです。
OSS人事管理ツールが必要な場面
- 中小企業の従業員データ管理: 従業員情報・雇用形態・部門・役職のデータベース
- 有給・休暇申請: 残日数管理・申請ワークフロー・自動承認
- 採用管理: 求人掲載・応募者追跡(ATS)・面接スケジュール
- 給与・経費精算: 給与計算・経費申請と精算
- 評価・目標管理: 半期評価・OKR・フィードバック
主要ツールの概要
OrangeHRM
2005年から開発されているフルスタックのHRMソフトウェアです。GitHubスター1.2k+。コミュニティ版はApache 2.0ライセンスで無料。従業員管理・採用・有給管理・タイムシート・評価・研修機能を提供します。PHP/Symfonyで実装され、MySQLバックエンドを使用します。300社以上で10万名以上の従業員を管理する実績があります。
# OrangeHRMをDockerで起動
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
orangehrm:
image: orangehrm/orangehrm:latest
restart: always
ports:
- "80:80"
environment:
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DATABASE: orangehrm
MYSQL_USER: orangehrm
MYSQL_PASSWORD: your-password
ORANGEHRM_URL: https://hr.yourcompany.com
volumes:
- orangehrm_data:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: orangehrm
MYSQL_USER: orangehrm
MYSQL_PASSWORD: your-password
MYSQL_ROOT_PASSWORD: root-password
volumes:
- mysql_data:/var/lib/mysql
volumes:
orangehrm_data:
mysql_data:
EOF
docker compose up -d
# WebUI: http://localhost
# デフォルト認証: admin / admin123 (初回は変更推奨)
# OrangeHRM APIで従業員を取得
import requests
OHR_URL = "https://hr.yourcompany.com"
# OAuth 2.0トークンを取得
token_resp = requests.post(f"{OHR_URL}/oauth/issueToken", data={
"client_id": "api_oauth_id",
"client_secret": "oauth_secret",
"grant_type": "password",
"username": "admin",
"password": "admin123",
})
access_token = token_resp.json()["access_token"]
headers = {"Authorization": f"Bearer {access_token}", "Content-Type": "application/json"}
# 従業員一覧を取得
employees = requests.get(
f"{OHR_URL}/api/v2/pim/employees",
headers=headers,
params={"limit": 50, "offset": 0}
).json()
for emp in employees["data"]:
print(f"{emp['employeeId']}: {emp['firstName']} {emp['lastName']} - {emp['jobTitle']['title']}")
# 有給申請状況を取得
leaves = requests.get(
f"{OHR_URL}/api/v2/leave/leave-requests",
headers=headers,
params={"status[0]": "PENDING"}
).json()
print(f"Pending leave requests: {leaves['meta']['total']}")
Odoo HR
オープンソースのERP「Odoo」のHRモジュールです。GitHubスター40k+(Odoo本体)。ERPと完全統合されているため、採用→入社→給与→経費→退社のフルライフサイクルを一つのシステムで管理できます。採用(Recruitment)・従業員管理(Employees)・有給管理(Time Off)・経費(Expenses)・評価(Appraisals)・給与(Payroll)が全て統合されています。Python(Django風フレームワーク)実装です。
# OdooをDockerで起動
cat > docker-compose.yml << 'EOF'
version: '3.1'
services:
web:
image: odoo:17.0
depends_on:
- db
ports:
- "8069:8069"
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
environment:
HOST: db
USER: odoo
PASSWORD: myodoo
db:
image: postgres:15
environment:
POSTGRES_DB: postgres
POSTGRES_PASSWORD: myodoo
POSTGRES_USER: odoo
volumes:
- odoo-db-data:/var/lib/postgresql/data
volumes:
odoo-web-data:
odoo-db-data:
EOF
docker compose up -d
# WebUI: http://localhost:8069
# 初回セットアップ: データベース名・メールアドレス・パスワードを設定
# Odoo XML-RPC APIで従業員を管理
import xmlrpc.client
url = "https://odoo.yourcompany.com"
db = "yourcompany"
username = "admin@yourcompany.com"
password = "admin-password"
# 認証
common = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/common")
uid = common.authenticate(db, username, password, {})
models = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/object")
# 従業員一覧を取得
employees = models.execute_kw(
db, uid, password,
"hr.employee", "search_read",
[[["active", "=", True]]],
{"fields": ["name", "job_title", "department_id", "work_email"], "limit": 50}
)
for emp in employees:
dept = emp["department_id"][1] if emp["department_id"] else "未設定"
print(f"{emp['name']} | {emp['job_title']} | {dept}")
# 採用求人を作成
job_id = models.execute_kw(
db, uid, password,
"hr.job", "create",
[{"name": "シニアエンジニア", "department_id": 1, "no_of_recruitment": 2}]
)
print(f"Created job: {job_id}")
Leave Management(Django leave management)
シンプルな有給管理に特化したDjango製OSSです。GitHubスター600+。大規模なHRMSは不要だが有給申請・承認・残日数管理だけを自社サーバーで管理したい小規模チームに適しています。シンプルなUIと設定で素早く導入できます。
# Django Leave Managementをセットアップ
git clone https://github.com/edwinlunando/django-leave-management.git
cd django-leave-management
pip install -r requirements.txt
# 環境設定
cp .env.example .env
# データベース設定(デフォルトSQLite)
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
# またはDockerで
docker build -t leave-management .
docker run -d -p 8000:8000 -v leave_data:/app/data leave-management
機能比較表
| 比較項目 | OrangeHRM | Odoo HR | Leave Management |
|---|---|---|---|
| 従業員管理 | ✅(詳細) | ✅ | ❌ |
| 有給管理 | ✅ | ✅ | ✅(特化) |
| 採用(ATS) | ✅ | ✅ | ❌ |
| 給与計算 | ✅(有料版) | ✅ | ❌ |
| ERP統合 | ❌ | ✅ | ❌ |
| セットアップ難易度 | 中 | 高 | 低 |
| 対象規模 | 10〜500名 | 10〜5000名 | 5〜50名 |
従業員の日程管理・会議予約にはCommunicationカテゴリ/categories/communicationのCal.comが有効です。HRデータのBIレポートにはDevOpsカテゴリ/categories/devopsのMetabaseやApache Supersetで可視化できます。
FAQ
Q. OrangeHRMとBambooHRの機能差を教えてください
A. BambooHRが優れている点: ①セットアップが極めて簡単(SaaS)②モバイルアプリが充実③ダッシュボード・レポートがわかりやすい④Workdayほどの複雑さがなくSMBに最適。OrangeHRMが優れている点: ①コミュニティ版は完全無料②セルフホストでデータ主権を確保③カスタマイズが可能(PHPコードで拡張)④採用・有給・タイムシート・評価が標準で揃う。従業員50名未満で管理工数を最小化したいならBambooHRのコスパが良い場合もありますが、従業員数が増えると月額コストが大きくなるため100名超ではOrangeHRMのROIが高まります。
Q. OdooはHR用途だけで使えますか?それともERP全体を導入しないといけませんか?
A. HRモジュール単体でのインストールは可能です。Odooはモジュール式で、必要なモジュールだけを有効化できます。HR用途のみの場合: ①Employees(従業員管理)②Time Off(有給管理)③Recruitment(採用)④Expenses(経費)⑤Appraisals(評価)だけを有効化し、在庫・会計・製造モジュールは無効にできます。ただしOdooのUIはERPとして設計されているため、HR専用ツールに比べて画面遷移が複雑です。「HRだけ使いたい」のであれば、OrangeHRMの方がシンプルでしょう。
Q. 日本の労務法規(有給5日取得義務・36協定等)に対応できますか?
A. OrangeHRMコミュニティ版は日本の法規制に特化した機能はなく、カスタマイズが必要です。具体的に対応が必要な要件: ①有給5日取得義務: カスタムレポートで年5日未満の従業員を抽出する機能は実装可能②36協定: 月次・年次の残業時間上限管理はタイムシートモジュールで基本追跡可能(上限アラートは要カスタマイズ)③マイナンバー管理: 機密情報のため暗号化ストレージとアクセスログが必要(要カスタマイズ)。現状では日本法規制の完全対応にはsmartHRやfreee人事労務のような国産SaaS、またはsayhr(OSS)等の国内特化ツールの方が現実的です。
Q. OrangeHRMでSlack通知を設定できますか?
A. OrangeHRM標準ではSlack通知はありませんが、Webhookを使ったカスタム統合が可能です。
// OrangeHRM Plugin: Slack Webhook通知(カスタム実装例)
// src/plugins/MyPlugin/lib/SlackNotifier.php
class SlackNotifier {
private string $webhookUrl;
public function __construct() {
$this->webhookUrl = "https://hooks.slack.com/services/YOUR_WEBHOOK";
}
public function notifyLeaveApproval(string $employeeName, string $leaveType, string $dates): void {
$message = [
"text" => "*有給申請承認* :white_check_mark:",
"blocks" => [
[
"type" => "section",
"text" => [
"type" => "mrkdwn",
"text" => "*{$employeeName}* さんの {$leaveType} が承認されました
日付: {$dates}",
]
]
]
];
file_get_contents($this->webhookUrl, false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json",
"content" => json_encode($message),
]
]));
}
}
まとめ
| ユースケース | 推奨ツール |
|---|---|
| フルスタックHRM・採用〜退社 | OrangeHRM |
| ERP統合・給与・経費精算 | Odoo HR |
| 有給管理のみ・小規模 | Leave Management |