動作
Bug #1419
已結束Bug #1343: [Branch] 華城充電樁 FINISHING 後未送 StatusNotification(Available),導致 connector 卡住無法充電 (FINISHING timeout fallback 修補)
[DevOps] EXPO ems_branch 獨立 conf 與 RabbitMQ 認證修正
開始日期:
2026-08-10
完成日期:
預估工時:
概述
背景¶
#1418 部署至 EXPO 後,ems_branch 以 conf/openclaw 建置,並使用遠端 RabbitMQ 的 guest 帳號登入。Broker 回覆 ACCESS_REFUSED,使 connector.events 無法發布,HQ WebSocket/LIFF 後續即時狀態可能中斷。
目標¶
- 新增 EXPO 專用
java/ems_branch/conf/expoprofile。 - 以現行
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 個月 前更新
完成初步 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 runtimeRABBITMQ_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 回覆「規劃可接受」後才開始實作。
是由 陳國瑋 於 約 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與 E2EREL-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 以
emsuser 在 vhost/建立新的 running AMQP connection。 - EXPO Branch channel 實際 publish=1,unroutable=0。
-
connector.events.queuestate=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 驗證追蹤。
動作