我在HomeAssistant的addon安裝了n8n,運行一段時間。雖然HomeAssistant是高度備份的環境,發生任何災難都可以復原,但是addon是別人的做的,萬一別人棄坑,我在HomeAssistant的n8n就沒辦法更新了,所以有好一陣子都停留在舊版本。
於是,本篇動機就產生,我要把Home Assistant上的addon n8n資料轉移,並在Synology NAS啟動,繼承過去資料以及配置。如此,我能隨心所欲升級之類的。
這邊的配置是以DDNS+Certificate+HTTPS+Webhook的部署方式,相比其他的教學,我要完成的東西不少,驗證telegrambot是否能正常運作就能確認我是不是有完整轉移過去。
n8n資料在database.sqlite,身份訊息透過檔案Config中的encryptionKey去加密,只要這兩個轉移,以及剩下自定義的外部資料,就能夠在其他地方還原n8n。

環境
HomeAssistant addon n8n:HomeAssistant addon本質可能是Container,因此,除了n8n,所有在HomeAssistant部署的Addon Container,你都可以挪到其他地方繼續運作。
Synology DS224+:具有Container Manager,只要Docker能部署,就能在Syonology NAS部署並且還原。不過Web Station會佔用443 Port,會讓有些要求只能使用Port 443的Webhook在Web Station安裝之後,將無法轉給
n8n:使用本身的HTTPS功能,以及Webhook要能接受telegram bot的訊息。telegram bot訊息要能順利接收,就要部署可信任的https環境。
asme:搭配dynu api,使用dns challenge去產生certificate,這能避免在防火牆開80 Port走http challenge產生給非目標IP能連線到Port 80的狀況發生。
dynu:DDNS網站,免費申請帳號以及API,能免費使用最多四組第三級網域。透過API,dynu可以完成DNS Challenge挑戰,使用Let’s Encrypt去產生可受信任的憑證。
步驟
Home Assistant 從 addon 備份中撈出資料
可以使用手動備份,備份檔需要包含addon「n8n」。
等備份檔產生後,下載到電腦中並解壓縮。因為Home Assistant的addon備份會連同volume一起備份,如此可以做到完美恢復,例外,addon備份檔解壓縮後也能看到volume,就不需要CLI,這一切操作都能在GUI完成。

在Synology NAS上創造docker-compose
安裝好Container Manager之後,透過File Station可以建立資料夾n8n。在n8n資料夾中,建立n8n_data以及acme-data。※後續n8n_data以及acme-data可以透過docker-compose內容調整,本文將使用此兩個作為volume name,若您夠熟悉可以自定義自己喜歡的樣子。
在Container Manager,新增專案,路徑選對應的資料夾n8n,使用建立dokcer-compose.yml,內容參考以下。



docker-compose.yml
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "443:5678"
environment:
GENERIC_TIMEZONE: "Asia/Taipei"
TZ: "Asia/Taipei"
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_PROTOCOL: "https"
N8N_SSL_CERT: "/home/node/.n8n/cert/${DOMAIN}/${DOMAIN}.cer"
N8N_SSL_KEY: "/home/node/.n8n/cert/${DOMAIN}/${DOMAIN}.key"
WEBHOOK_URL: "https://${DOMAIN}:443"
N8N_EDITOR_BASE_URL: "https://${DOMAIN}:443"
N8N_HOST: "${DOMAIN}"
N8N_SECURE_COOKIE: "false"
volumes:
- ./n8n_data:/home/node/.n8n
- ./n8n_data/cert:/home/node/.n8n/cert:ro
acme:
image: neilpang/acme.sh:latest
container_name: acme-certificate
restart: unless-stopped
environment:
TZ: "Asia/Taipei"
Dynu_ClientId: "${DYNU_CLIENT_ID}"
Dynu_Secret: "${DYNU_SECRET}"
ACCOUNT_EMAIL: "${ACME_EMAIL}"
volumes:
- ./acme-data:/acme.sh
- ./n8n_data/cert:/home/node/.n8n/cert
- ./acme-entrypoint.sh:/usr/local/bin/acme-entrypoint.sh:ro
entrypoint: ["/bin/sh", "/usr/local/bin/acme-entrypoint.sh"]
.env
DYNU_CLIENT_ID=<DYNU CLIENT_ID>
DYNU_SECRET=<DYNU CLIENT_ID>
ACME_EMAIL=<Notify Email>
acme-entrypoint.sh
#!/bin/sh
set -e
DOMAIN="<Your Domain>"
HOME_DIR="/acme.sh"
CERT_DIR="/home/node/.n8n/cert"
SLEEP_INTERVAL="12h" # 或 "24h",視續期頻率而定
# 1. 確保憑證目錄存在
mkdir -p "$CERT_DIR/$DOMAIN"
# 2. 首次申請:若憑證檔不存在,才執行 issue & install
if [ ! -f "$CERT_DIR/$DOMAIN/$DOMAIN.cer" ] || [ ! -f "$CERT_DIR/$DOMAIN/$DOMAIN.key" ]; then
acme.sh --issue --dns dns_dynu -d "$DOMAIN" --home "$HOME_DIR"
acme.sh --install-cert -d "$DOMAIN" \
--fullchain-file "$CERT_DIR/$DOMAIN/$DOMAIN.cer" \
--key-file "$CERT_DIR/$DOMAIN/$DOMAIN.key" \
--reloadcmd "docker-compose restart n8n"
fi
# 3. 無限迴圈定時續期
while true; do
# 只在到期前 30 天內才會真正去跟 Let's Encrypt 溝通續期
acme.sh --cron --home "$HOME_DIR"
# 讓憑證檔 owner 可讀寫,others 可讀
chmod 644 /home/node/.n8n/cert/$DOMAIN/$DOMAIN.cer
chmod 644 /home/node/.n8n/cert/$DOMAIN/$DOMAIN.key
echo "[`date`] 下次續期檢查在 $SLEEP_INTERVAL 後"
sleep $SLEEP_INTERVAL
done
創建專案
本docker-compose.yml配置,會讓asme先透過dynu api作為DNS challenge。
在dynu的網站中,先建立自己想要的DDNS,此DDNS的域名對應acme-entrypoint.sh中的Domain,IPv4則對應Public IP。※如果是家用數據機,使用Port Forward,轉到Synology NAS,或是轉到Firewall再轉到Synology NAS。


總之,域名解到的Public IP,要能透過Port Forward,直到n8n Container上。※筆者是一路443。
確認.env以及acme-entrypoint.sh存在於專案路徑中,在專案路徑下「./n8n_data」、「./n8n_data/Cert」與「./acme-data」建立好資料夾。
專案建立容器,acme會透過DDNS API+DNS Challenge產生憑證並且放在「./n8n_data/Cert」。n8n也會使用輸出路徑作為憑證路徑,因此,等待acme取回簽完憑證之前,n8n容器會因為沒有憑證而一直重啟。
移除Web Station
在安裝Container Manager時,會問要不要也安裝Web Stattion。
總之,最後要移除掉Web Station。如果移除Web Station,Container Manager仍不會被移除,也能正常運作。
Web Station移除後,Port 443就能被Container使用。
放回database.sqlite與Config到專案路徑
從Home Assistant的addon n8n,可以從volume找到database.sqlite與Config,將其移到(或複製到)n8n專案路徑。
然後啟動n8n就能夠讀取舊有資料,還原n8n。
專案建立

建立後,一開始acme會開始產生憑證,透過容器acme的日誌可以看到進度。
而後n8n等到憑證產生後,使用憑證做HTTPS,Contatiner才能穩定掛起來。
重點
網站部署HTTPS,要使用fullchain與key。
凡事Container,只要主要資料存於Volume,就能透過Volume資料轉移,在其他設備還原。
n8n是個工作流軟體,會搭配很多Workflow,就會造成Webhook觸發去啟動工作流,而Webhook就是其他服務商會把最新變動,以Webhook作為目的,以Https的方式去傳送。
網站的HTTPS憑證需要使用fullchain類型才能在各種裝置下都正常運作。