專案

一般

配置概況

動作

Bug #1419

已結束

Bug #1343: [Branch] 華城充電樁 FINISHING 後未送 StatusNotification(Available),導致 connector 卡住無法充電 (FINISHING timeout fallback 修補)

[DevOps] EXPO ems_branch 獨立 conf 與 RabbitMQ 認證修正

是由 陳國瑋 於 約 2 個月 前加入. 於 約 2 個月 前更新.

狀態:
Closed
優先權:
High
被分派者:
開始日期:
2026-08-10
完成日期:
預估工時:

概述

背景

#1418 部署至 EXPO 後,ems_branch 以 conf/openclaw 建置,並使用遠端 RabbitMQ 的 guest 帳號登入。Broker 回覆 ACCESS_REFUSED,使 connector.events 無法發布,HQ WebSocket/LIFF 後續即時狀態可能中斷。

目標

  • 新增 EXPO 專用 java/ems_branch/conf/expo profile。
  • 以現行 conf/ken 為基準複製設定與檔案,逐項改為 EXPO 對應值。
  • RabbitMQ 使用 EXPO 可合法登入的專用設定,不再依賴遠端 guest/guest。
  • 確認 Branch、HQ、RabbitMQ、OCPP 與 LIFF 的環境對應一致。
  • 禁止把新的密碼或 secret 寫入文件、Redmine note、測試目錄或 terminal output。

驗收方向

  • -Ddeploy.target=expo 可完成 ems_branch package。
  • EXPO 啟動後 RabbitMQ 不再出現 ACCESS_REFUSED。
  • connector.updated 可由 Branch publish、HQ consume,並推送 LIFF WebSocket。
  • OCPP 與既有充電流程不因 profile 拆分回歸。

是由 陳國瑋 於 約 2 個月 前更新

  • 狀態 從 New 變更為 In Progress

開始需求確認與 EXPO/Ken profile 差異盤點;實作前依 SOP 等待需求與規劃確認。

是由 陳國瑋 於 約 2 個月 前更新

完成初步 profile 差異盤點:

  • conf/ken 與 conf/openclaw 的 log4j2、RSA key、Gmail service account 檔案雜湊相同。
  • application.yml 的主要差異在 RabbitMQ:Ken 使用 RABBITMQ_* 可覆寫設定並預設為非 guest 帳號;openclaw 固定 guest/guest。
  • Ken profile 另有 message TTL、audit flag、local DB fallback 與較詳細 datasource proxy log。
  • 兩份 repository .env 僅 DB host 不同;但 EXPO 主機實際 .env 與 repository openclaw 的 branch/HQ/DB 值並不完全相同,且目前沒有任何 RABBITMQ_* 變數。
  • 安全決策待確認:EXPO profile 要直接複製 Ken YAML 內既有 credential fallback,或改成 password 無預設值、由 EXPO 主機 .env/secret 注入。

是由 陳國瑋 於 約 2 個月 前更新

需求確認:

  • Ken 同意採安全注入方式。
  • conf/expo/application.yml 的 RabbitMQ password 不提供 YAML fallback,必須由 EXPO runtime RABBITMQ_PASSWORD 注入。
  • repository 只保存非敏感 profile 設定;本階段不修改 EXPO 主機、不重啟服務、不執行真實 E2E。

實作規劃:

  1. 新增 java/ems_branch/conf/expo/,以 conf/ken 六個資源為基準。
  2. application.yml 保留 Ken 的 RabbitMQ env override、message TTL 與 audit 設定;改為 EXPO DB 行為與 INFO datasource log,並將 password 改為必要的 ${RABBITMQ_PASSWORD}。
  3. .env 僅保存 EXPO 非敏感 endpoint/DB host,不寫 Rabbit password;部署時才由主機 .env/secret 注入。
  4. 本機以 mvn clean -DskipTests -Ddeploy.target=expo package 驗證 profile 可打包,並檢查 JAR 內資源;不啟動外部服務。
  5. 更新 ai/05-deployment.md 與 Redmine ticket。
  6. E2E Catalog:Update REL-007,補入 EXPO Rabbit 認證、Branch publish、HQ consume、LIFF WebSocket 證據要求;release pack 採 EXPO Site/Config hotfix(REL-001/003/004/005/007、CHG-025、CHG-044),部署後另待 Ken 明確啟動 E2E。

待 Ken 回覆「規劃可接受」後才開始實作。

是由 陳國瑋 於 約 2 個月 前更新

實作完成(尚未 commit/部署):

變更:

  • 新增 java/ems_branch/conf/expo/ 六個 profile 資源,以 conf/ken 為基準。
  • 非敏感 endpoint/DB host 對齊 EXPO 現行 runtime。
  • RabbitMQ 使用 RABBITMQ_HOST、RABBITMQ_USERNAME、必要的 RABBITMQ_PASSWORD、RABBITMQ_VHOST;password 無 YAML fallback,且 repository .env 不含 Rabbit credential。
  • EXPO DB host 必須由 ems_db_ip 注入,不回退 localhost;datasource proxy loglevel=INFO。
  • 更新 ai/05-deployment.md 與 E2E REL-007。

已執行、不連外的驗證:

  • static profile guard:PASS
  • mvn clean -DskipTests -Ddeploy.target=expo package:BUILD SUCCESS;從 conf/expo 複製 6 resources。
  • packaged JAR profile assertion:PASS;JAR SHA-256 c8885309ad93d5efcf28ed8302af168bc766fec97cb67f600f64f7fda117ea78。
  • E2E catalog validator:PASS(167 cases;P0=51、P1=65、P2=46、P3=5)。

未執行:

  • Java test suite(本次僅 profile/文件變更)。
  • EXPO runtime secret 寫入、部署、Rabbit publish/HQ consume/LIFF WebSocket E2E。
  • 真實 E2E 仍需 Ken 明確下令。

工作區既有 java/ems_branch/conf/local/application.yml 空行變更與兩個 tmp PDF 未納入本議題。

是由 陳國瑋 於 約 2 個月 前更新

已完成 feature commit、push、EXPO 部署與 MQ transport smoke。

Git:

  • branch:feature/redmine-1419-expo-conf
  • commit:bc6d7c8 fix(#1419): 新增 EXPO 獨立部署設定
  • 已 push origin;未建立 MR、未合併 private。

部署:

  • 時間:2026-08-10 17:33(Asia/Taipei)
  • artifact SHA-256:e057c13c486e1150f7d74456b3ea0dc85fc95c13aaa8f62816cfa582c277baec
  • deployment:/opt/ems/deployments/20260810-1731-redmine-1419
  • rollback backup:/opt/ems/backups/20260810-1731-redmine-1419
  • 現行 JAR 與 .env 均已備份;RabbitMQ secret 僅注入遠端 runtime .env,未寫回 repository/Redmine。

部署前:

  • RabbitMQ 非 guest 帳號 Management API authentication:HTTP 200。
  • Branch ACTIVE transaction=0、CP ACTIVE transaction=0、active remote operation=0。
  • Fortune connector=AVAILABLE、current_transaction_id=NULL。

部署後:

  • ems-branch-api running、RestartCount=0、/api-docs HTTP 200。
  • CBDAX50A-24L-XX-B351 OCPP=ONLINE,BootNotification/Heartbeat/StatusNotification 已重連。
  • Fortune connector=AVAILABLE、current_transaction_id=NULL。
  • Branch/CP ACTIVE transaction=0、active remote operation=0。
  • 部署後無 ACCESS_REFUSED、AuthenticationFailure、publish failure 或嚴重啟動錯誤。

MQ transport smoke:

  • Branch 以 ems user 在 vhost / 建立新的 running AMQP connection。
  • EXPO Branch channel 實際 publish=1,unroutable=0。
  • connector.events.queue state=running、consumer=1、messages_ready=0、messages_unacknowledged=0。
  • Broker 統計顯示訊息已 publish、deliver、ack;證明 Branch → exchange/queue → consumer acknowledgement 正常。
  • HQ staging SSH 本次由執行端連線 timeout,因此未讀 HQ application log;本次結論限於 MQ transport smoke,不宣稱 LIFF WebSocket/完整 REL-007 PASS。
  • 未執行 RemoteStart/RemoteStop 或實車充電。

是由 陳國瑋 於 約 2 個月 前更新

  • 狀態 從 In Progress 變更為 Resolved

已依 Ken 確認完成結案條件:

  • feature commit:bc6d7c8
  • private merge commit:698aba6
  • feature 與 private 均已推送 origin
  • EXPO 已使用 conf/expo 重新部署
  • RabbitMQ 非 guest 帳號 authentication 成功
  • Branch AMQP connection=running,實際 publish=1、unroutable=0
  • connector.events.queue consumer=1,訊息已 deliver/ack,無 ready/unacknowledged 堆積
  • 部署後無 ACCESS_REFUSED、AuthenticationFailure 或 publish failure
  • API HTTP 200、container RestartCount=0、Fortune CP OCPP=ONLINE
  • RabbitMQ secret 僅存在 EXPO runtime environment,未寫入 repository

本單依 Ken 重新確認的驗收範圍,以 MQ transport 正常為完成標準;LIFF/實車停止流程仍由 #1418 的 CHG-044 驗證追蹤。

是由 陳國瑋 於 約 2 個月 前更新

  • 狀態 從 Resolved 變更為 Closed
動作

匯出至 Atom PDF