本卡屬 FR-166(母卡 CM-3109 延伸),決策者 2026-10-28 改判 D22:主控台儲存位置只保留內建 SeaweedFS。Repo:evidence-agent。FE 卡「儲存面板只剩內建」依賴本卡(schema 少三個選項)。
白話
主控台「服務與重啟」的證據檔儲存位置現在有四種:系統內建 SeaweedFS/自有 SeaweedFS/自有 MinIO 或相容 S3/本機磁碟。決策者裁定 Agent 只該有一種,就是同包出貨的內建 SeaweedFS,其他三種從畫面與 API 拿掉,客戶不能再把證據指到別處。
一個前提要先講清楚:內建 SeaweedFS 只有 compose 形態才有(deploy/docker-compose.yml 的 guidant-agent-seaweedfs,預設 STORAGE_TYPE=seaweedfs)。原生安裝與開發機源碼模式沒有那顆容器、也沒有出廠快照(factory-defaults.env),現在跑的是 local。所以「只剩內建」在這兩種形態下等於「主控台不給改」,安裝時的 local 照舊生效,只是畫面上不再提供選項。
問題在哪
- core/storage_settings.py 第 22 行四個 TYPE_*,第 37 行起 FIELDS 的 type 欄 options 四個、各型別的欄位(endpoint/access_key/secret_key/bucket/base_dir)。
- core/console/ops_routes.py 第 120~190 行 get/test/put/reset 四支都吃 FIELDS,_verify_storage 依型別走 S3 連線或本機目錄檢查。
- scripts/install/install.sh 第 2087 行 STORAGE_TYPES="local seaweedfs minio"、configure-storage 三型互動;第 2089 行起出廠快照讀回。CLI 是安裝與救援路徑,本卡不動它(D22 原裁 CLI 留備援),只動主控台。
怎麼做
- 【extend storage_settings.FIELDS】type 欄 options 只剩 factory;seaweedfs/minio/local 三型的欄位定義從 FIELDS 拿掉(endpoint、access_key、secret_key、bucket、base_dir 不再出現在主控台表單)。TYPE_* 常數保留(CLI 與 storage 模組讀 .env 還認得這些值),只是主控台不再接受。
- 【extend ops_routes】put_storage 收到 type ≠ factory 一律 400 FIELDS_INVALID;test_storage 只走 _verify_factory 那條(出廠快照的 S3 連通,403 視為待恢復,照 install.sh _verify_factory_storage 的詮釋);get_storage 回應多帶 factory_available(已有)與 current_type(安裝時設定的實際型別,local/seaweedfs/minio,給畫面說明「目前用安裝時的 X 設定」),不回欄位值。
- 【沒有出廠快照的機器】factory_available=false 時:get 照常回、put 回 409 新錯誤碼 STORAGE_FACTORY_UNAVAILABLE(訊息:這台沒有內建儲存,證據照安裝時的設定存放;要改請用 CLI configure-storage),test 同。不要在這種機器上隱藏整個區塊,使用者要看得到「目前存在哪」。
- 【reset_storage】保留:清掉主控台存的設定、改回安裝時設定。這條在「只剩內建」下仍有意義(曾用主控台套用過 factory 的機器要退回)。
- 【不動】CLI configure-storage、.env 的 STORAGE_TYPE 讀取、storage 模組三種 adapter、docker-compose 的預設。
改哪些檔
- core/storage_settings.py(279 行)、core/console/ops_routes.py(194 行)、common/code/console_tool_error_code.py 或 ops 的錯誤碼檔(新 STORAGE_FACTORY_UNAVAILABLE,先 grep 既有 STORAGE_* 錯誤碼放同一支)
- test/test_console_ops.py(先 grep storage 相關測試,改成只認 factory;新增 type=local 被 400、無快照 put 409)
驗證
- 單元:schema 的 type options 只有 factory;put type=minio/local/seaweedfs → 400;factory_available=false 時 put/test → 409;reset 仍可用。突變:把 options 加回 local → 第一支紅。
- 本機(源碼模式、無快照):GET /console/api/ops/storage → factory_available=false、current_type=local;PUT type=factory → 409 帶訊息;Agent 照舊把證據存到 local。