本卡屬 FR-167(母卡 CM-3241),卡 P1-5,階段 P1 升級變安全、批 3。只改 BE(主 repo,Repo 欄空著)。依賴:P1-1。
在複本上跑真正的升級:載入新映像並核對雜湊、用複本起資料庫、跑 migration。migration 腳本每套一支印一行進度,runner 轉寫進度檔;一支 10 分鐘沒新進度就判卡住。
卡住的判定要靠進度行,沒有進度行只能看總時限
extend:migrate.sh 每支 printf 'PROGRESS\t%d/%d\t%s'(它不寫進度檔,只印);runner tail 轉寫
repo:~/Projects/Billows/Audit-Manager/compliance-manager-be
改既有:scripts/installer/lib/upgrade_apply_on_copy.sh(P1-1 空殼)
改既有:scripts/init/migrate.sh 298
細節在 design.md §5 對應段(~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/design.md,開 design.html 看導覽);本段只列本卡要做到的點:
scripts/init/migrate.sh 298 附近每支套前 printf 'PROGRESS\t%d/%d\t%s\n'(只印,不寫檔);既有輸出不變。lib/upgrade_apply_on_copy.sh:docker load 並比對 bundle-manifest.sha256(5 分)→ GUIDANT_PGDATA_DIR=pgdata-next docker compose up -d db → init image GUIDANT_INIT_MODE=migrate,docker logs -f tail 轉寫進度檔 progress/last_progress_at → 單支 --stall-timeout(預設 600 秒)無新 PROGRESS 判卡回非零。pg_sleep(30)、--stall-timeout 10 驗判卡。本機 docker postgres:migrate.sh 每支印 PROGRESS\t%d/%d\t%s(既有輸出不變);runner 把它轉成進度檔 migration 3/5 <檔名>;塞一支 pg_sleep(30) 的測試 migration、--stall-timeout 10 秒 → 判卡回非零;載映像用假 tar 驗雜湊不符就拒
測試期(不是你做):這張卡在 190 的真實情境是「190:真包真庫,進度檔逐支更新;塞 pg_sleep(700) 的 migration 10 分後判卡」,由首腦在測試期操作、決策者看畫面。你只要確保上面的本機驗收全過、程式對這個情境沒有寫死假設。
對照雛形:~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/prototype/index.html(上方「跟著走」)。