Bug #1419
已結束
Bug #1343: [Branch] 華城充電樁 FINISHING 後未送 StatusNotification(Available),導致 connector 卡住無法充電 (FINISHING timeout fallback 修補)
[DevOps] EXPO ems_branch 獨立 conf 與 RabbitMQ 認證修正
是由 陳國瑋 於 約 2 個月 前加入.
於 約 2 個月 前更新.
概述
#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 拆分回歸。
開始需求確認與 EXPO/Ken profile 差異盤點;實作前依 SOP 等待需求與規劃確認。
完成初步 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 注入。
需求確認:
- Ken 同意採安全注入方式。
-
conf/expo/application.yml 的 RabbitMQ password 不提供 YAML fallback,必須由 EXPO runtime RABBITMQ_PASSWORD 注入。
- repository 只保存非敏感 profile 設定;本階段不修改 EXPO 主機、不重啟服務、不執行真實 E2E。
實作規劃:
- 新增
java/ems_branch/conf/expo/,以 conf/ken 六個資源為基準。
-
application.yml 保留 Ken 的 RabbitMQ env override、message TTL 與 audit 設定;改為 EXPO DB 行為與 INFO datasource log,並將 password 改為必要的 ${RABBITMQ_PASSWORD}。
-
.env 僅保存 EXPO 非敏感 endpoint/DB host,不寫 Rabbit password;部署時才由主機 .env/secret 注入。
- 本機以
mvn clean -DskipTests -Ddeploy.target=expo package 驗證 profile 可打包,並檢查 JAR 內資源;不啟動外部服務。
- 更新
ai/05-deployment.md 與 Redmine ticket。
- 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 回覆「規劃可接受」後才開始實作。
實作完成(尚未 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 未納入本議題。
已完成 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 或實車充電。
- 狀態 從 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 驗證追蹤。
匯出至 Atom
PDF