大家好,感謝你們的付出!
如果這個主題已經存在,我先道歉。我已經盡力搜索,但找不到。
我在 Gitea 倉庫中有一些程式碼,我想在我的 n8n 工作流程中執行它(自託管在 docker 容器中)。現在我正在使用 git pull 節點和 execute_command 節點在機器上運行腳本。這些腳本主要引用軟體 API 並操作檔案。
這是理想的做法嗎?我也在其他事情中使用程式碼節點,但有些東西我真的需要在我的 IDE 中編寫和除錯…
感謝!
大家好,感謝你們的付出!
如果這個主題已經存在,我先道歉。我已經盡力搜索,但找不到。
我在 Gitea 倉庫中有一些程式碼,我想在我的 n8n 工作流程中執行它(自託管在 docker 容器中)。現在我正在使用 git pull 節點和 execute_command 節點在機器上運行腳本。這些腳本主要引用軟體 API 並操作檔案。
這是理想的做法嗎?我也在其他事情中使用程式碼節點,但有些東西我真的需要在我的 IDE 中編寫和除錯…
感謝!
你使用的 git pull + Execute Command 模式對於自託管的 Docker 設置來說確實是一個很好的方法 - 它讓你的腳本受版本控制並與 n8n 的核心分開。有一點值得思考:如果你的腳本需要在特定的環境中運行(不同的 Python 版本、已安裝的套件等),你可能會想考慮透過一個小型的 HTTP 包裝器或一個獨立的容器來呼叫腳本,而不是直接在 n8n 容器內運行。這樣你就不會污染 n8n 的執行環境,你的腳本可以從你的 IDE 中獨立測試,而根本不需要接觸 n8n。
是的,那個設置可以運作,但我會小心不要在每次工作流程執行時都執行 git pull。我可能會分開更新儲存庫,然後讓 n8n 使用 Execute Command 執行固定的腳本路徑,例如 /scripts/my-task.py。
如果腳本需要特殊套件,將它們放在 Docker 映像/容器中,而不是在工作流程執行期間安裝。這樣可以讓 n8n 保持為協調器,而不是讓工作流程管理自己的程式碼更新。
感謝你們兩位的意見!
我有兩個後續問題:
@nguyenthieutoan:我的 Python runner 設定在與 n8n 容器相同的 sidecar 容器中。這是執行指令碼的好地方嗎,還是這樣也會被視為污染 n8n 環境?
@OMGItsDerek:每次工作流程執行都提取儲存庫有什麼風險?
再次感謝,期待聽到你們的想法!
是的,在每次工作流程運行時執行 git pull 的最大問題是事情很快就會變得無法預測。一次運行可能執行的程式碼與前一次略有不同,而你卻沒有意識到。如果 Git/Gitea 或網路暫時無法使用,你也可能遇到隨機故障。
另一個需要注意的是並發。如果兩個工作流程同時執行並都嘗試拉取/更新同一個儲存庫,根據檔案的使用方式,可能會發生奇怪的問題。
這也會讓除錯變得更加困難,因為當某些地方出現問題時,你現在必須問自己「是工作流程本身出問題,還是程式碼在各次運行之間改變了?」
這就是為什麼我通常會將部署與執行分開。我會讓 n8n 只執行固定的指令稿路徑,而獨立地更新儲存庫。如果你確實想要自動更新,我至少會記錄每次運行的提交 SHA,並確保一次只能執行一次拉取。
這些確實都是很好的建議,謝謝!
我也有人推薦我整合 Github Actions。有人有這方面的經驗嗎?
不管怎樣,我會試試看,最後會跟大家分享我們的決定。
Sidecar 的設置實際上非常理想 - 這正是我所指的分離。你的 n8n 容器負責編排,你的 Python 容器負責執行,兩者之間沒有執行時洩漏。你可以通過 HTTP 或執行命令(如果它們在同一個 Docker 網路上)呼叫 sidecar,每一側都保持獨立可測試。至於 GitHub Actions 整合,那也可以,但更適合用於 CI/CD 管道,而不是工作流程內的隨選指令碼執行。