全球個案管理系統 (GCMS) - 生產環境上線計畫書
開篇說明
本文件為「全球個案管理系統 (Global Case Management System, GCMS)」首次導入八個國家的生產環境(Production)上線計畫書。其目的在於提供一份清晰、可執行的技術藍圖,確保系統上線過程的流暢、穩定與成功。本文將作為所有相關技術團隊在部署、遷移及驗收階段的共同執行依據,以達成專案既定目標。
📋 目錄
- 專案背景與上線目標
- 核心架構與導入策略
- 關鍵任務:舊資料遷移計畫
- 生產環境上線技術檢核清單
- 人員配置表
- 雲端資源架構與相互依賴說明
- 上線後測試計畫
- 關鍵里程碑與上線決策
- ⭐ 各職位上線查檢表
- 附錄 A:快速參考
1. 專案背景與上線目標
1.1 專案的戰略意義
GCMS 的導入,是慈濟全球個案管理數位化轉型的關鍵一步。本專案旨在建立一個統一、標準化的數位平台,用以取代傳統手工作業模式及各地分散的舊有系統。本次八國同步上線,是提升營運效率與資料品質的基石。
1.2 核心目標分析
- 系統穩定性 (System Stability):確保系統架構與資源配置能承受八國首波上線負載。
- 資料完整性 (Data Integrity):確保歷史個案資料正確無誤地遷移至新系統。
- 使用者就緒度 (User Readiness):確認各國種子成員及終端使用者完成操作培訓。
1.3 專案範疇總覽
| 項目 | 說明 |
|---|---|
| 系統名稱 | 全球個案管理系統 (Global Case Management System) |
| 首波導入國家 | 菲律賓、馬來西亞、尼泊爾、印度、美國、墨西哥、南非、莫三比克 |
| 支援語系 | 繁體中文、英文、西班牙文 |
1.4 過渡說明
下一章節將深入探討技術架構與分階段導入策略。
2. 核心架構與導入策略
2.1 架構與流程概述
GCMS 成功依賴穩健技術架構及分階段導入流程,引導各國團隊從啟動至全面推廣。
2.2 系統核心模組
- Vital CaseBridge (CB):個案管理流程核心引擎。
- Vital BizForm (BF):表單建立與資料收集模組。
2.3 導入流程
- 階段一:Kickoff 與導入訪談 (課程 0-1)
- 核心任務:確認各國導入需求,針對 CaseBridge 流程進行訪談。
- 階段二:系統設定與種子人員培訓 (課程 2-3.1)
- 核心任務:生產環境帳號授權與試用站台供裝,對「種子成員」進行系統教學。
- 階段三:資料盤點與遷移實作 (課程 3.2)
- 核心任務:整理歷史資料至標準 EXCEL,準備自動化遷移。
- 階段四:全面推廣與報表應用 (課程 4-5)
- 核心任務:全員操作教學與報表應用課程。
2.4 過渡說明
舊資料遷移是技術挑戰最高的環節,下一章將深入分析。
3. 關鍵任務:舊資料遷移計畫
3.1 遷移計畫的重要性
資料遷移風險最高,任何錯誤都可能影響個案服務。
3.2 遷移範圍
- 個案資料表
- 長期濟助申請單
- 臨時濟助申請單
- 訪視記錄單(暫不處理「提報」資料)
3.3 技術執行邏輯與規則
- 當地團隊整理舊資料至標準 EXCEL。
- 技術團隊透過 API 將資料寫入 Vital BizForm。
- 規則:所有使用者帳號須建立完成,否則資料無法匯入。
3.4 效能評估
- 10,000 個個案 × 4 張表單 × 3 次 API 呼叫 = 120,000 次 API Call
- 預計完成時間:約 12 小時
- 建議於離峰或維護時段執行。
3.5 過渡說明
下一章提供生產環境技術檢核清單。
4. 生產環境上線技術檢核清單
4.1 生產資源與設定清單(來源:/home/dennis_yin/tzuchiK8s)
| 項目 | 內容 | 來源 | 狀態 |
|---|---|---|---|
| 雲端資源命名 | AKS aks-uat-casebridge-japaneast、ACR acruatcasebridgejp、Storage stuatcasebridgejp、MySQL mysql-uat-casebridge-japaneast、Log log-uat-casebridge-japaneast、AGW agw-uat-casebridge-japaneast、Key Vault kv-uat-casebridge-japaneast | K8s-UAT/AzureScripts/rg-uat-casebridge-japaneast.md | [ ] |
| MySQL 連線 | Host mysql-uat-casebridge-japaneast.mysql.database.azure.com:3306、User mysqluatcb、DB vitalcasebridge、密碼 Secret CB_PLT_MYSQL_ROOT_SECRET;.NET 使用 DatabaseSettings__Server/Port/User/Password/Database,需啟用 Azure MySQL SSL 與 AKS 防火牆白名單 | K8s-UAT/Changelog.md;K8s-UAT/K8sScripts/base/casebridge-configmap.yaml | [ ] |
| Azure Blob 儲存 | 帳號 casereportstorage01、容器 casereport、SAS Secret CB_PLT_AZURE_BLOB_SAS_TOKEN;服務端環境變數 AZURE_BLOB_ACCOUNT、AZURE_BLOB_CONTAINER、AZURE_BLOB_SAS_TOKEN 或 AZURE_BLOB_CONNECTION_STRING(pettycash-service 支援 Connection String) | K8s-UAT/K8sScripts/base-backup-20251030-110804/apps-config.yaml;pettycash-service/README.md | [ ] |
| 核心 ConfigMap/Secret | ConfigMap:CB_PLT_CONFIG_SERVER_URL/LABEL/FAIL_FAST_ENABLED、CB_PLT_CONSUL_HOST/PORT/URL、CB_PLT_REDIS_HOST/PORT、CB_AUTH_JWT_ISSUER_URL、CB_AUTH_JWT_JWKS_URL、CB_AUTH_JWT_VALID_AUDIENCES、CB_OBS_LOGSTASH_HOST/PORT;Secret:CB_PLT_REDIS_SECRET、CB_AUTH_GATEWAY_PROVISIONING_SECRET、CB_AUTHN_OAUTH_CLIENT_ID/SECRET、CB_PLT_MYSQL_ROOT_SECRET、casebridge-authn-keypair | K8s-UAT/K8sScripts/k8s_env.md;K8s-UAT/K8sScripts/base/casebridge-secrets.yaml | [ ] |
| 應用服務額外設定 | Mail: CB_APP_MAIL_SENDGRID_SECRET;territory-service DatabaseSettings__* 對應 MySQL;報表/BizForm/Genogram/PettyCash 依賴 Consul + MySQL + Blob(與上列 ConfigMap/Secrets 對齊) | K8s-UAT/K8sScripts/k8s_env.md;服務 README | [ ] |
| 前端環境變數 | FRONTEND_NODE_ENV、FRONTEND_API_BASE_URL、FRONTEND_BIZFORM_URL、FRONTEND_TRUSTED_ORIGINS、FRONTEND_SSO_URL、FRONTEND_CLIENT_ID | K8s-UAT/K8sScripts/k8s_env.md | [ ] |
微服務資源依賴檢查:
| MicroService Name | MySQL | Blob | Redis | Image Name (ACR) |
|---|---|---|---|---|
| api-gateway | N | N | Y | acruatcasebridgejp.azurecr.io/casebridge/api-gateway:<tag> |
| authn-service | N | N | Y | acruatcasebridgejp.azurecr.io/casebridge/authn-service:<tag> |
| authp-service | Y | N | Y | acruatcasebridgejp.azurecr.io/casebridge/authp-service:<tag> |
| authz-service | N | N | Y | acruatcasebridgejp.azurecr.io/casebridge/authz-service:<tag> |
| blacklist-service | N | N | Y | acruatcasebridgejp.azurecr.io/casebridge/blacklist-service:<tag> |
| mail-service | N | N | N | acruatcasebridgejp.azurecr.io/casebridge/mail-service:<tag> |
| vital-bizform-service | TBD | TBD | N | acruatcasebridgejp.azurecr.io/casebridge/bizform-service:<tag> |
| genogram-service | TBD | TBD | N | acruatcasebridgejp.azurecr.io/casebridge/genogram-service:<tag> |
| territory-service | Y | N | N | acruatcasebridgejp.azurecr.io/casebridge/territory-service:<tag> |
| todo-service | TBD | N | N | acruatcasebridgejp.azurecr.io/casebridge/todo-service:<tag> |
| reporting-service (vitalbizformrptservice) | Y | Y | N | acruatcasebridgejp.azurecr.io/casebridge/reporting-service:<tag> |
| pettycash-service | TBD | Y | N | acruatcasebridgejp.azurecr.io/casebridge/pettycash-service:<tag> |
| tenant-service | Y | N | N | acruatcasebridgejp.azurecr.io/casebridge/tenant-service:<tag> |
| vital-casebridge-web (frontend) | N | N | N | acruatcasebridgejp.azurecr.io/casebridge/vital-casebridge-web:<tag> |
圖例:Y = 需要 (Yes),N = 不需要 (No),TBD = 待確認 (To Be Determined)
外部資源設定說明:
| 資源 | K8s ConfigMap/Secret | 服務環境變數範例 | 說明 |
|---|---|---|---|
| MySQL | ConfigMap: CB_PLT_MYSQL_HOST/PORT/USERNAME;Secret: CB_PLT_MYSQL_ROOT_SECRET(K8s-UAT/K8sScripts/base/casebridge-configmap.yaml, casebridge-secrets.yaml) | .NET: DatabaseSettings__Server/Port/User/Password/Database;Spring: MYSQL_HOST/PORT/USERNAME/PASSWORD(映射同鍵) | 需開啟 Azure MySQL SSL、將 AKS 出口列入防火牆;預設 DB vitalcasebridge。 |
| Blob Storage | ConfigMap: CB_PLT_AZURE_BLOB_ACCOUNT、CB_PLT_AZURE_BLOB_CONTAINER;Secret: CB_PLT_AZURE_BLOB_SAS_TOKEN(base-backup-20251030-110804/apps-config.yaml, casebridge-secrets.yaml) | .NET: AZURE_BLOB_ACCOUNT、AZURE_BLOB_CONTAINER、AZURE_BLOB_SAS_TOKEN 或 AZURE_BLOB_CONNECTION_STRING(pettycash-service 支援 ConnectionString) | 用 SAS Token 或 ConnectionString 二選一;容器預設 casereport,帳號 casereportstorage01。 |
| Redis | ConfigMap: CB_PLT_REDIS_HOST/PORT;Secret: CB_PLT_REDIS_SECRET(casebridge-config/casebridge-secrets) | Spring: REDIS_HOST、REDIS_PORT、REDIS_PASSWORD | 供 core 服務 (gateway/auth*/blacklist) 使用;密碼不可留空,確認與 credentials.json 一致。 |
4.2 基礎設施與權限申請 (Provisioning)
- 帳號中心申請:取得 Ingress 入口 IP (外對內呼叫服務) 找Matt申請
- 供裝中心申請:取得 Ingress 入口 IP (外對內呼叫服務) 找Matt申請
- 授權中心申請:取得 Egress 出口 IP (內對外呼叫服務) 找David設定
4.3 K8s 與環境配置 (Infrastructure as Code)
- YAML/壓模檔校核:Deployment CPU/Memory 限制符合負載預估
- ConfigMap & Secrets:確認語系資料庫連線字串與金鑰
- 環境一致性:Prod 與 QA 配置同步更新
4.4 CI/CD 與自動化流水線 (Pipeline)
- CICD 流水線測試:部署測試通過,可推播至全球叢集
- 部署腳本確認:Migration & 初始化腳本確認具等冪性
4.5 品質保證與驗收 (QA & Testing)
- Staging 壓力測試:模擬 120,000 次 API Call 並通過效能指標
- QA 驗收通過:功能、回歸及多國語系檢查完成
- 監控 & 日誌啟動:Grafana/Prometheus 與 ELK/Loki 已連線
4.6 資料保護與救援 (Backup & Recovery)
- 資料庫備份:正式上線前完成全量備份
- 維運文件更新:系統手冊、API 文件及 DR Plan 已更新
- 容器映像備份:所有 ACR 映像已備份至 tar 檔案
- 配置備份:credentials.json、env.json、K8s YAML 已納入版控
5. 人員配置表
5.1 核心團隊角色與職責
本次上線專案需要跨職能團隊協作,以下為建議的人員配置與職責分工:
專案管理層
| 角色 | 人數 | 職責 | 關鍵交付物 |
|---|---|---|---|
| 產品負責人 (PO) | 1 | 統籌專案進度、需求確認、UAT 驗收、業務優先級決策 | 專案計畫、週報、驗收標準、測試案例清單 |
技術團隊
| 角色 | 姓名 | 職責 | 關鍵技能需求 |
|---|---|---|---|
| Tech Leader | Neal | Azure 架構設計、容量規劃、技術決策 | Azure AKS, Istio, 微服務架構 |
| DevOps 工程師 | (待補充) | K8s 部署、CI/CD 建置、監控設定 | Kubernetes, Helm, Azure CLI, GitLab CI |
| 後端工程師 | Kevin, Ken, 又升, Peter | 微服務配置、資料遷移腳本、API 測試、資料庫管理 | Spring Boot, .NET Core, MySQL |
| 前端工程師 | Even | React 前端部署、環境變數配置 | React, Nginx, 環境配置 |
業務與訓練團隊
| 角色 | 人數 | 職責 |
|---|---|---|
| 各國種子成員 | 8-16 | 接受培訓、協助本地測試、回報問題 |
| 培訓講師 | 2 | 準備教材、執行線上/線下培訓 |
| 技術支援 | 1-2 | 上線期間 24 小時待命、處理緊急問題 |
5.2 上線前責任分配矩陣 (RACI)
| 任務 | PO | Tech Leader | DevOps | 後端 | 前端 |
|---|---|---|---|---|---|
| Azure 資源建立 | A | R | C | I | I |
| K8s 叢集部署 | A | R | R | C | C |
| 微服務配置 | A | C | R | R | C |
| 前端部署 | A | C | C | C | R |
| 資料庫遷移與管理 | A | C | I | R | I |
| SSL 憑證設定 | A | R | R | I | I |
| 監控與告警 | A | R | R | C | I |
| UAT 測試執行 | A/R | I | C | C | C |
| 教育訓練 | A/R | I | I | I | I |
| Go-Live 決策 | A | R | R | C | C |
RACI 圖例:
- R = Responsible (執行者):實際執行該任務的人
- A = Accountable (負責者):對任務結果負最終責任的人,每個任務只能有一個 A
- C = Consulted (諮詢者):在決策前需要諮詢意見的人,雙向溝通
- I = Informed (知會者):需要被告知進度或結果的人,單向溝通
5.3 上線期間值班表建議
第一週 (上線關鍵期)
1T+0 (上線日):
2 - 全體技術團隊現場或線上待命
3 - 技術支援 24 小時輪班 (3 班制)
4
5T+1 到 T+3:
6 - DevOps + DBA 核心值班
7 - 其他團隊 on-call 支援
8
9T+4 到 T+7:
10 - 技術支援正常值班
11 - 監控告警自動化6. 雲端資源架構與相互依賴說明
6.1 整體架構概覽
CaseBridge 生產環境採用 Azure 雲端平台,部署於 Japan East 區域。
核心架構圖 (Mermaid)
6.2 資源清單與依賴關係
Azure 基礎資源
| 資源名稱 | 資源類型 | SKU/規格 | 用途 | 依賴 |
|---|---|---|---|---|
rg-prod-casebridge-japaneast | Resource Group | - | 所有資源的邏輯容器 | - |
pip-prod-casebridge-japaneast | Static Public IP | Standard | AKS Ingress 入口 | - |
aks-prod-casebridge-japaneast | AKS Cluster | Standard_D2as_v5 × 2 nodes | Kubernetes 運行環境 | Public IP |
acrprodcasebridgejp | Container Registry | Standard | Docker 映像儲存 | - |
mysql-prod-casebridge-japaneast | Azure MySQL | Flexible Server | 業務資料庫 | AKS 網路白名單 |
stprodcasebridgejp | Storage Account | Standard_LRS | 報表與檔案儲存 | - |
eh-prod-casebridge-japaneast | Event Hubs Namespace | Standard | Kafka 訊息佇列 (可選) | - |
微服務資源依賴矩陣
| 服務名稱 | MySQL | Blob | Redis | SSO | Logstash | ACR 映像 |
|---|---|---|---|---|---|---|
| api-gateway | ❌ | ❌ | ✅ | ❌ | ✅ | casebridge/api-gateway |
| authn-service | ❌ | ❌ | ✅ | ✅ | ✅ | casebridge/authn-service |
| authp-service | ✅ | ❌ | ✅ | ❌ | ✅ | casebridge/authp-service |
| authz-service | ❌ | ❌ | ✅ | ❌ | ✅ | casebridge/authz-service |
| blacklist-service | ❌ | ❌ | ✅ | ❌ | ✅ | casebridge/blacklist-service |
| mail-service | ❌ | ❌ | ❌ | ❌ | ✅ | casebridge/mail-service |
| territory-service | ✅ | ❌ | ❌ | ❌ | ✅ | casebridge/territory-service |
| vital-bizform-service | ✅ | ✅ | ❌ | ❌ | ✅ | casebridge/bizform-service |
| genogram-service | ✅ | ✅ | ❌ | ❌ | ✅ | casebridge/genogram-service |
| reporting-service | ✅ | ✅ | ❌ | ❌ | ✅ | casebridge/reporting-service |
| pettycash-service | ✅ | ✅ | ❌ | ❌ | ✅ | casebridge/pettycash-service |
| todo-service | ✅ | ❌ | ❌ | ❌ | ✅ | casebridge/todo-service |
| tenant-service | ✅ | ❌ | ❌ | ❌ | ✅ | casebridge/tenant-service |
| vital-casebridge-web | ❌ | ❌ | ❌ | ✅ | ❌ | casebridge/vital-casebridge-web |
資源依賴圖例:
- ✅ = 需要 (Required):該服務必須連接此資源才能正常運作
- ❌ = 不需要 (Not Required):該服務不依賴此資源
6.3 關鍵配置項目
MySQL 連線配置
1主機: mysql-prod-casebridge-japaneast.mysql.database.azure.com
2埠號: 3306
3用戶: mysqluatcb
4資料庫: vitalcasebridge
5SSL: 必須啟用
6防火牆: 需將 AKS 節點 IP 加入白名單使用此資源的服務:authp, territory, bizform, genogram, reporting, pettycash, todo, tenant
Azure Blob Storage 配置
1帳號名稱: stprodcasebridgejp
2容器名稱: casereport
3端點: https://stprodcasebridgejp.blob.core.windows.net/
4認證方式: SAS Token 或 Connection String
5SAS 有效期: 2035-12-23使用此資源的服務:reporting, pettycash, bizform, genogram
Redis 配置
1類型: K8s StatefulSet (非 Azure Cache)
2服務名稱: auth-redis.casebridge.svc.cluster.local
3埠號: 6379
4持久化: 使用 PVC
5密碼: 存於 K8s Secret (CB_PLT_REDIS_SECRET)使用此資源的服務:api-gateway, authn, authp, authz, blacklist
Logstash 日誌收集
1Namespace: observability
2服務名稱: logstash.observability.svc.cluster.local
3埠號: 5044
4用途: 集中式日誌收集使用此資源的服務:所有微服務 (除 Frontend)
6.4 外部服務依賴
SSO 帳號中心
1SSO URL: https://member.gsscloud.com
2依賴服務: authn-service, vital-casebridge-web
3用途: 單一登入認證
4網路需求: AKS 需要能存取外網Let's Encrypt 憑證
1發證機構: Let's Encrypt (透過 cert-manager)
2Issuer: letsencrypt-prod
3憑證類型: TLS/SSL (HTTPS)
4自動更新: cert-manager 管理
5網路需求: AKS 需要能存取 Let's Encrypt ACME API6.5 啟動順序依賴
為確保服務正常啟動,建議依照以下順序:
7. 上線後測試計畫
7.1 測試階段規劃
7.2 煙霧測試 (Smoke Test) - T+0 立即執行
目的
確認所有關鍵服務已成功啟動並可正常回應。
測試步驟
Step 1: 檢查 Pod 狀態
1# 所有 Pod 應為 Running 狀態
2kubectl get pods -n casebridge
3
4# 預期結果:所有 Pod STATUS = Running,READY = 1/1 或 2/2Step 2: 檢查服務端點
1# 檢查 Istio Gateway 是否取得 External IP
2kubectl get svc -n casebridge istio-ingressgateway
3
4# 預期結果:EXTERNAL-IP 欄位顯示 4.189.160.191Step 3: 測試 API Gateway 健康檢查
1curl -k https://cbuat.vitalcb.com/api/actuator/health
2
3# 預期回應:{"status":"UP"}Step 4: 測試前端頁面
1# 在瀏覽器開啟
2https://cbuat.vitalcb.com
3
4# 預期結果:正常顯示登入畫面,無 SSL 憑證錯誤Step 5: 測試登入功能
1. 使用測試帳號登入
2. 確認可成功導向至 Dashboard
3. 檢查 JWT Token 是否正確核發驗收標準
- ✅ 所有 Pod 處於 Running 狀態
- ✅ API Gateway 回應 HTTP 200
- ✅ 前端頁面可正常載入
- ✅ 登入功能正常運作
7.3 健康檢查 (Health Check) - T+0
Spring Boot Actuator 端點檢查
1# 定義服務列表
2SERVICES=("api-gateway" "authn-service" "authp-service" "authz-service" \
3 "blacklist-service" "mail-service" "territory-service")
4
5# 檢查每個服務的健康狀態
6for svc in "${SERVICES[@]}"; do
7 echo "Checking $svc..."
8 kubectl exec -n casebridge deploy/$svc -- \
9 curl -s http://localhost:8080/actuator/health | jq '.status'
10done
11
12# 預期結果:所有服務回應 "UP"資料庫連線檢查
1# 從任一需要 MySQL 的 Pod 測試連線
2kubectl exec -it -n casebridge deploy/authp-service -- bash
3
4# 在 Pod 內執行
5mysql -h mysql-prod-casebridge-japaneast.mysql.database.azure.com \
6 -u mysqluatcb -p \
7 -e "SELECT 1;"
8
9# 預期結果:成功連線並返回結果Blob Storage 連線檢查
1# 檢查 reporting-service 的 Blob 連線
2kubectl logs -n casebridge deploy/reporting-service --tail=50 | grep -i blob
3
4# 預期結果:無連線錯誤或認證失敗訊息7.4 核心功能測試 - T+0 到 T+1
測試案例清單
| 編號 | 測試項目 | 測試方法 | 負責人 | 預期結果 |
|---|---|---|---|---|
| TC-001 | 使用者註冊 | 手動測試 | QA | 可成功建立新帳號 |
| TC-002 | 使用者登入 (本地帳號) | 手動測試 | QA | 可成功登入並取得 Token |
| TC-003 | SSO 登入 | 手動測試 | QA | 可導向 SSO 並回登 |
| TC-004 | 個案建立 | 手動測試 | 種子成員 | 可建立新個案 |
| TC-005 | 長期濟助申請 | 手動測試 | 種子成員 | 可填寫並送出表單 |
| TC-006 | 臨時濟助申請 | 手動測試 | 種子成員 | 可填寫並送出表單 |
| TC-007 | 訪視記錄 | 手動測試 | 種子成員 | 可新增訪視記錄 |
| TC-008 | 報表產生 | 手動測試 | QA | 可產生並下載 PDF |
| TC-009 | 家系圖繪製 | 手動測試 | QA | 可正常繪製家系圖 |
| TC-010 | 郵件發送 | API 測試 | DevOps | Mail Service 正常運作 |
| TC-011 | 權限控制 | 手動測試 | QA | 不同角色有正確權限 |
| TC-012 | 多語系切換 | 手動測試 | QA | 繁中/英文/西文正常 |
API 自動化測試 (Postman Collection)
1# 執行 Postman Collection (假設已準備)
2newman run CaseBridge_Production_Tests.postman_collection.json \
3 --environment Production.postman_environment.json \
4 --reporters cli,json \
5 --reporter-json-export test-results.json
6
7# 預期結果:所有測試案例 PASS7.5 效能與壓力測試 - T+1
API 壓力測試
使用 K6 進行負載測試:
1// load-test.js
2import http from 'k6/http';
3import { check, sleep } from 'k6';
4
5export let options = {
6 stages: [
7 { duration: '2m', target: 50 }, // 模擬 50 併發用戶
8 { duration: '5m', target: 50 }, // 維持 5 分鐘
9 { duration: '2m', target: 100 }, // 提升到 100 用戶
10 { duration: '3m', target: 100 }, // 維持 3 分鐘
11 { duration: '2m', target: 0 }, // 下降到 0
12 ],
13 thresholds: {
14 http_req_duration: ['p(95)<2000'], // 95% 請求 < 2 秒
15 http_req_failed: ['rate<0.01'], // 錯誤率 < 1%
16 },
17};
18
19export default function () {
20 let res = http.get('https://cbuat.vitalcb.com/api/actuator/health');
21 check(res, {
22 'status is 200': (r) => r.status === 200,
23 });
24 sleep(1);
25}執行測試:
1k6 run load-test.js
2
3# 驗收標準:
4# - P95 回應時間 < 2 秒
5# - 錯誤率 < 1%
6# - 無記憶體洩漏或 CPU 過載資料遷移效能測試
1# 模擬 10,000 筆個案資料匯入
2# (實際腳本由後端團隊提供)
3python3 data_migration_test.py \
4 --records 10000 \
5 --batch-size 100 \
6 --api-endpoint https://cbuat.vitalcb.com/api
7
8# 監控指標:
9watch -n 5 'kubectl top pods -n casebridge'
10
11# 預期結果:
12# - 匯入速率 > 100 筆/分鐘
13# - Pod CPU < 80%
14# - Pod Memory < 85%7.6 各國 UAT 驗收 - T+1 到 T+7
驗收流程
各國驗收清單
| 國家 | 種子成員 | 測試環境 | 狀態 | 簽核日期 |
|---|---|---|---|---|
| 菲律賓 | 2 人 | Production | ⬜ 待測試 | |
| 馬來西亞 | 2 人 | Production | ⬜ 待測試 | |
| 尼泊爾 | 2 人 | Production | ⬜ 待測試 | |
| 印度 | 2 人 | Production | ⬜ 待測試 | |
| 美國 | 2 人 | Production | ⬜ 待測試 | |
| 墨西哥 | 2 人 | Production | ⬜ 待測試 | |
| 南非 | 2 人 | Production | ⬜ 待測試 | |
| 莫三比克 | 2 人 | Production | ⬜ 待測試 |
7.7 監控與告警驗證 - T+2
測試 Prometheus 告警
1# 故意觸發高 CPU 告警
2kubectl exec -it -n casebridge deploy/api-gateway -- \
3 stress --cpu 4 --timeout 60s
4
5# 確認告警是否觸發
6# 檢查 Azure Monitor 或 Prometheus Alertmanager
7
8# 預期結果:在 2 分鐘內收到告警通知測試日誌收集
1# 產生測試錯誤日誌
2kubectl exec -n casebridge deploy/mail-service -- \
3 curl -X POST http://localhost:8098/test/error
4
5# 檢查 Logstash 是否收到
6kubectl logs -n observability deploy/logstash --tail=100 | grep ERROR
7
8# 預期結果:可在 Logstash 看到錯誤日誌7.8 災難復原演練 - T+5 (選擇性)
模擬 Pod 故障
1# 刪除 authn-service Pod
2kubectl delete pod -n casebridge -l app=authn-service
3
4# 觀察自動重啟
5watch kubectl get pods -n casebridge
6
7# 預期結果:
8# - Pod 在 30 秒內自動重建
9# - 服務持續可用 (因有多個副本)模擬資料庫連線中斷
1# 暫時封鎖 MySQL 連線 (修改 NSG 或防火牆規則)
2az mysql flexible-server firewall-rule delete \
3 --resource-group rg-prod-casebridge-japaneast \
4 --name mysql-prod-casebridge-japaneast \
5 --rule-name AllowAKS
6
7# 觀察服務行為
8kubectl logs -f -n casebridge deploy/authp-service
9
10# 恢復連線
11az mysql flexible-server firewall-rule create \
12 --resource-group rg-prod-casebridge-japaneast \
13 --name mysql-prod-casebridge-japaneast \
14 --rule-name AllowAKS \
15 --start-ip-address <AKS_NODE_IP> \
16 --end-ip-address <AKS_NODE_IP>
17
18# 預期結果:
19# - 服務自動重連
20# - 錯誤日誌正確記錄7.9 測試完成標準
Go-Live 檢核表
- 煙霧測試:100% 通過
- 健康檢查:所有服務回應 UP
- 核心功能測試:TC-001 到 TC-012 全部 PASS
- 效能測試:P95 < 2 秒,錯誤率 < 1%
- 各國 UAT:至少 6/8 國家完成驗收
- 監控告警:告警機制運作正常
- 文件交付:運維手冊、API 文件已更新
- 備份驗證:資料庫備份與還原測試成功
問題嚴重度分級
| 等級 | 定義 | 範例 | 處理時限 |
|---|---|---|---|
| P0 - 致命 | 系統完全無法使用 | 無法登入、資料庫損毀 | 立即處理 |
| P1 - 嚴重 | 核心功能失效 | 無法建立個案、報表產生失敗 | 4 小時內 |
| P2 - 一般 | 非核心功能異常 | UI 顯示錯誤、效能緩慢 | 24 小時內 |
| P3 - 輕微 | 可接受的小問題 | 文字錯誤、樣式調整 | 下個版本 |
問題嚴重度圖例:
- P0 = Priority 0 (致命):系統完全無法使用,必須立即處理
- P1 = Priority 1 (嚴重):核心功能失效,4 小時內必須修復
- P2 = Priority 2 (一般):非核心功能異常,24 小時內修復
- P3 = Priority 3 (輕微):可接受的小問題,可排入下個版本處理
8. 關鍵里程碑與上線決策
8.1 里程碑評估說明
專案成熟度需透過里程碑衡量,作為 Go/No-Go 上線決策依據。
8.2 上線前里程碑
8.3 核心里程碑與驗收標準
| 里程碑 | 驗收標準 | 負責人 | 預計完成 |
|---|---|---|---|
| M1: Azure 資源就緒 | AKS, ACR, MySQL, Blob 全部建立;網路白名單設定完成 | 系統架構師 | T-4 週 |
| M2: 基礎設施部署 | cert-manager, Istio 安裝;ClusterIssuer 運作正常 | DevOps | T-3 週 |
| M3: 微服務部署完成 | 所有 23 個 Pod Running;健康檢查全部 UP | DevOps | T-2 週 |
| M4: 整合測試通過 | API 自動化測試通過;核心功能測試完成 | QA | T-10 天 |
| M5: 效能測試達標 | P95 < 2 秒;併發 100 用戶無錯誤 | QA + DevOps | T-7 天 |
| M6: UAT 驗收 | 至少 6/8 國家完成驗收;P0/P1 問題清零 | PO + 種子成員 | T-3 天 |
| M7: 資料遷移測試 | 測試環境遷移成功;回滾機制驗證 | DBA + 後端 | T-2 天 |
| M8: Go-Live 決策 | 技術檢核表 100% 完成;風險可控 | PM + 架構師 | T-1 天 |
8.4 Go / No-Go 決策機制
Go-Live 決策會議 (T-3 天)
參與人員:
- 產品負責人 (PO) - 主持
- Tech Leader (Neal)
- DevOps Lead
- 後端工程師代表
- 前端工程師 (Even)
決策依據:
| 評估項目 | Go 條件 | 當前狀態 | 評分 (1-5) |
|---|---|---|---|
| 技術就緒度 | 所有技術檢核項 > 95% 完成 | ⬜ | |
| 功能完整性 | 核心功能測試 100% PASS | ⬜ | |
| 效能達標 | 壓力測試符合 SLA | ⬜ | |
| UAT 驗收 | > 75% 國家完成驗收 | ⬜ | |
| P0/P1 問題 | 零 P0,P1 < 3 個 | ⬜ | |
| 團隊準備度 | 24 小時值班機制建立 | ⬜ | |
| 備份機制 | 資料庫與配置備份完成 | ⬜ | |
| 回滾計畫 | 回滾腳本測試通過 | ⬜ |
決策規則:
- 總分 ≥ 35/40 且無 P0 問題 → GO
- 總分 30-34 → 條件式 GO (需緩解計畫)
- 總分 < 30 或有 P0 問題 → NO-GO (延期)
緊急回滾機制
1觸發條件:
2 - P0 問題持續 > 2 小時無法解決
3 - 錯誤率 > 10%
4 - 資料完整性受損
5
6回滾步驟:
7 1. 通知所有利害關係人
8 2. 停止所有新流量導入
9 3. 回滾 K8s Deployment 到前一版本
10 4. 恢復資料庫備份 (如需要)
11 5. 驗證回滾成功
12
13回滾時限: < 30 分鐘8.5 上線後持續改進
每日站立會議 (T+0 到 T+7)
1時間: 每日 09:00 與 17:00 (兩次)
2參與: PO、Tech Leader (Neal)、DevOps、後端團隊 (Kevin, Ken, 又升, Peter)、前端 (Even)
3議程:
4 - 過去 12 小時系統狀況
5 - 問題追蹤與解決進度
6 - 今日重點工作
7 - 風險與升級事項
8持續時間: 15 分鐘第一週運營檢討 (T+7)
檢討重點:
- 實際 vs 預期效能對比
- 使用者回饋彙整
- 問題根因分析
- 成本分析
- 下階段優化計畫
8.6 結語
本計畫書從系統架構師角度,完整涵蓋了全球個案管理系統 (GCMS) 八國同步上線的所有關鍵要素:
✅ 技術基礎:詳細的系統查檢表與 K8s 配置清單
✅ 人員組織:明確的角色職責與 RACI 矩陣
✅ 架構透明:雲端資源架構圖與服務依賴關系
✅ 品質保證:完整的上線後測試計畫與驗收標準
✅ 風險管理:Go/No-Go 決策機制與回滾計畫
透過此框架,確保 GCMS 上線過程可控、可測、可追溯,為八國慈濟志工提供穩定可靠的數位化服務平台。
9. 各職位上線查檢表
9.0 查檢表使用說明
本章節為每個職位提供專屬的上線前查檢表,每個查檢表都基於:
- RACI 矩陣 (第 5.2 節) 的責任分配
- 技術檢核清單 (第 4 章) 的技術項目
- 測試計畫 (第 7 章) 的驗證標準
📌 使用建議:
- 各職位應於 T-7 日開始執行查檢
- 每日站立會議中同步進度
- T-3 日前完成所有項目
- 在 Go/No-Go 決策會議中報告完成狀況
9.1 產品負責人 (PO) 上線查檢表
專案管理與決策
- 確認上線時程與里程碑 (T-14)
- 完成風險評估與登記簿 (T-10)
- 確認 Go/No-Go 決策標準 (T-7)
- 準備 Go/No-Go 決策會議資料 (T-3)
- 主持 Go/No-Go 決策會議 (T-3)
UAT 與驗收管理
- 定義 UAT 驗收標準 (T-14)
- 準備測試案例清單 (TC-001 到 TC-012) (T-10)
- 確認各國種子成員名單 (T-10)
- 追蹤各國 UAT 執行進度 (T+1 to T+7)
- 審核 UAT 問題報告與優先級 (T+1 to T+7)
- 簽核各國驗收報告 (T+7)
溝通與利害關係人管理
- 完成上線溝通計畫 (T-14)
- 通知各國種子成員上線時程 (T-10)
- 確認 24 小時支援聯絡管道 (T-7)
- 準備上線公告與使用者通知 (T-3)
- 發布上線公告 (T+0)
教育訓練管理
- 確認培訓教材完成度 (T-14)
- 審核種子成員培訓成果 (T-7)
- 確認全員培訓認證狀態 (T-3)
上線後持續改進
- 主持每日站立會議 (T+0 to T+7)
- 追蹤問題解決進度 (T+0 to T+7)
- 主持第一週運營檢討會議 (T+7)
9.2 Tech Leader (Neal) 上線查檢表
架構與設計審核
- 審核 Azure 資源架構設計 (M1) (T-28)
- 確認容量規劃與資源評估 (T-21)
- 審核微服務依賴矩陣 (第 6.2 節) (T-14)
- 確認啟動順序依賴 (第 6.5 節) (T-14)
- 驗證系統架構圖正確性 (T-10)
技術風險與安全
- 執行技術風險評估 (T-14)
- 審核安全性與合規檢查 (T-10)
- 網路安全策略 (Network Policies)
- Istio mTLS 配置
- Secret 管理機制
- 確認 SSL/TLS 憑證管理機制 (T-7)
- 審核災難復原計畫 (DR Plan) (T-7)
技術文件審核
- 審核 K8s 部署文件 (InstallationGuide.md) (T-10)
- 審核 API 文件完整性 (T-7)
- 審核系統手冊與運維文件 (T-7)
- 確認技術文件版本一致性 (T-3)
效能與容量驗證
- 審核效能測試結果 (P95 < 2s) (M5) (T-7)
- 確認資源使用率在合理範圍 (60-80%) (T-7)
- 審核資料遷移效能測試 (T-7)
Go/No-Go 決策參與
- 準備技術就緒度報告 (T-3)
- 參與 Go/No-Go 決策會議 (T-3)
- 提供技術風險評估意見 (T-3)
上線支援
- 上線當日現場支援 (T+0)
- 參與每日站立會議 (T+0 to T+7)
- 提供技術問題解決方案 (T+0 to T+7)
9.3 DevOps 工程師上線查檢表
K8s 叢集準備 (M2-M3)
- AKS 叢集健康檢查 (T-14)
bash
1kubectl get nodes 2kubectl get pods --all-namespaces 3kubectl top nodes - 確認 Node 規格與數量 (2 × Standard_D2as_v5) (T-14)
- 驗證 Node Autoscaler 配置 (Min=2, Max=6) (T-14)
基礎設施部署
- 安裝 cert-manager (v1.13.2) -
01-install-crds.sh(T-21) - 安裝 Istio Service Mesh -
01-install-crds.sh(T-21) - 部署 ClusterIssuer (Let's Encrypt) -
04-setup-certs.sh(T-14) - 驗證 Istio Gateway 配置 (T-14)
- 確認 External IP 繫定 (4.189.160.191) (T-14)
Secrets 與 ConfigMaps
- 準備
credentials.json(T-14) - 準備
env.json(T-14) - 執行
02-setup-secrets.sh validate(T-10) - 執行
02-setup-secrets.sh create-secrets(T-10) - 執行
03-generate-configs.sh render(T-10) - 驗證所有 Secrets 已建立:
bash
1kubectl get secret -n casebridge casebridge-core-secrets 2kubectl get secret -n casebridge casebridge-authn-keypair
微服務部署 (M3)
- 執行
05-deploy-apps.sh(T-10) - 確認所有 23 個 Pod 處於 Running 狀態 (T-7)
bash
1kubectl get pods -n casebridge | grep -v Running - 驗證 Pod Readiness Probe (T-7)
- 確認 PodDisruptionBudget 設定 (T-7)
監控與告警
- 部署 Logstash 日誌收集 (observability namespace) (T-14)
- 驗證日誌收集機制 (T-10)
bash
1kubectl logs -n observability deploy/logstash --tail=100 - 設定 Azure Monitor 或 Prometheus (T-10)
- 配置告警規則:
- Pod CrashLoopBackOff
- Node CPU > 80%
- Memory > 85%
- 測試告警通知機制 (T-7)
CI/CD Pipeline
- 驗證 GitLab CI/CD Pipeline (T-14)
- 測試 ACR 推送機制 (T-10)
- 確認部署腳本具等归性 (T-10)
- 測試滾動更新 (Rolling Update) (T-7)
備份與災難復原
- 設定 ETCD 備份機制 (T-10)
- 備份所有 K8s YAML 配置 (T-7)
- 備份
credentials.json和env.json(T-7) - 測試回滾程序 (T-7)
- 準備災難復原 Runbook (T-3)
上線支援
- 上線當日現場支援 (T+0)
- 執行煙霧測試 (T+0)
- 監控 Pod 狀態 (T+0 to T+7)
- 處理部署相關緊急問題 (T+0 to T+7)
9.4 後端工程師團隊 (Kevin, Ken, 又升, Peter) 上線查檢表
微服務配置審核
- 審核所有微服務 application.yml 配置 (T-14)
- 確認環境變數正確映射 (T-14)
-
CB_PLT_MYSQL_* -
CB_PLT_REDIS_* -
CB_OBS_LOGSTASH_* -
CB_AUTH_JWT_*
-
- 驗證 Spring Boot Profiles (prod) (T-10)
資料庫管理 (M7)
- Azure MySQL 防火牆白名單設定 (T-14)
bash
1az mysql flexible-server firewall-rule create \ 2 --resource-group rg-prod-casebridge-japaneast \ 3 --name mysql-prod-casebridge-japaneast \ 4 --rule-name AllowAKS \ 5 --start-ip-address <AKS_NODE_IP> - 測試資料庫連線 (T-10)
bash
1mysql -h mysql-prod-casebridge-japaneast.mysql.database.azure.com \ 2 -u mysqluatcb -p -e "SELECT 1;" - 確認 SSL 連線啟用 (T-10)
- 審核資料庫 Schema 版本 (T-10)
- 執行資料庫備份 (T-3)
Blob Storage 配置
- 驗證 Blob Storage 連線 (T-10)
- 帳號:
stprodcasebridgejp - 容器:
casereport
- 帳號:
- 確認 SAS Token 或 Connection String 有效 (T-10)
- 測試檔案上傳/下載 (T-7)
- 驗證 reporting-service Blob 連線 (T-7)
- 驗證 pettycash-service Blob 連線 (T-7)
API 測試與驗證
- 執行 Spring Boot Actuator 健康檢查 (T-7)
bash
1for svc in api-gateway authn-service authp-service; do 2 kubectl exec -n casebridge deploy/$svc -- \ 3 curl -s http://localhost:8080/actuator/health 4done - 測試核心 API 端點 (T-7)
- 執行 Postman Collection 自動化測試 (T-5)
- 驗證 JWT Token 簽發與驗證 (T-5)
資料遷移準備
- 準備資料遷移腳本 (T-14)
- 驗證資料遷移腳本 (測試環境) (M7) (T-10)
- 確認所有使用者帳號已建立 (T-5)
- 準備 10,000 筆個案測試資料 (T-5)
- 執行資料遷移效能測試 (T-5)
- 準備回滾腳本 (T-3)
- 執行正式資料遷移 (T-1)
效能測試 (M5)
- 執行 API 壓力測試 (K6) (T-7)
- 驗證 P95 回應時間 < 2s (T-7)
- 驗證錯誤率 < 1% (T-7)
- 監控 Pod 資源使用 (CPU/Memory) (T-7)
上線支援
- 執行資料庫連線檢查 (T+0)
- 監控微服務日誌 (T+0 to T+7)
- [ ]處理 API 相關問題 (T+0 to T+7)
- 處理資料庫相關問題 (T+0 to T+7)
9.5 前端工程師 (Even) 上線查檢表
React 應用建置
- 確認 Production 建置成功 (T-10)
bash
1npm run build - 驗證建置產物大小合理 (T-10)
- 測試應用啟動時間 (T-7)
環境變數配置
- 確認
FRONTEND_NODE_ENV=production(T-10) - 確認
FRONTEND_API_BASE_URL=https://cbuat.vitalcb.com/api(T-10) - 確認
FRONTEND_BIZFORM_URL(T-10) - 確認
FRONTEND_SSO_URL=https://member.gsscloud.com(T-10) - 確認
FRONTEND_CLIENT_ID(T-10) - 確認
FRONTEND_TRUSTED_ORIGINS(T-10)
SSO 整合測試
- 測試 SSO 登入流程 (T-7)
- 驗證 SSO 回登 (Callback) (T-7)
- 測試 SSO 登出功能 (T-7)
- 驗證 Token Refresh 機制 (T-7)
功能測試
- 測試多語系切換 (繁中/英文/西文) (T-7)
- 測試核心功能頁面:
- Dashboard
- 個案建立
- 表單填寫
- 報表查看
- 驗證權限控制顯示 (T-7)
瀏覽器相容性
- Chrome 測試 (T-7)
- Firefox 測試 (T-7)
- Safari 測試 (T-7)
- Edge 測試 (T-7)
- 移動端響應式測試 (T-7)
效能優化驗證
- Lighthouse 效能評分 > 80 (T-7)
- 首次內容繪製 (FCP) < 2s (T-7)
- 最大內容繪製 (LCP) < 2.5s (T-7)
- 縯積布局偏移 (CLS) < 0.1 (T-7)
上線支援
- 測試前端頁面載入 (T+0)
- 監控瀏覽器 Console 錯誤 (T+0 to T+7)
- 處理 UI 相關問題 (T+0 to T+7)
9.6 各國種子成員上線查檢表
系統培訓
- 完成課程 0-1: Kickoff 與導入訪談 (T-60)
- 完成課程 2-3.1: 系統設定與培訓 (T-45)
- 完成課程 3.2: 資料盤點與遷移 (T-30)
- 完成課程 4-5: 全面推廣與報表應用 (T-14)
- 通過培訓認證 (T-10)
測試環境準備
- 取得測試帳號 (T-14)
- 確認可登入系統 (T-14)
- 熟悉系統界面 (T-10)
- 學習基本操作流程 (T-10)
UAT 測試執行 (M6)
- 測試使用者註冊 (TC-001) (T+1)
- 測試登入功能 (TC-002, TC-003) (T+1)
- 測試個案建立 (TC-004) (T+2)
- 測試長期濟助申請 (TC-005) (T+2)
- 測試臨時濟助申請 (TC-006) (T+3)
- 測試訪視記錄 (TC-007) (T+3)
- 測試報表產生 (TC-008) (T+4)
- 測試多語系切換 (TC-012) (T+4)
本地化測試
- 測試語系顯示正確 (T+2)
- 測試時區設定 (T+2)
- 測試日期格式 (T+2)
- 測試貨幣格式 (如適用) (T+2)
問題回報
- 了解問題回報管道 (T-7)
- 了解問題嚴重度分級 (P0-P3) (T-7)
- 執行問題回報 (T+1 to T+7)
- 追蹤問題解決進度 (T+1 to T+7)
驗收簽核
- 完成 UAT 驗收測試 (T+7)
- 提交驗收報告 (T+7)
- 簽核驗收通過 (T+7)
上線後支援
- 確認 24 小時支援聯絡方式 (T-3)
- 參與上線後問題處理 (T+0 to T+7)
- 協助本地使用者培訓 (T+7 onwards)
附錄 A:快速參考
A.1 重要聯絡資訊
| 角色 | 姓名 | 聯絡方式 | 備註 |
|---|---|---|---|
| 產品負責人 (PO) | [待填] | 專案總協調、需求與驗收 | |
| Tech Leader | Neal | 技術決策與架構 | |
| DevOps Lead | [待填] | K8s 部署 | |
| 後端工程師 | Kevin, Ken, 又升, Peter | 微服務開發與資料庫 | |
| 前端工程師 | Even | React 前端開發 | |
| 24 小時值班專線 | [待填] | 緊急支援 |
A.2 重要連結
| 資源 | URL / 路徑 |
|---|---|
| Production URL | https://cbuat.vitalcb.com |
| Azure Portal | https://portal.azure.com |
| GitLab Repository | [待填] |
| 監控 Dashboard | [待填] |
| 文件庫 | K8s-Production/ |
A.3 緊急應變程序
文檔版本:v2.2
最後更新:2025-12-30
下次審核:上線完成後 7 天
文件擁有者:Tech Leader (Neal)
審核者:產品負責人 (PO)、DevOps Lead、後端工程師團隊