首頁

目前文章總數:197 篇

  

最後更新:2025年 09月 13日

0020. Jorani 安裝教學:免費開源請假管理系統 Docker 部署完整指南

日期:2025年 10月 25日

標籤: Linux Ubuntu Docker Docker-Compose Container Jorani Nginx

摘要:資訊筆記


應用所需:1. Linux 主機(本篇 Linux Ubuntu 22.04 作業系統)
     2. 已安裝 Docker
     3. 已安裝 Dotnet SDK 8.0 以上版本(本篇範例使用)
     4. 已安裝 Nginx
解決問題:1. 如何快速搭建免費的請假管理系統 Jorani - 為公司省下一筆人力成本
基本介紹:本篇分為 5 大部分。
第一部分:基本介紹
第二部分:安裝與部署遇到的問題
第三部分:伺服器正確安裝 & 配置憑證
第四部分:用戶端配置
第五部分:Demo 成果






第一部分:基本介紹

Step 1:Jorani 基本介紹

Jorani 是 Github開源請假管理系統 軟體,基於免費與開源
並且屬於 AGPL v3 licence 可以直接免費使用

Jorani is a Leave Management System developed in PHP/MySQL under an AGPL v3 licence.
Jorani is designed to provide simple leave and overtime request workflows for small organizations.


簡要的說:此免費軟體需要安裝 PHP/Mysql 並適合用於中小型組織架構


官方首頁https://jorani.org


Step 2:Jorani - 優缺點

Jorani 有以下優點,具備了完整請假管理系統與商業考量(免費)上的價值

優點 說明
完全免費 開源軟體,無需支付授權費用
低維護成本 相較於商業軟體,維護成本較低
無使用者數量限制 可無限制新增員工帳號
跨平台支援 基於 Web 的系統,支援各種作業系統和裝置
容器化部署 支援 Docker,安裝和部署相對簡單
開源透明 程式碼公開,可進行安全性審查和客製化
多語言介面 支援包含繁體中文在內的多種語言
功能涵蓋豐富 支援複雜的組織架構和審核流程、行事曆、多層級審核、報表功能等


在使用時也須斟酌以下缺點:

缺點 說明
需要技術知識 安裝和維護需要一定的 IT 技術能力
伺服器環境要求 需要自行準備和管理伺服器環境
SSL 設定複雜 HTTPS 設定對非技術人員較為困難
整合能力有限 與其他企業系統(如 ERP、HRM)整合較困難
工作流程彈性有限 複雜的審核流程設定可能受限
社群支援 主要依賴社群支援,官方技術支援有限、使用上很多時候需自行摸索
缺乏企業級功能 災難備份、單一登入整合、稽核追蹤日誌不夠完善



Step 3:Jorani - 完全免費與開源 & AGPL-3.0

Jorani 是一套免費的人事/請假管理系統,官方釋出時使用 AGPL-3.0 授權。
這代表任何人都 可以免費使用、修改、再發佈,只要遵守 AGPL 條款,APGL 條款簡要說明:

AGPL-3.0 授權條款是一種很「嚴格的自由軟體授權」,如果你用了 AGPL 授權的程式並且有修改,就要支付費用


但 Jroani 並無商業收費方案,只要不 轉售商業用途 那麼都不會面臨被提告的風險


Step 4:Jorani - 應用場景與比較

適用性與應用場景比較:

適用的對象 不適用的對象
中小型企業(50-200 人) 大型企業(需要複雜整合)
IT 技術能力較強的組織 缺乏技術支援的公司(無開發人員)
預算有限但需要數位化管理的公司 要深度客製化和進階功能的組織
重視資料掌控權,注重私有安全性的企業 對即時技術支援有強烈需求的企業(缺少SLA 保障)


若有開發人員、並且想節省成本、又想快速上手,公司規模適中,那麼 Jorani 會是相當推薦的系統



第二部分:安裝與部署遇到的問題

Step 1:不支援內部 IP 訪問 - 問題 1

基於安全性的原因 Jorani 不支援 http 與 IP 直連,否則會出現錯誤:

Error on first login "Uncaught (in promise) typeError: Cannot read properties of undefined (reading 'importKey')



登入時會沒有任何反應


開啟 F12 檢視瀏覽器出現錯誤訊息,這是 Jorani 基於安全性保護登入


Step 2:需有域名與 SSL 憑證 - 問題 2

其次除了不支援 IP 外,訪問需要 域名 訪問,否則也會異常,關於此安全性解釋

Jorani 相關 Issues


Step 3:需有域名與 SSL 憑證 - 問題 2 - 解釋

BALET 解釋說明強調只支援 Https
補充:如果安裝在本機用於測試可支援 Localhost,但實務上給使用者用,必需解決上述 2 個問題(域名 + SSL)




第三部分:如何正確的安裝 & 配置憑證

Step 1:取得 Jorani 開源代碼

先進入官網取得 .git 連結

https://github.com/bbalet/jorani




Step 2:下載到部署主機

下載源代碼,並且複製到 Ubuntu 部署主機上


Step 3:調整 docker-compose.yml

如果直接執行 Docker 運行,會出現第二部分的錯誤,因此我們需要調整以下 2 個參數

參數 異動前 異動後 說明
ports 80:80 8765:80 80 Port 很容易被占用,可以避開
BASE_URL https://jorani.company.local 設定要讓使用者訪問的 url 可自定義
version: '3.4'
services:
  jorani:
    build: .
    ports:
      - "8765:80"
    environment:
      - MYSQL_HOST=mysql
      - MYSQL_DATABASE=jorani
      - MYSQL_USER=jorani
      - MYSQL_PASSWORD=jorani
      - BASE_URL=https://jorani.company.local
  mysql:
    image: mysql:8
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=jorani
      - MYSQL_DATABASE=jorani
      - MYSQL_USER=jorani
      - MYSQL_PASSWORD=jorani
    volumes:
      - ./sql/jorani.sql:/docker-entrypoint-initdb.d/jorani.sql




Step 4:執行 docker-compose

調整完成後,可在部署主機上運行以下指令,使其容器化運行

docker-compose up -d




Step 5:建立 SSL 自簽憑證 - 建立資料夾

在部署主機上,建立資料夾,並且移動到該目錄下

mkdir -p /etc/nginx/certs
cd /etc/nginx/certs




Step 6:建立 SSL 自簽憑證 - 新增憑證

輸入以下指令,憑證有效期為 365 天,具體依照自己需求來配置,最重要的是域名 jorani.company.local
必需要與 jorani 的 docker-compose.yml 一致

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/certs/jorani.key \
  -out /etc/nginx/certs/jorani.crt \
  -subj "/CN=jorani.company.local"


如果是內部環境使用,其實可以設定 **-days 36500 ** 約 100 年,因為 Jorani 為內部使用,可考量方便性


Step 7:建立 SSL 自簽憑證 - 確認憑證

若正確產生,應可看到對應路徑下出現公開憑證 jorani.crt 與 私有憑證 jorani.key


Step 8:Nginx 配置

在代理伺服器方面,我們還需對 jorani.company.local 域名做 Nginx 配置
將 .crt .key 綁定於 443 (Https) 並且對外域名為 jorani.company.local
以及 SSL 安全設定與配置 Web Crypto API

server {
    listen 443 ssl;
    server_name jorani.company.local;
    ssl_certificate     /etc/nginx/certs/jorani.crt;
    ssl_certificate_key /etc/nginx/certs/jorani.key;
    
    # 添加 SSL 安全設定
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    location / {
        proxy_pass http://192.168.51.93:8765;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        
        # 添加這些 header 解決 Web Crypto API 問題
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
    }
}

# 添加 HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name jorani.company.local;
    return 301 https://$server_name$request_uri;
}






第四部分:用戶端配置

Step 1:用戶端域名配置

通常公司內部需要 IT 人員協助配置域名解析,在測試、或少數內部人員使用,更快速的解法是讓使用者 Hosts 添加域名對應
到 Windows 以下目錄

C:\\Windows\\System32\\drivers\\etc




Step 2:添加域名對應

開啟 Hosts 檔案, 192.168.51.93 是我們 Jorani 的內部域名伺服器位置

## Jorani ##
192.168.51.93 jorani.company.local





第五部分:Demo 成果

Step 1:登入 Jorani WebUI

配置完成後,可以嘗試從本機開啟瀏覽器訪問 Jorani WebUI,以下是預設帳號、密碼:

帳號 bbalet
密碼 bbalet
https://jorani.company.local




Step 2:完成

登入後就可以看到 Jorani 最高權限的 請假管理系統 介面