把產品要出貨給客戶的 docker-compose 從「只有後端兩個服務」擴充成「整組服務一鍵起」:資料庫(PostgreSQL)、快取(Redis)、後端 API、後端即時通訊(SocketIO)全部放進同一份 compose,客戶主機上 docker compose up -d 一次全起、且按正確順序起(資料庫好了才起後端)。這是 FR-065 落地版 installer 的地基棒(FR-065.1)。
docs/features/FR-065-2608-onprem-installer/design.md §4.1(本卡內容已自足,design.md 供延伸查證)擴充(不是重寫)docker/production/docker-compose.yml,新增服務(service 名用中性名,不沿用 e2e 的 e2e-postgres 類名):
guidant-db:image postgres:16;顯式 POSTGRES_INITDB_ARGS(--encoding=UTF8 --locale=en_US.utf8)——不顯式指定,客戶主機預設 locale 會滲進 initdb、跨機不可重現;named volume 存資料;healthcheck 用 pg_isready;不對外開 port(內網 5432)guidant-redis:必須用 ACL user 形式啟動(不是 requirepass)——啟動參數含 --user "$REDIS_USER" on ... "+@all" 段+appendonly no;healthcheck 用 ACL user 實測 ping;不對外開 portguidant-api(RUN_MODE 預設,內網 8000)+ guidant-socketio(RUN_MODE=socketio,內網 8002):同一 BE image(guidant-ai-be:1.14.0 起)用 YAML anchor 共用定義;既有定式全數保留:7 個掛載(static/log/home/tmp/pki/machine-id/agent 憑證)、read_only+tmpfs、宿主 /etc/machine-id 掛載(CM-1242 指紋修復)depends_on 用 condition: service_healthy 鏈——DB/Redis healthy → BE 兩服務 →(之後 T-1.2 的 FE)DB_HOST/REDIS_HOST 環境變數+移除對應 service 段;installer 不做 --external-db 參數化(D1 定案)up -dguidant-db:5432),對外映射另計——客戶主機 port 衝突只改映射redis://<user>:<pass>@host 連線字串,requirepass 只認 default user——必須 ACL userup -d 不帶 service 名會 recreate 同 project 的 DB(CLAUDE.md 有既往事故)——recreate 防護是本卡設計要求不是加分/etc/machine-id,漏掛指紋每次重啟漂移(CM-1242 事故)