Skip to content

自動備份 n8n 工作流程及金鑰

n8n 用一陣子之後,有沒有發現你的工作流程跟設定的 API Key 也越來越多,萬一系統哪天出問題了,這些設定跟流程可能就得重來一次。如果想把這些工作流程搬到另一台機器,雖然一個一個手動複製貼到新的主機上也不是不行,但這樣的方式不僅麻煩,也容易出錯。

直接備份資料庫是個簡單的方法,但如果你的 n8n 是公司的工程師幫你架的,你不一定有機會可以直接存取或備份資料庫。是說,大家別忘了,n8n 身為一個工作流程自動化工具,我們就應該讓它自動備份,而且還是自己備份自己,這樣才是真正的自動化!先不說別的,像這種用魔法打敗魔法的方式,不覺得很有趣嗎?

本文我會展示兩種備份方式,一種是透過 n8n 本身提供的 API 來進行備份,不過如果你是自己架設的 n8n 而且有權限能執行指令(通常應該有),你也可以透過 n8n 指令來備份工作流程跟金鑰。

這篇文章可能有點長,如果不想看過程,可直接跳到最後看結論

透過 API 備份

如果你使用的是 n8n 官方網站或是 Zeabur 之類的平台架設的服務,你可以透過 n8n 本身提供的 API 來把工作流程備份下來。

Step 1:建立 API Key

畫面左下角的 Settingsn8n API,然後建立一個新的 API Key:

n8n API Key

Label 隨便你寫,這裡我就寫 n8n 備份。一般為了安全起見,API Key 通常會設定有效期限,但因為我想用來定期備份而且也懶得改,所以在建立 API Key 的時候選擇 No Expiration 讓它不會過期,你可以你實際的需求設定有效期限。

取得 API Key 之後,接著就可以透過這個金鑰來存取 n8n 的 API。

Step 2:使用 n8n 公開 API

目前 n8n 支援的公開 API 列表可以在這裡找到:

從列表可以看的出來 n8n 提供的 API 可以用來做一些有趣的事,其中也包括取得所有的工作流程。取得全部工作流程的 API 路徑是 /api/v1/workflows,如果你的主機網址是 https://nnn.zeabur.app,那麼完整的 API 路徑就是 https://nnn.zeabur.app/api/v1/workflows

所以,首先我會先新增一個 HTTP Request 的節點,使用 GET 方法並且把 URL 設定成 https://nnn.zeabur.app/api/v1/workflows,這裡請依照你自己的主機名稱進行替換。n8n 的 API 需要驗證,所以你需要在 Authentication 選擇 Generic Credential Type,接著選擇 Header Auth

n8n HTTP Request

然後選擇或建立金鑰:

n8n Header Auth

Name 欄位要填寫 X-N8N-API-Key,這是 n8n API Key 的規定,Value 欄位就是貼上剛才產生的 API Key,這樣就完成了 API 的設定。透過 HTTP Request 節點,我們就可以取得這個帳號所有的工作流程,執行之後就會發現這個 API 的輸出結果是一個 JSON 格式的資料,裡面包含了所有的工作流程,這個 JSON 其實就是我們要備份的資料。

Step 3:轉存成檔案

但這一整個 JSON 檔案備份下來可能不太方便,我想要的效果是「讓每個工作流程都獨立備份成一個檔案」,所以我加了一個 Split Out 節點,把整個工作流程的 JSON 內容先拆解成 N 份。接著再加一個 Convert to File 節點把這些 JSON 資料轉存成檔案,這樣就可以把每個工作流程分別備份起來。

因為在前一個節點我用 Split Out 把內容拆成 N 份,所以在這裡的 Mode 選項要選擇 Each Item to Seperate File,這樣才可把每個工作流程都轉存成一個檔案。除了備份成各別檔案之外,我還想讓每個備份的檔案的檔名更容易被辨識,像是 我獨自備份-tX2SAp7Ij0FeOoRE.json 這樣,所以我在 Convert to File 節點的 OptionsFile Name 設定成:

{{ $json.name }}-{{ $json.id }}.json

畫面:

n8n Backup Flow

為什麼後面加 id?因為如果只用工作流程的名字來存檔的話,有可能會遇到重複的名稱,加上 id 可以避免檔名重複的情況。最後前面再加個定時觸發節點,讓它每天或每週自動備份一次,現在整個流程看起來樣子大概像這樣:

n8n Backup Flow

到這裡其實還不算完成,最後產生的檔案應該要再接 FTPAWS S3 或是 Google Drive 之類的節點,讓它自動上傳到你的伺服器或雲端硬碟,這樣就可以達到完全自動化的備份流程了。不過這後半段的流程跟待會要介紹的另一種備份方式有點類似,到時候大家可以下載我的備份流程檔案來研究。整個備份的工作流程 JSON 檔案我放在本文的最後面,如果有需要可以下載匯到你的 n8n 的畫布上再進行調整。

附帶一提,如果你是自架的 n8n,而且也沒有打算透過 API 做些什麼有趣的事,建議可以把環境變數 N8N_PUBLIC_API_DISABLED 設定成 true(預設值是 false),這樣就可以關閉 API 功能,避免被不當使用。

透過 n8n 指令備份

雖然透過 API 進行工作流程的備份還算方便,也不用寫到什麼程式碼,但 Credentials 目前並沒有 API 可以做這件事,所以如果要備份這些之前設定過的 API Key 的話,得另外想辦法。很幸運的 n8n 這個程式本身就有提供一些指令讓我們來做這件事,如果你有權限可以執行指令的話(例如透過 Zeabur 架設的),透過 n8n 的指令來進行備份會更簡單,連 API Key 都不用建立。

Step 1:匯出工作流程

基本的思路是透過 n8n export 這個系統指令匯出資料,再把匯出的檔案備份到你的伺服器或雲端硬碟上。我們先從工作流程開始,首先,先新增一個 Execute Command 節點,這個節點的用途是用來執行系統上的指令,在 Command 欄位填入:

n8n export:workflow --backup --output=/tmp/workflows

畫面:

n8n export workflows

這個指令的意思是匯出所有的工作流程--backup 參數是讓每個工作流程都匯出成一個獨立的 JSON 檔案,而 --output=/tmp/workflows 是指要把這些匯出的檔案先存放到 /tmp/workflows 目錄(目錄名稱跟位置可自己決定),待會把它們抓出來上傳。

提醒一下,雖然 Execute Command 節點可以執行系統指令很方便,但也有它的風險在,萬一執行刪除檔案的指令,剛好你又不是透過 docker 之類的容器架設的話,可能會把你的檔案都刪掉,使用前記得先確認這些指令的用途。如果你是使用 Zeabur,它本質上是透過 docker 架設的,所以這個風險比較小。

Step 2:檢查執行狀態

現在我們知道匯出的工作流程備份檔是放在 /tmp/workflows 目錄裡,但萬一 n8n export:workflow 的指令失敗的話就不會有任何檔案,所以我想先確認剛才這個匯出的指令是不是正常執行。如果指令執行成功,它的輸出結果裡有個 exitCode 的欄位應該會是 0,所以我先加了一個 If 節點,檢查 exitCode 是否等於 0,如果是的話再繼續往下執行:

n8n Read Files

除非 n8n 改版把這個指令改壞了,不然基本上這個指令應該是不會失敗才是,不過我這人就龜毛,所以還是加了一個檢查的節點比較安心。

Step 3:讀取備份檔案

n8n 有個可以用來讀取檔案的節點 Read/Write Files from Disk,這個節點可以用來讀寫檔案,路徑的欄位填寫 /tmp/workflows/*.json

n8n Read Files

最後面的 *.json 是指要讀取在 /tmp/workflows 目錄裡的所有 .json 結尾的檔案,這樣就可以讀取到剛才匯出的所有的工作流程檔案。

Step 4:備份 Credentials

剛才的 n8n export:workflow 指令只會匯出工作流程,那些之前設定的 API Key 是沒有匯出的,所以我們這裡另外再加一條流程,不過流程很像,只是指令跟路徑有一些調整而已。首先,匯出 Credentials 的指令改成:

n8n export:credentials --backup --decrypted --output=/tmp/credentials

export:workflow 改成 export:credentials--backup--output 參數跟之前的用途一樣,只是路徑我改成 /tmp/credentials。而其中的 --decrypted 參數比較特別一點,這是讓匯出的 Credentials 是解密過的,也就是說你可以看到原本設定 API Key 的內容。使用這個 --decrypted 參數要特別注意,這表示匯出的資料就是以明碼方式呈現在備份檔裡,如果有打算跟其它人分享共用的話要特別留意一下。

Step 5:備份到伺服器

不管是工作流程還是 API Key,檔案讀出來之後應該要另外存一份在別的地方(異地備援),這樣才算是真正的備份。這裡可以用 FTPAWS S3 或是 Google Drive 節點,在我的流程裡我是使用把備份檔案上傳到我自己個人的 Google Drive,不過 Google Drive 好像不會把同名的檔案蓋過去,所以我多做了一些流程判斷把舊的檔案刪掉再上傳新的版本。

同時,我在這流程裡加了幾個 Merge 的節點,目的是把工作流程跟 API Key 的備份流程都做完之後再一起進到下個階段,細節可在文未下載 JSON 檔來細看。

Step 6:刪除暫存檔

當所有的備份檔案都上傳完畢之後,我再加了一個 Execute Command 節點把剛才匯出到 /tmp 目錄的工作流程以及 Credentials 刪掉,做個善後收尾:

rm -rf /tmp/workflows /tmp/credentials

畫面:

n8n remove Backup

其實這些備份檔不清掉也不會怎樣,這些檔案都不大,佔不了多少空間,就只是我自己的個人習慣而已。你也許會好奇匯出的 API Key 不刪掉會不會有資安問題?基本上能取得這些檔案的人就等於是有辦法登入你這台機器的人,你該擔心的應該是你的機器被入侵了,而不是這些 API Key 的問題。

再次提醒,使用 Execute Command 節點執行系統指令有風險,請確認指令的用途再使用。

Step 7:定期執行及通知

最後,我在最前面加上定期執行以及最後面加個 Discord 通知,我設定每天早上 6 點 5 分定時執行備份流程,並且在備份完成後通知我一聲,這樣我就可以知道備份有沒有成功。整個流程大概會像這樣:

n8n Auto Backup

整個流程的 JSON 檔有將近六百行,同樣也是貼在本文最後面,大家可以自行下載、調整。

結論

不管是透過 API 或是指令都可以備份工作流程,該怎麼做選擇?

  • 如果你是使用 n8n.io 官方提供的線上服務:
    • 你沒機會直接備份資料庫。
    • 你只能使用 API 的方式來進行備份,線上版本沒有執行系統指令的節點可以用。
  • 如果你是自己架設的:
    • 如果你有很多台的 n8n 的機器,而且想一次備份多台的工作流程,可考慮透過 HTTP Request 節點配合 API 來進行備份。
    • 如果你想連之前設定的 API Key 也一起備份,只能透過 n8n 的指令匯出備份。
    • 如果你只有一台 n8n 的話,用 n8n 本身提供的指令來進行備份工作流程以及 API Key 會是最簡單的。

最後,沒事常備份,常備份沒事!