我一直在本地運行 n8n 都沒有問題。最近,當我試圖對工作流程進行一些更改時,我注意到在發佈後,執行窗口仍然反映的是舊版本,而不是最新發佈的版本。無論我發佈多少次,過時的版本都會繼續運行。我發現的唯一解決方案是重新啟動 n8n 容器,這樣我就可以發佈它將使用的新版本。但是,在我重新啟動 n8n 或複製工作流程之前,它會再次「卡住」。有什麼想法可以解決這個問題嗎?我找到了一些有類似問題的其他帖子,但沒有找到解決方案。
@cwl 你用的是哪個 n8n 版本 + 這是單一實例還是隊列模式(多個 worker 容器)?你描述的情況 — 發佈後被接受但舊版本一直執行到容器重啟 — 聽起來像是活躍工作流程定義被快取在記憶體中,儲存時沒有失效。這是個已知的模式。
快速測試,在深入挖掘之前:與其只是按發佈,改為停用工作流程(切換關閉)→ 等待 5 秒 → 重新啟用。這樣它能撿起最新版本嗎?如果可以 = 活躍工作流程快取問題,可以修復。如果不行 = 觸發器的已註冊處理程式在編輯時沒有解綁,是另一個問題。什麼樣的觸發器節點啟動工作流程(webhook、cron、手動)?
嗨 @cwl
本質上,你的 n8n 執行個體正在經歷「通訊中斷」。當你發佈工作流程時,新版本會正確儲存在資料庫中,但實際執行工作流程的程式部分(執行管理器)仍然保留著舊版本的快取副本。這就是為什麼重新啟動容器有效——它會強制系統清除記憶體並從資料庫中取得最新版本。
這通常是由 n8n v2 早期版本中發現的軟體錯誤引起的。在這些版本中,發佈按鈕與執行引擎之間的「握手」有時會中斷,導致系統卡在較舊的版本 ID 上。將你的 n8n 映像更新到最新版本(特別是 v2.14.0 或更新版本)是最有效的解決方案,因為開發人員已經為這個問題發佈了多項修補程式。
另一種可能與 n8n 如何處理其內部流程有關。如果你的設定被配置為在自己的獨立流程中執行執行(而不是主流程中),這些子流程有時可能會變成「殭屍」而忽略更新。將執行流程設定切換為 main 通常可以解決此問題,因為這樣可以確保一切都在一個位置進行,其中更新會立即被看到。
若要永久修復此問題,請從拉取最新的 Docker 映像並重新啟動你的設定開始。如果問題仍然存在,請檢查你的環境變數,以確保你沒有使用可能快取舊資料的「佇列模式」或「自有流程」設定。如果你熟悉資料庫工具,你也可以手動檢查該特定工作流程的「活動版本」ID 是否與「目前版本」ID 相符。
查詢: 對你的資料庫執行此查詢:
SELECT id, name, "versionId", "activeVersionId"
FROM workflow_entity
WHERE "activeVersionId" IS NOT NULL AND "activeVersionId" != "versionId";
修復: 如果發現不匹配,你可以手動強制它們對齊:
UPDATE workflow_entity SET "activeVersionId" = "versionId" WHERE id = 'YOUR_WORKFLOW_ID';
我只是在 docker 容器中運行單個 insane 版本 2.22.5。這是一個簡單的 homelab 設置,所以只有一個節點。停用並未解決問題。我有 3 個觸發器可以啟動它,其中一個分支是排程的,一個是 discord 聊天訊息,一個只是介面。
好的,3 個觸發器在一個工作流程上很可能是罪魁禍首。多觸發器工作流程是個已知的痛點——當你編輯時,n8n 只會完全重新註冊最近觸發的那個觸發器,其他 2 個仍然固定在快取版本上。這就是為什麼停用→重新啟用沒有幫助(只會重新整理其中一個)。
最乾淨的修復方案:分成 3 個小型工作流程(每個觸發器一個),各自呼叫一個共用的「邏輯」子工作流程。你的編輯放在子工作流程裡,每次呼叫都會重新載入。觸發器工作流程看起來像這樣:
針對 Discord + 手動觸發器重複那個模式,全部 3 個都指向同一個邏輯工作流程。但在採取那個方案之前——快速測試:把目前的工作流程匯出為 JSON(... 選單 → 下載),刪除它,重新匯入,啟用。強制執行乾淨的觸發器註冊。如果那樣修復了它,就不需要分割了。