Guidant AI · FR-175 機制問答資訊集中區 · 2026-10-31 起

線上更新機制問答

回答 2026-10-31 PM 會議提出的機制面問題,以及 11-01 決策者的追問。每題先給結論,再給查到的事實與路徑。從左側選單選題;涉及規劃或方案取捨的在「待討論」,查到的缺陷在「發現的問題」。

安裝與設定 · Q6
Q6

安裝部署做哪些事、路徑在哪、用哪個帳號、權限多大

全程以 root 執行(sudo ./install.sh)。理由:要建系統目錄、寫 600 權限的設定檔、把容器要讀的檔 chown 給容器內的 uid、操作 docker daemon,這些都需要 root;安裝完後日常維運指令 sudo guidantai 同樣以 root 跑。

安裝八步與落點:

步做什麼動到哪裡
①環境檢查:docker、磁碟、埠、核心只讀
②載入 9 顆映像並逐檔核對 bundle-manifest.sha256docker image store
③產生密碼與金鑰(見 Q7)記憶體,下一步才落檔
④寫設定檔、產 HTTPS 自簽憑證、產 Agent 對接 CA/srv/guidant-ai/.env、guidant.env(600 root)、certs/、pki/
⑤建資料庫:init 容器跑全部 schema 與 seeddocker volume guidant_guidant-pgdata(第一次升級後改為 /srv/guidant-ai/pgdata)
⑥設定內建物件儲存,灌隨包系統檔(框架 PDF、檢測基準)SeaweedFS bucket guidant-ai
⑦啟動服務,裝維運指令與 systemd 單元/usr/local/bin/guidantai、/usr/local/lib/guidant/、/etc/systemd/system/guidant-upgrade-*、/etc/guidant-ai/install.conf、/etc/guidant/release-keys/
⑧印安裝參數與下一步(開通授權)安裝紀錄 /srv/guidant-ai/log/install-*.log

資料目錄 /srv/guidant-ai 是唯一要備份的地方:設定、憑證、資料庫、物件儲存、升級進度全在裡面。/etc/guidant-ai/install.conf 只記「資料目錄在哪、compose 檔在哪」,給維運指令定位用。

Q6
補問

升級用的公鑰為什麼放 /etc/guidant/?什麼時候放進去的?

安裝時就放,不是之後補的。190 實查 /etc/guidant/release-keys/b91819f86eb4b4f8.pub 建檔 2026-10-30 19:52:00,與同台安裝紀錄 install-20261030-194622.log 收尾同一分鐘,即 install.sh 第 ⑦ 步「裝維運指令」做的:install.sh:639 呼叫 lib/self_replace.sh --install-from,self_replace.sh:180 再呼叫 release_keys_install(lib/release_keys.sh:99),把出貨包內 release-keys/*.pub 複製到 /etc/guidant/release-keys/。之後每次升級第 0 步走同一支,新鑰隨新包進來、舊的保留。

為什麼放 /etc 不放資料目錄:這把鑰是「用來驗新包能不能信」的。驗章鐵則(release_keys.sh:6):只用這台機器上已經裝好的印樣,不用新包裡帶來的,拿包裡的鑰驗包裡的清單等於沒驗。所以它要與出貨包、資料目錄都脫鉤,放系統設定目錄,root 持有 644 唯讀,與 /usr/local/bin/guidantai、/usr/local/lib/guidant/ 同屬「與包脫鉤的系統層資產」。後端容器以唯讀掛載讀它(docker inspect:/etc/guidant/release-keys (ro)),自己改不了。

項目事實
鑰的種類Ed25519 公鑰(SPKI PEM,113 bytes)。檔名 b91819f86eb4b4f8=公鑰 sha256 前 16 位,即「印樣編號 kid」
這把是誰的10/30 首腦在決策者電腦產的測試章,私鑰在 ~/.guidant-release-test/。正式章等 guidant-release init-keys,公鑰放進 repo scripts/installer/release-keys/ 隨包出去
換鑰順序舊鑰驗過這一版 → 這一版的包才把新鑰裝上。release_keys_install 只加不減、同名不覆蓋(release_keys.sh:100)
出包守門build_bundle.sh:187 沒有正式章就紅燈拒出包(測試期 --skip-prod-key-check 繞)
Q6
補問 2

安裝目錄結構:每個資料夾放什麼、什麼可以清、什麼不能動

依 190(10/30 乾淨重裝)與 189(8 月裝到現在、11 次舊式升級再接新式)實查整理。先看結構圖,再看三級清單,最後是兩台對照。

/srv/guidant-ai/                      資料目錄:唯一要備份的地方
├── pgdata/                           不能動  PostgreSQL 現用資料
├── .env                              不能動  compose 用的全部密碼(Q7)
├── guidant.env                       不能動  後端設定、JWT、三把加密金鑰
├── pki/  certs/  seaweedfs/s3.json   不能動  Agent CA、HTTPS 憑證、物件儲存金鑰
├── docker-compose.yml                不能動  部署定義(已與出貨包脫鉤的副本)
├── bugsink-admin.secret              不能動  錯誤追蹤站管理密碼
│
├── pgdata-prev-<舊版>/              自管    上一版快照,退回用;下次成功第 7 步自動刪
├── .upgrade-config-prev/             自管    升級前設定與憑證備份,每次覆寫
├── ai-gateway-rules/  .default/      自管    AI 閘道規則:客戶改過的 / 隨包預設
├── home/  static/                    自管    容器掛載的工作目錄與靜態檔
├── log/                              自管
│   ├── app.log  app.log.<日期>        後端 log,按日輪替保留 30 天(LOG_RETENTION_DAYS)
│   ├── install-<時間>.log             安裝紀錄
│   ├── upgrade-migrate-<單號>.log     每次升級的 migration 輸出
│   └── upgrade-<時間>.log             舊式 install.sh --upgrade 才寫 可清
│
├── upgrade/
│   ├── upgrade-progress.json         自管    進度檔:更新中心、維護頁、開機檢查都讀(Q18)
│   ├── last-switch.json  progress.d/ 自管    換接紀錄、每步明細
│   ├── maintenance/                  自管    新版維護頁(第 0 步放進來)
│   ├── orders/  .upgrade.lock        自管    更新單落地點(平時空)、防重入鎖
│   ├── incoming/                     可清    下載的更新包 tar.gz+清單+sha256+ops,每包 5 GB
│   │                                           第 7 步只留本次;留著是給「重跑同版」,成功後可手刪
│   ├── bundles/guidant-ai-<版>/      可清    解開的包;成功後只剩 agent/ 1.7 GB(Agent 推送用)
│   └── diag/                         可清    歷次診斷包暫存,寄過就能刪
│
├── backup/  backup-manual/           可清    舊流程每次升級前的 pg_dump;新流程不寫不讀。只有老機器有
└── *.bak-*                           可清    人手改設定前的備份,確認現行設定正常後刪

/etc/guidant/release-keys/<kid>.pub  不能動  發布印樣,丟了升級包驗不過
/etc/guidant-ai/install.conf          不能動  記資料目錄在哪,維運指令靠它定位
/usr/local/bin/guidantai              不能動  維運指令
/usr/local/lib/guidant/               不能動  升級函式庫(八步腳本)
/etc/systemd/system/guidant-upgrade-* 不能動  接單、開機檢查的 systemd 單元

docker volume
├── guidant_guidant-seaweedfs-data    不能動  證據檔
├── guidant_guidant-bugsink-data      不能動  錯誤追蹤資料
├── guidant_guidant-classifier-jobs   不能動  分類工作
├── guidant_guidant-scan-vulndb       不能動  弱點庫
└── guidant_guidant-pgdata            自管    第一次升級前的舊資料庫 volume,下次成功自動刪

docker 映像
├── guidant-ai-be/fe/init           自管    第 7 步留本版+上一版,更早自動刪
├── postgres  redis  seaweedfs  bugsink  evidence-classifier   第三方,升級流程不動
└── guidant-ai-agent:<版>             可清    Agent 容器自己升級留下的,主系統不管(190 五顆 21 GB)
不能動丟了等於資料或系統沒了 自管系統自己產自己清,不用手動 可清磁碟緊時先看這裡

🔴 不能動(丟了等於資料或系統沒了)

位置內容丟了會怎樣
pgdata/PostgreSQL 現用資料目錄全部業務資料沒了
.env、guidant.env全部密碼、JWT、三把加密金鑰(Q7)連不上資料庫;Google Drive 授權與檢測工具憑證永遠解不開
pki/、certs/、seaweedfs/s3.jsonAgent 對接 CA、HTTPS 憑證、物件儲存金鑰全部 Agent 要重接;物件儲存讀不到
docker-compose.yml、bugsink-admin.secret部署定義(已與出貨包脫鉤的副本)、錯誤追蹤站管理密碼維運指令動不了
docker volume guidant_guidant-seaweedfs-data 等四顆證據檔、錯誤追蹤資料、分類工作、弱點庫證據檔沒了
/etc/guidant/release-keys/發布印樣升級包驗不過,再也升不了
/etc/guidant-ai/install.conf、/usr/local/bin/guidantai、/usr/local/lib/guidant/、/etc/systemd/system/guidant-upgrade-*維運指令、升級函式庫、接單的 systemd 單元線上升級接不到單;維運指令找不到資料目錄

🟡 系統自己管(刪了會變難查或退不回,不用手清)

位置內容說明
pgdata-prev-<舊版>/上一版資料庫快照,退回用下次升級成功第 7 步自動刪,只留一代(Q14)
.upgrade-config-prev/升級前設定與憑證備份180K,每次升級覆寫
upgrade/upgrade-progress.json、last-switch.json、progress.d/進度檔更新中心、維護頁、開機檢查、guidantai recover 都讀它(Q18)
upgrade/maintenance/、orders/、.upgrade.lock新版維護頁、更新單落地點、防重入鎖orders/ 平時是空的
ai-gateway-rules/、.default/AI 閘道規則:客戶改過的 / 隨包預設每版升級只換 .default
home/、static/容器掛載的工作目錄與靜態檔
log/app.log 按日輪替保留 30 天(jedi-common log_settings.py:15,LOG_RETENTION_DAYS 可調);install-*.log;每次 migrate 一支 upgrade-migrate-*.log診斷包收最近三支 upgrade/install log。30 天滿會自己刪,不用手動

🟢 可以清(磁碟緊時先看這裡)

位置內容說明
upgrade/incoming/下載的更新包、清單、sha256、ops 小檔,每包 5 GB第 7 步只留本次的,更早版本自動刪。設計上刻意留本次那包給「重跑同版」用;確定升級成功後可手動刪,下次重跑要重下載
upgrade/bundles/guidant-ai-<版>/解開的包,升級成功後只剩 agent/(1.7 GB,Agent 推送用)Agent 都升完或沒 Agent 可刪
upgrade/diag/歷次診斷包暫存已寄原廠的可刪
backup/、backup-manual/舊 install.sh --upgrade 流程每次升級前的 pg_dump(Q5/Q20)新流程不寫也不讀,整個可刪;只有老機器有
*.bak-*(.env.bak-cm1418、guidant.env.bak-fr133-*、guidant.env.bak-fr167-*)人手改設定前的備份確認現行設定正常後可刪
docker 映像自家 be/fe/init 第 7 步自動刪舊版、留本版加上一版;第三方不動Agent 映像主系統清理不管(190 有 1.4.3~1.4.7 五顆各 4.2 GB)。不要跑 docker image prune -a,會連 postgres 等第三方一起清

189 與 190 對照(2026-11-01 12:15 實查)

項目189 POC(8 月裝,11 次舊式升級再接新式)190(10/30 乾淨重裝)可清?
backup/+backup-manual/410 MB,8 支 `.sql.gz`(9/30~10/10)+1 支 8/27 手動 dump沒有✅ 整個刪
*.bak-* 設定備份4 支(8/28~10/31)1 支✅ 確認現行設定後刪
log/531 MB,36 支 app.log(30 天輪替、10/4 一天 78 MB、10/10 95 MB)+12 支舊式 upgrade-*.log30 MB,3 支app.log 30 天自己刪;12 支舊式 upgrade log 可刪
upgrade/incoming/9.9 GB:1.27.9(已裝)+1.27.10(12:13 剛下載未裝)5.1 GB:1.27.81.27.9 那包升級成功後可刪;1.27.10 正在等裝不可動
upgrade/bundles/1.7 GB,只剩 1.27.9 `agent/`1.5 GB,只剩 1.27.8 `agent/`兩台一致,第 7 步清得正確
pgdata-prev-*684 MB(1.27.8)138 MB(1.27.7)兩台一致,各留一代
主機 /home/jedi/16 GB:guidant-ai-1.27.7/ 解開目錄 8.4 GB、1.26.0 與 1.27.7 兩支 tar.gz 7.7 GB沒有兩支 tar.gz ✅;解開目錄先別動(見發現的問題:一顆 redis 容器的 compose 標籤還指著它)
docker 自家映像1.27.8/1.27.9,乾淨1.27.7/1.27.8+Agent 1.4.3~1.4.7 五顆 21 GB190 的 Agent 1.4.3~1.4.6 四顆 17 GB ✅
磁碟195 GB 用 139 GB(75%)293 GB 用 107 GB(39%)189 可安全回收約 8.6 GB,解開目錄查完再加 8.4 GB

189 的清理動作屬「改 POC 狀態」,由首腦執行;本 session 只列清單。