使用 Hermes agent 時,你是否遇過這種很繁瑣的狀況:明明已經改過設定、重啟過容器,也確認 .env 檔案格式沒寫錯,但服務一跑起來,行為卻又回到預設值?
這類問題通常不是模型本身失效,而是環境變數(Environment Variables)根本沒有被背景服務正確讀取,或是服務讀到的並非你設定的那份檔案。看起來像 Hermes 不聽話,實際上是啟動鏈路斷在容器層,這也是我們在管理 VPS 與雲端主機服務時極常見的維運狀況。
本篇目錄
最常見的誤區:檔案存在,不代表服務已接住
維運時最容易踩到的坑,就是把「檔案存在」跟「服務已順利接住設定」劃上等號。事實上,Docker Compose、systemd、PM2、CI runner,甚至桌面啟動器,讀取環境變數的機制都不一樣。
- 你在 shell 裡執行
export成功,不代表背景服務能拿到同一組變數。 - 你更新了
docker-compose.yml,不代表既有的 container 已經重新建立。 - 你修改了 GUI 介面的參數,更不代表被掛載進去的子進程(Child Process)有同步更新。
這就是為什麼你的 Hermes agent 每次重啟都像被重置一樣。

容器維運的三層逐步排查法
第一層排查:確認容器實際吃到的變數
先把第一層查清楚:容器到底吃到哪些變數。不要只看外部的 .env 檔,請直接進入執行中的 container 內部跑 env 或 printenv 指令,確認像 HERMES_API_KEY、HERMES_MODE、HERMES_GATEWAY_URL 這類關鍵值是否真的存在。
如果服務是透過 Docker Compose 啟動,請同步檢查 environment、env_file、command 和 entrypoint 有沒有互相衝突或覆蓋。很多團隊以為修改設定檔就夠了,其實背景運作的舊 container 還在吃舊的值。
第二層排查:檢查服務管理器是否重新寫入設定
第二層要看服務管理器(Service Manager)有沒有在背後覆蓋設定。像是 systemd 的 Environment= 與 EnvironmentFile=,PM2 的 ecosystem.config.js,或是 Kubernetes 的 ConfigMap / Secret,都可能在啟動時把你的設定蓋掉。
若 Hermes agent 在開機後運作正常,但只要服務一重啟就跑回預設值,問題通常就出在這一層。這時候不需要再去改模型參數,請優先檢查最後一次啟動指令以及進程實際讀到的環境變數。
第三層排查:確認變數是否作用在正確進程
第三層則是確認變數有沒有傳遞到正確的進程上。容器環境常見的情境是:父進程(Parent Process)有吃到變數,但 worker 沒吃到;或是主程序讀到了新設定,但子程序、sidecar 或輪詢守護程序(Polling Daemon)還停留在舊狀態。
對 Hermes 這類包含 gateway、worker、polling 多重路徑的系統來說,只看主程序日誌是不夠的。比較穩健的做法,是把設定來源收斂成單一入口:要嘛只用 compose 的 environment,要嘛只用服務管理器的 EnvironmentFile,避免 GUI、shell、容器與啟動腳本各自定義一次。若有敏感資訊,則集中放在 Secret 機制處理,避免不同層級重複複製與產生版本偏差。

FAQ
很可能是 Docker container 沒有真正重新建立(僅有 restart 而未依新檔 rebuild/up),或是 systemd/PM2 等服務管理器在啟動時覆蓋了同名變數。
建議直接進到執行中的進程(Process)環境檢查 printenv,確認最底層讀到的值,再往回追查 Docker Compose、systemd 或 Kubernetes 的設定階層。
將設定來源統一收斂至單一入口,並在服務啟動時將關鍵環境變數輸出至 startup log 中,這樣每次重啟就能第一時間完成比對與驗證。
