大家好,
我正在運行 2 個自託管的 (EKS) n8n 實例 - 開發和生產環境。目前,每當我在開發環境中更新或新增認證時,我都必須在生產環境中手動重新建立/更新它們,這既繁瑣又容易出錯,尤其是隨著工作流程和認證數量的增加。
我卡在了如何避免這個手動同步步驟。自動化開發和生產自託管實例之間的認證同步的最佳方式有哪些?
我很想聽到關於以下幾點的意見:
- 是否有受支援的方式可以透過 CLI 或 API 匯出/匯入認證並編寫指令碼?
- 有人設置過 CI/CD 管道 (例如,使用原始程式碼控制 + n8n CLI) 來將認證/工作流程從開發推進到生產環境嗎?
- 環境變數或外部密鑰管理器 (Vault、AWS Secrets Manager 等) 是否比直接在每個實例中儲存認證更好的長期方法?
- 任何來自解決過此問題的人的建議、工作流程或範例都將不勝感激。謝謝!
n8n CLI 是編寫此功能腳本的主要方式。你確實可以匯出和匯入工作流程和認證。
困難之處:加密金鑰 n8n 使用 N8N_ENCRYPTION_KEY 加密資料庫中的所有認證。如果你的 Dev 和 Prod EKS 實例具有不同的金鑰(出於安全考慮應該如此),直接匯出/匯入加密檔案將在 Prod 中失敗,因為 Prod 實例將無法解密它們。
解決方案:解密的中間檔案 你可以使用 --decrypted 旗標來繞過此限制,但必須以極端謹慎的方式處理產生的純文字檔案。
建議的工作流程:
- Dev 端: 在 Dev 容器中執行腳本:
n8n export:credentials --all --decrypted --output=credentials_export/
- 安全傳輸: 將這些 JSON 檔案推送到安全的臨時位置(例如,具有生命週期政策以在 1 天後刪除的加密 AWS S3 儲存桶,或 AWS Secrets Manager 項目)。絕不要將這些純文字 JSON 提交到你的 Git 存儲庫。
- Prod 端(CI/CD 管道):
- 從你的安全儲存空間提取解密的 JSON。
- 在 Prod 容器中執行匯入命令:
n8n import:credentials --input=credentials_export/ --separate
- 匯入後立即清除本機檔案。
對於專業的 EKS 設定,你應該停止將 n8n 的內部資料庫視為機密的「單一事實來源」。相反,將你的認證視為基礎設施的一部分。
策略:外部密鑰管理器 + 環境變數 不是同步 n8n 中的「認證實體」,而是利用 n8n 對許多服務配置使用環境變數的能力。
- 架構: 將你的實際 API 金鑰/密碼儲存在 AWS Secrets Manager 或 HashiCorp Vault 中。
- 實作:
- 在 EKS 叢集中使用 External Secrets Operator (ESO) 將 AWS Secrets Manager 值同步到 Kubernetes Secrets。
- 將這些 Kubernetes Secrets 作為環境變數注入到你的 n8n Pod 中。
- 雖然 n8n UI 建立的認證是基於資料庫的,但你可以在 CI/CD 管道中使用 n8n API 來「佈建」認證,使用這些環境變數作為輸入值。這確保認證的定義存在於你的代碼/保管庫中,而只有值在執行時被注入。