首頁

目前文章總數:182 篇

  

最後更新:2025年 05月 31日

0015. Docker 容器化搭建免費專案管理系統:OpenProject & 解決安裝遭遇問題 & 無法登入問題

日期:2025年 05月 31日

標籤: Linux Ubuntu OpenProject Docker Docker-Compose Container

摘要:資訊筆記


應用所需:1. Linux 主機(本篇 Linux Ubuntu 22.04 作業系統)
     2. 已安裝 Docker
     3. 已安裝 Docker-Compose (本篇使用 1.29.2 版本)
     3. 已安裝 Dotnet SDK 8.0 以上版本(本篇範例使用)
解決問題:1. 如何在 Ubuntu 上容器化搭建專案管理系統套件
     2. 如何設定 OpenProject WebUI 訪問,與解決 Port 號衝突
     3. 解決無法登入的問題 - 這在第三部分有 2 種解法,如果照官方文件直接安裝都會遇到的問題
基本介紹:本篇分為 3 大部分。
第一部分:介紹 OpenProject
第二部分:安裝 OpenProject
第三部分:登入 & 基本設定






第一部分:介紹 OpenProject

Step 1:介紹

OpenProject官網連結
OpenProject 文件手冊

OpenProject is free and open source software for classical as well as agile project management to support your team along the entire project life-cycle. OpenProject is available in more than 30 languages.

OpenProject is licensed under GNU GPL V3. The source code is freely published on GitHub. We understand free as in free speech. We do offer paid subscriptions for our software.

OpenProject exists since 2011 and is a fork of the deprecated ChiliProject which was a fork of Redmine.


簡單說:OpenProject 是一套免費的專案管理系統,可以用來協助團隊追蹤進度。
※目前 2025 年市面最主流的仍是 Jira ,但是需收費,OpenProject 是一個不錯的免費選擇替換方案

Step 2:收費價格

付費方案較多,但是仍有提供免費方案,大型方案付費價格是以每人為單位計算。

方案 適用場景 價格模式 價格
Community 小型團隊、非商業用途 免費  
Basic 中小型團隊或部門 付費 每人每月 5.95 歐
Professional 中大型組織 付費 每人每月 10.95 歐
Premium 大型企業 付費 每人每月 15.95 歐
Corporate 大型跨國企業 企業定制價格 洽談


官網報價

Step 3:OpenProject 必備功能

以下功能無論在免費、付費都會提供,在專案管理、追蹤專案開發進度、提供分析報表、文件管理、知識分享,都可以對企業提供很大的幫助

功能
項目概述頁面
工作包管理
甘特圖/時間線
基本敏捷看板
排程功能
會議管理
日曆
時間追蹤
成本管理
報表
預算管理
Bug跟蹤
Wiki
文檔管理
論壇
自定義字段
用戶組與權限
工作包模板
項目模板
個人儀表板
全文搜索
API接口


Step 4:收費版(企業版本)提供的服務

以下是付費版提供的功能,若有需要可以再深入分析

功能 Basic Professional Premium Corporate
基準比較
狀態看板 (看板)
團隊看板
版本看板
子項目看板
工作分解結構
團隊規劃器
與外部用戶共享工作包
自定義主題和標誌
項目概述頁面圖表
智能工作流程與自定義操作按鈕
日期提醒
工作包唯讀模式
LDAP認證
雙因素認證
安全警報
OneDrive/SharePoint整合
LDAP用戶和組同步  
單點登錄 (SSO)  


Step 5:免費版、收費版服務等級

基本上免費版,提供的服務有限,要自行從網路中搜尋、詢問AI,獲取相關資源。
EX: 安裝異常、如何使用某些功能…

支持項目 Community Basic Professional Premium Corporate
支持渠道 社區論壇 票務系統 票務系統+電話 票務系統+電話+遠程支持 票務系統+電話+遠程+現場支持
服務時間 週一至週五
9:30-16:00 CET
週一至週五
9:30-17:00 CET
週一至週五
9:30-17:30 CET
週一至週五
9:00-18:00 CET
定制
關鍵事件響應時間 8小時 6小時 2小時 2小時 定制
主要事件響應時間 盡力而為 12小時 6小時 6小時 定制
次要事件響應時間 盡力而為 48小時 24小時 24小時 定制
指定支持聯絡人 1人 3人 8人 更多 更多
個人化入職經理    
優先開發和升級      


Step 6:免費版配置限制

官網安裝指南資訊,有建議安裝需求:
以下是最低限制:

Minimum Hardware Requirements

CPU: Quad Core CPU (>= 2ghz)
Memory: 4096 MB
Free disk space: 20 GB
This is for a single server running OpenProject for up to 200 total users. Depending on your number of concurrent users, these requirements might vary drastically.
1. 記憶體 4096 MB
2. 最小 CPU 2 核心
2. 20GB 硬碟



另外,官方也給了自行安裝免費 Community 有以下使用者數量對應配置 (200以下, 500以上, 1500以上)



第二部分:安裝 OpenProject

Step 1:下載檔案

這邊會用官方教學的方式,docker-compose.yml 的方式安裝
但如果直接照上面的做會遇到一些問題,後續會解釋,先進入自己 Ubuntu 目錄下執行以下,抓取 Source

git clone https://github.com/opf/openproject-deploy --depth=1 --branch=stable/15 openproject




資料結構應會如圖:


Step 2:到目錄複製 .env

接著進行環境變數的複製

cp .env.example .env



Step 3:開啟 .env 環境檔

這邊都用 WinScp 操作,也可以用 Nano 或 vim 自己擅長的方式進行,開啟檔案

Step 4:編輯 .env 環境檔

進入後,官方會提供預設的參數,如下:



Step 5:安裝 - 拉取最新映像檔

輸入以下指令拉取最新 image

OPENPROJECT_HTTPS=false docker-compose pull



Step 6:安裝 - 啟動 docker-compose

完成後輸入以下指令,關閉 Https ,並且我們是內部網路使用

OPENPROJECT_HTTPS=false docker-compose up -d --build



Step 7:容器啟動狀態

安裝完成後,進入 portainer 可以觀察到,所有的容器都是透過 proxy 容器做代理,再讓使用者對 web_1 容器訪問

Step 8:啟動 WebUI

依照自己機器的位置,輸入對應 IP + 8080 可以看到網站已經啟動

http://192.168.51.93:8080



Step 9:(可選)更換 Port 號 - 調整 env 檔案

在 setp4. 的時候,有編輯 env 參數的地方,通常 8080 都會被占用,這時就需要換 Port 號
進行添加自己想要提供訪問的 Port 號,localhost 的地方也可以改成明確的內部 IP 位置

Step 10:(可選)更換 Port 號 - 調整 docker-compose.yml

接著要編輯 docker-compose.yml ,找出 OPENPROJECT_HOST__NAME 將 8080 改為 3535(這邊範例用的 Port)


Step 11:(可選)更換 Port 號 - 再次啟動

依次輸入以下,如果已經安裝過的,要輸入 docker-compose down 將所有容器移除。

docker-compose down
PORT=3535 OPENPROJECT_HTTPS=false docker-compose pull
PORT=3535 OPENPROJECT_HTTPS=false docker-compose up -d --build


Step 12:(可選)更換 Port 號 - 登入 WebUI

用新的 Port 號,就可以正常訪問了

http://192.168.51.93:3535



Step 13:補充 docker-compose.yml 說明

以下是調整過 Port 號,微調整官方的 docker-compose.yml ,也是啟用 port 3535 的.yml 檔案

# 定義 Docker 網絡,前端和後端分離以提高安全性
networks:
  frontend:  # 前端網絡,用於連接代理服務器和web服務
  backend:   # 後端網絡,用於內部服務之間的通信

# 定義持久化存儲卷
volumes:
  pgdata:    # PostgreSQL 資料庫數據存儲
  opdata:    # OpenProject 資產存儲

# 定義錨點(anchors),用於在YAML中復用配置
x-op-restart-policy: &restart_policy
  restart: unless-stopped  # 容器自動重啟策略,除非手動停止

x-op-image: &image
  image: openproject/openproject:${TAG:-15-slim}  # 使用的鏡像,預設為15-slim版本

# 定義基本應用配置,所有OpenProject服務都會繼承這個配置
x-op-app: &app
  <<: [*image, *restart_policy]  # 引用前面定義的image和restart_policy
  environment:
    # HTTPS相關設置
    OPENPROJECT_HTTPS: "${OPENPROJECT_HTTPS:-false}"  # 是否啟用HTTPS,預設為true
    OPENPROJECT_HOST__NAME: "${OPENPROJECT_HOST__NAME:-localhost:3535}"  # 主機名,已修改為3535端口
    OPENPROJECT_HSTS: "${OPENPROJECT_HSTS:-true}"  # HTTP嚴格傳輸安全,預設啟用
    
    # 緩存和資料庫設置
    RAILS_CACHE_STORE: "memcache"  # 使用memcached作為緩存
    OPENPROJECT_CACHE__MEMCACHE__SERVER: "cache:11211"  # memcached服務地址和端口
    OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"  # 相對URL根路徑,如果部署在子路徑
    DATABASE_URL: "${DATABASE_URL:-postgres://postgres:p4ssw0rd@db/openproject?pool=20&encoding=unicode&reconnect=true}"  # 資料庫連接URL
    
    # 執行緒配置
    RAILS_MIN_THREADS: ${RAILS_MIN_THREADS:-4}  # 最小執行緒數
    RAILS_MAX_THREADS: ${RAILS_MAX_THREADS:-16}  # 最大執行緒數
    
    # 郵件設置
    IMAP_ENABLED: "${IMAP_ENABLED:-false}"  # 是否啟用郵件接收功能,預設關閉
  
  volumes:
    - "${OPDATA:-opdata}:/var/openproject/assets"  # 掛載資產存儲卷

# 定義具體服務
services:
  # PostgreSQL 資料庫服務
  db:
    image: postgres:13  # 使用PostgreSQL 13版本
    <<: *restart_policy
    stop_grace_period: "3s"  # 優雅停止時間
    volumes:
      - "${PGDATA:-pgdata}:/var/lib/postgresql/data"  # 掛載資料庫數據卷
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-p4ssw0rd}  # 資料庫密碼
      POSTGRES_DB: openproject  # 資料庫名稱
    networks:
      - backend  # 連接到後端網絡

  # Memcached 緩存服務
  cache:
    image: memcached
    <<: *restart_policy
    networks:
      - backend

  # Nginx代理服務
  proxy:
    build:
      context: ./proxy
      args:
        APP_HOST: web  # 指定應用主機為web服務
    image: openproject/proxy
    <<: *restart_policy
    ports:
      - "${PORT:-3535}:80"  # 將容器的80端口映射到主機的3535端口,已修改
    depends_on:
      - web  # 依賴web服務
    networks:
      - frontend  # 連接到前端網絡

  # OpenProject Web服務
  web:
    <<: *app
    command: "./docker/prod/web"  # 啟動命令
    networks:
      - frontend  # 連接到前端網絡
      - backend   # 連接到後端網絡
    depends_on:
      - db
      - cache
      - seeder
    labels:
      - autoheal=true  # 啟用自動修復標籤
    healthcheck:  # 健康檢查配置
      test: ["CMD", "curl", "-f", "http://localhost:8080${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}/health_checks/default"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 30s

  # 自動修復服務,用於重啟不健康的容器
  autoheal:
    image: willfarrell/autoheal:1.2.0
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"  # 掛載Docker socket以控制容器
    environment:
      AUTOHEAL_CONTAINER_LABEL: autoheal  # 要監控的容器標籤
      AUTOHEAL_START_PERIOD: 600  # 啟動後等待時間(秒)
      AUTOHEAL_INTERVAL: 30  # 檢查間隔(秒)

  # 後台工作服務,處理異步任務
  worker:
    <<: *app
    command: "./docker/prod/worker"
    networks:
      - backend
    depends_on:
      - db
      - cache
      - seeder

  # 計劃任務服務,處理定時任務
  cron:
    <<: *app
    command: "./docker/prod/cron"
    networks:
      - backend
    depends_on:
      - db
      - cache
      - seeder

  # 資料填充服務,負責初始化資料
  seeder:
    <<: *app
    command: "./docker/prod/seeder"
    restart: on-failure  # 只在失敗時重啟
    networks:
      - backend




第三部分:登入 & 基本設定

Step 1:嘗試登入 - 無法登入

官方給的說明照著 docker-compose.yml 安裝後,啟動的預設帳號密碼都是 admin
會遇到無法登入的問題,這裡提供 2 種解法:

解法1 : 自己建立 admin 帳號
解法2 : 解決 volumn 錯誤,不應使用官方預設的值(編輯 .env 重裝整個過程)



Step 2:解法1 - 先建立帳號

在 WebUI 上,選擇建立帳號,建立一個 admin (可以自己定義)

Step 3:解法1 - 進入db容器

輸入以下進入資料庫

docker exec -it openproject_db_1 psql -U postgres -d openproject


Step 4:解法1 -查詢帳號是否存在

SQL 語法為以下,將 login 替換成自己剛剛建立的帳號

SELECT id, login, admin, status FROM users WHERE login = 'your_username';


這邊用 admin 建立,因此如下

SELECT id, login, admin, status FROM users WHERE login = 'admin';


查詢後可以看到,有剛剛建立的帳號

Step 5:解法1 - 更新帳號權限

SQL 語法為以下,將 login 替換成自己剛剛建立的帳號,這裡是將權權限提高

UPDATE users SET admin = true WHERE login = 'admin';



Step 6:解法1 - 啟用帳號

SQL 語法為以下,將 login 替換成自己剛剛建立的帳號,這裡是將啟用狀態設為啟用

UPDATE users SET status = 1 WHERE login = 'admin';


Step 7:解法1 - 退出 Docker Command Mode

最後退出編輯 SQL 模式

\q


Step 8:解法1 - 可以正常登入 & 設定語言

接著就可以從 WebUI 正常登入的,這種方式預設會提供選擇語言。但不提供導覽。
※視為已經有登入過

http://192.168.51.93:3535



Step 9:解法2 : 編輯 .env 檔案

解法2 移除所有容器重建,是另一種解法,一樣需編輯 .env 的檔案


可以看到以下的參數必須移除


移除後如下:

Step 10:解法2 : 編輯 .env 檔案

然後移除所有容器,再次重新啟動

docker-compose down
PORT=3535 OPENPROJECT_HTTPS=false docker-compose pull
PORT=3535 OPENPROJECT_HTTPS=false docker-compose up -d --build



Step 11:解法2 - 可以正常登入 & 導覽

接著就可以從 WebUI 正常登入的,強制第一次登入要更換密碼
原理是

http://192.168.51.93:3535



並且會提供首次使用的導覽說明

Step 12:登入問題參考解法

有很多人使用官方文件安裝,但無法正常登入,最終有反饋此解法