最近在Synology上部署很多的Docker,也持續使用中,像是N8N與FireFly III與ADGuard Home。
不過N8N最近出現兩次工作流丟失,辛辛苦苦建立的再一次重啟就消失了,慘慘慘。
第一次發生後,我馬上做備份,不過備份是不停機備份,然後也倒不回去。
接下來會提供一個範例腳本,能讓容器正常地停下來,不會觸發通知,然後壓縮備份後放在指定資料夾,再打開容器。
良好的備份環境
- 檔案目錄盡量外掛,方便直接修改與備份。建議直接掛載同專案資料夾的資料夾。
- 至少要做過一次復原練習。
- 備份檔放在雲端上,保存一定數量,定期清理過舊的檔案。
- 透過synowebapi停止容器,可以避免跳出通知。
腳本 以FireFly III 為例
在工作排程器,使用Root權限,執行,依序停止容器,壓縮備份,依序啟動容器。
容器名稱與路徑可以依據需求修改。
#!/bin/bash
# =========================================
# Firefly III 安全備份腳本(不觸發 Synology 警告)
# 停 importer → 停 app → 停 DB
# 再啟 DB → app → importer
# =========================================
# === Docker 容器名稱 ===
DB_CONTAINER="firefly-db"
APP_CONTAINER="firefly-iii"
IMPORTER_CONTAINER="firefly-importer"
# === 目錄設定 ===
SRC="/volume3/docker/firefly_iii"
DEST="/volume3/JN_NAS_Pro/FireFlyIII_Backup"
mkdir -p "$DEST"
# === 日期變數 ===
DATE=$(date +"%Y%m%d")
FILENAME="FireFlyIII_backup_${DATE}.tar.gz"
echo "======================================="
echo "🚫 優雅停止 Firefly III 容器(透過 synowebapi,Synology 不會跳警告)"
echo "======================================="
# 使用 synowebapi 停止容器
# name 需加上跳脫的雙引號,避免出現「Not a json value」警告
# 例如:name="\"CONTAINER_NAME\"" :contentReference[oaicite:1]{index=1}
synowebapi --exec api=SYNO.Docker.Container version=1 method=stop name="\"$IMPORTER_CONTAINER\""
if [ $? -ne 0 ]; then
echo "錯誤:停止容器 $IMPORTER_CONTAINER 失敗,停止備份流程。"
exit 1
fi
synowebapi --exec api=SYNO.Docker.Container version=1 method=stop name="\"$APP_CONTAINER\""
if [ $? -ne 0 ]; then
echo "錯誤:停止容器 $APP_CONTAINER 失敗,停止備份流程。"
exit 1
fi
synowebapi --exec api=SYNO.Docker.Container version=1 method=stop name="\"$DB_CONTAINER\""
if [ $? -ne 0 ]; then
echo "錯誤:停止容器 $DB_CONTAINER 失敗,停止備份流程。"
exit 1
fi
echo "======================================="
echo "📦 建立 Firefly III 備份:$FILENAME"
echo "======================================="
tar -czf "${DEST}/${FILENAME}" -C "$(dirname "$SRC")" "$(basename "$SRC")"
if [ $? -ne 0 ]; then
echo "錯誤:tar 建立備份失敗!請檢查磁碟空間與路徑。"
exit 1
fi
echo "======================================="
echo "🚀 重新啟動 Firefly III 容器(透過 synowebapi)"
echo "======================================="
# 順序:先 DB → App → Importer
synowebapi --exec api=SYNO.Docker.Container version=1 method=start name="\"$DB_CONTAINER\""
if [ $? -ne 0 ]; then
echo "錯誤:啟動容器 $DB_CONTAINER 失敗!"
exit 1
fi
sleep 3
synowebapi --exec api=SYNO.Docker.Container version=1 method=start name="\"$APP_CONTAINER\""
if [ $? -ne 0 ]; then
echo "錯誤:啟動容器 $APP_CONTAINER 失敗!"
exit 1
fi
sleep 2
synowebapi --exec api=SYNO.Docker.Container version=1 method=start name="\"$IMPORTER_CONTAINER\""
if [ $? -ne 0 ]; then
echo "錯誤:啟動容器 $IMPORTER_CONTAINER 失敗!"
exit 1
fi
echo "======================================="
echo "🧹 清理日備份(保留最近 14 份)"
echo "======================================="
cd "$DEST" || exit 1
ls -1t FireFlyIII_backup_2*.tar.gz | sed -e '1,14d' | xargs -r rm --
# === 記錄日誌 ===
echo "$(date '+%Y-%m-%d %H:%M:%S') Backup completed: ${FILENAME}" >> "${DEST}/backup.log"
echo "🎀 Firefly III 備份完成,透過 synowebapi 不會觸發 Synology Docker 容器異常警告~"
依此類推,改成自己喜歡的樣子
個人會使用排程,確保容器的資料可以定時備份。
