自動備份 n8n 工作流程及金鑰
n8n 用一陣子之後,有沒有發現你的工作流程跟設定的 API Key 也越來越多,萬一系統哪天出問題了,這些設定跟流程可能就得重來一次。如果想把這些工作流程搬到另一台機器,雖然一個一個手動複製貼到新的主機上也不是不行,但這樣的方式不僅麻煩,也容易出錯。
直接備份資料庫是個簡單的方法,但如果你的 n8n 是公司的工程師幫你架的,你不一定有機會可以直接存取或備份資料庫。是說,大家別忘了,n8n 身為一個工作流程自動化工具,我們就應該讓它自動備份,而且還是自己備份自己,這樣才是真正的自動化!先不說別的,像這種用魔法打敗魔法的方式,不覺得很有趣嗎?
本文我會展示兩種備份方式,一種是透過 n8n 本身提供的 API 來進行備份,不過如果你是自己架設的 n8n 而且有權限能執行指令(通常應該有),你也可以透過 n8n
指令來備份工作流程跟金鑰。
這篇文章可能有點長,如果不想看過程,可直接跳到最後看結論。
透過 API 備份
如果你使用的是 n8n 官方網站或是 Zeabur 之類的平台架設的服務,你可以透過 n8n 本身提供的 API 來把工作流程備份下來。
Step 1:建立 API Key
畫面左下角的 Settings
→ n8n API
,然後建立一個新的 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
:
然後選擇或建立金鑰:
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
節點的 Options
把 File Name
設定成:
{{ $json.name }}-{{ $json.id }}.json
畫面:
為什麼後面加 id
?因為如果只用工作流程的名字來存檔的話,有可能會遇到重複的名稱,加上 id
可以避免檔名重複的情況。最後前面再加個定時觸發節點,讓它每天或每週自動備份一次,現在整個流程看起來樣子大概像這樣:
到這裡其實還不算完成,最後產生的檔案應該要再接 FTP
、AWS 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
畫面:
這個指令的意思是匯出所有的工作流程,--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 改版把這個指令改壞了,不然基本上這個指令應該是不會失敗才是,不過我這人就龜毛,所以還是加了一個檢查的節點比較安心。
Step 3:讀取備份檔案
n8n 有個可以用來讀取檔案的節點 Read/Write Files from Disk
,這個節點可以用來讀寫檔案,路徑的欄位填寫 /tmp/workflows/*.json
:
最後面的 *.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,檔案讀出來之後應該要另外存一份在別的地方(異地備援),這樣才算是真正的備份。這裡可以用 FTP
、AWS S3
或是 Google Drive
節點,在我的流程裡我是使用把備份檔案上傳到我自己個人的 Google Drive,不過 Google Drive 好像不會把同名的檔案蓋過去,所以我多做了一些流程判斷把舊的檔案刪掉再上傳新的版本。
同時,我在這流程裡加了幾個 Merge 的節點,目的是把工作流程跟 API Key 的備份流程都做完之後再一起進到下個階段,細節可在文未下載 JSON 檔來細看。
Step 6:刪除暫存檔
當所有的備份檔案都上傳完畢之後,我再加了一個 Execute Command
節點把剛才匯出到 /tmp
目錄的工作流程以及 Credentials 刪掉,做個善後收尾:
rm -rf /tmp/workflows /tmp/credentials
畫面:
其實這些備份檔不清掉也不會怎樣,這些檔案都不大,佔不了多少空間,就只是我自己的個人習慣而已。你也許會好奇匯出的 API Key 不刪掉會不會有資安問題?基本上能取得這些檔案的人就等於是有辦法登入你這台機器的人,你該擔心的應該是你的機器被入侵了,而不是這些 API Key 的問題。
再次提醒,使用 Execute Command
節點執行系統指令有風險,請確認指令的用途再使用。
Step 7:定期執行及通知
最後,我在最前面加上定期執行以及最後面加個 Discord 通知,我設定每天早上 6 點 5 分定時執行備份流程,並且在備份完成後通知我一聲,這樣我就可以知道備份有沒有成功。整個流程大概會像這樣:
整個流程的 JSON 檔有將近六百行,同樣也是貼在本文最後面,大家可以自行下載、調整。
結論
不管是透過 API 或是指令都可以備份工作流程,該怎麼做選擇?
- 如果你是使用 n8n.io 官方提供的線上服務:
- 你沒機會直接備份資料庫。
- 你只能使用 API 的方式來進行備份,線上版本沒有執行系統指令的節點可以用。
- 如果你是自己架設的:
- 如果你有很多台的 n8n 的機器,而且想一次備份多台的工作流程,可考慮透過 HTTP Request 節點配合 API 來進行備份。
- 如果你想連之前設定的 API Key 也一起備份,只能透過 n8n 的指令匯出備份。
- 如果你只有一台 n8n 的話,用 n8n 本身提供的指令來進行備份工作流程以及 API Key 會是最簡單的。
最後,沒事常備份,常備份沒事!