本卡屬 FR-167(母卡 CM-3241),卡 P1-4,階段 P1 升級變安全、批 3。只改 BE(主 repo,Repo 欄空著)。依賴:P1-1。
升級的核心保險:先停服務,把資料庫整個目錄複製一份,之後所有升級動作都在複本上做,現在那份從頭到尾沒被動過。compose 的資料庫路徑改成吃變數,才能指到複本。
資料不掉的核心:現在那份從頭到尾沒動
extend:docker-compose.yml 的 pgdata 路徑改 ${GUIDANT_PGDATA_DIR:-…},升級時以環境變數指到複本;複製用 cp -a,時限=預估三倍;證據檔不複製(D18)
repo:~/Projects/Billows/Audit-Manager/compliance-manager-be
改既有:scripts/installer/lib/upgrade_db_copy.sh(P1-1 空殼)
改既有:docker/production/docker-compose.yml(pgdata 變數、fe 掛 upgrade/ 唯讀)
細節在 design.md §5 對應段(~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/design.md,開 design.html 看導覽);本段只列本卡要做到的點:
lib/upgrade_db_copy.sh:docker compose stop api worker socketio → stop db → cp -a pgdata pgdata-next(.env、憑證目錄同步)→ 時限=預檢估的×3;中斷重跑先清半套 pgdata-next;失敗刪複本起舊版。docker/production/docker-compose.yml:db 卷 ${GUIDANT_PGDATA_DIR:-./pgdata};fe 加 ./upgrade:/guidant/upgrade:ro;api/worker 加 ./upgrade/orders:/guidant/upgrade/orders:rw(目錄權限由 P3-2c 的 systemd_units 設)。docker compose config 看得到變數生效。本機 docker:對一個假 pgdata 目錄跑 db_copy → pgdata-next/ 存在、來源 mtime 不變;複製中 kill -9 重跑能清掉半套複本;時限 1 秒對大目錄 → 放棄、來源不動;docker compose -f docker/production/docker-compose.yml config 用 GUIDANT_PGDATA_DIR 指到複本目錄、fe 的 upgrade/ 掛載是 :ro
測試期(不是你做):這張卡在 190 的真實情境是「190:跑完 pgdata-next/ 存在且舊目錄 mtime 不變;複製中 kill -9 重跑能清半套複本;時限到自動放棄回舊版」,由首腦在測試期操作、決策者看畫面。你只要確保上面的本機驗收全過、程式對這個情境沒有寫死假設。
對照雛形:~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/prototype/index.html(上方「跟著走」)。