如何安全升级n8n | Docker 升级数据不丢失指南

关于n8n 的版本升级,我至少有过 2 次惨痛的经验。

第一次升级,无脑跟着 Cursor 的指引,直接把所有的工作流给清空了。那个时候刚开始学习n8n,没有什么数据,所以也就过去了。

第二次就惨了,我有大量已经在跑的工作流,而且配置了无数的凭证,你要知道在 n8n 配置一次凭证,几乎是脱一层皮。万幸的是,我原来配置了一个定期备份 workflow 文件到 github 的工作流。不至于所有的成果全部白费。

n8n 工作流定时备份方法|含子工作流调用方法指南

但代价也是很惨痛的,因为错误升级导致数据丢失,我用了 2 天时间才把工作流和凭证给恢复了。

picture.image

后面查了资料,发现每次更新 n8n Docker 版本后数据丢失,这是一个很常见的问题,根本原因在于没有对 n8n 的数据进行持久化存储。

Docker 容器本身是“无状态”的,当通过 Docker 升级时,删除并重新创建一个容器,容器内部没有被特别保存的数据都会丢失。

picture.image

为了解决这个问题,我们需要使用 Docker 的 Volume (数据卷) 功能,将 n8n在容器内存储数据(工作流、凭证等)的目录映射到电脑(宿主机)上的一个真实目录。

这样,无论容器如何更新,数据都安全地保存在电脑上。

picture.image

以下是详细操作步骤。

第一步:备份现有数据(最重要!)

在进行任何操作之前,我们必须先从当前的 n8n 容器中将数据备份出来。

1.找到当前运行的 n8n 容器名:

打开终端,运行以下命令查看正在运行的容器。

  
docker ps

picture.image

列表中 IMAGE 为 n8nio/n8n:latest 的那一行,记下它的 NAMES,这里是 n8n。

2.执行备份命令:

n8n 的数据默认存储在容器内的 /root/.n8n 目录下。将它复制到电脑上。

在用户主目录下创建一个名为 n8n-backup 的文件夹来存放备份。

  
docker cp n8n:/root/.n8n ~/n8n-backup

picture.image

如果docker cp 命令失败了,错误提示在 n8n 容器里没有找到 /root/.n8n 这个目录。

可能意味着使用的 n8n 版本或启动配置将数据存储在了不同的位置。

接下来,进入容器内部并列出根目录下的所有文件和文件夹,这能帮助我们定位正确的 .n8n 目录。

  
docker exec n8n ls -la /home

picture.image

找到 /home 目录下的 node 目录。然后,通过以下指令查看 /home/node 目录里面有什么。

  
docker exec n8n ls -la /home/node

picture.image

如果里面有.n8n 目录,这就代表着这里是n8n 数据(工作流、凭证等)的存放位置。

接下来,开始安全地备份和升级 n8n 。

第一步:备份现有数据(使用正确路径)

现在我们使用刚刚找到的正确路径 /home/node/.n8n 来执行备份。

1. 创建备份目录并执行备份:

在主目录下创建 n8n-backup 文件夹,并将容器内的 .n8n 目录完整复制出来。

  
docker cp n8n:/home/node/.n8n ~/n8n-backup

这次 docker cp 命令执行代表所有 n8n 数据现在已经安全备份到了电脑的 ~/n8n-backup 目录下。

第二步:停止并删除旧的 n8n 容器

旧容器的数据已经备份,它的使命结束了。我们需要先停止它,然后删除它,以便后续创建新的容器。

执行以下两个命令:

  
docker stop n8n #停止名为 n8n 的容器。docker rm n8n #删除已停止的名为 n8n 的容器。

picture.image

第三步:创建永久数据目录并恢复数据

为未来的 n8n 创建一个“永久的家”,并将刚才的备份数据放进去。

1. 创建永久数据目录:

在主目录下创建一个名为 n8n-data 的文件夹。

  1. 将备份数据恢复到新目录:

将 ~/n8n-backup 里的所有内容复制到新的 ~/n8n-data 目录中。

通过以下命令完成这两个操作:

  
  mkdir -p ~/n8n-data && cp -r ~/n8n-backup/. ~/n8n-data/

picture.image

数据已成功恢复到永久数据目录中。准备工作全部完成!

第四步:启动全新的、数据持久化的 n8n 容器!

现在是激动人心的时刻。我们将启动一个全新的 n8n 容器。这次,

使用 -v 参数将您电脑上的 ~/n8n-data 目录映射到容器内部的 /home/node/.n8n 目录。

这将拉取最新的 n8n 镜像,并用已有的数据启动它。

执行以下命令:

  
  docker run -d --name n8n -p 5678:5678 -v ~/n8n-data:/home/node/.n8n n8nio/n8n:latest
  • -d: 后台运行容器。
  • --name n8n: 命名容器为 n8n。
  • -p 5678:5678: 将您电脑的 5678 端口映射到容器的 5678 端口。
  • -v ~/n8n-data:/home/node/.n8n: 【核心】 将您电脑的 ~/n8n-data 目录挂载到容器的 /home/node/.n8n 目录。
  • n8nio/n8n:latest: 使用最新的 n8n 镜像。

picture.image

操作成功!新的 n8n 容器已经启动,并且它现在直接使用您电脑上 ~/n8n-data 目录中的数据。

还是使用docker ps 来看一下,n8n最新的版本是否已经完成更新。Created 时间是 3minutes ago,说明本次更新成功。

picture.image

第五步:验证

稍等一两分钟让 n8n 完成启动,然后打开浏览器访问 http://localhost:5678。

我所有熟悉的工作流和凭证都安然无恙。

1-工作流(没丢)

picture.image

2-凭证(没丢)

picture.image

再看一下版本:

picture.image

未来的升级流程

未来的升级过程将变得极其简单:我的数据安全地保存在 ~/n8n-data 文件夹中,所以每次用第同样的方法,它都会自动加载所有工作流和凭证。

1. 停止并删除旧容器:

  
docker stop n8ndocker rm n8n

2. 拉取最新镜像:

  
docker pull n8nio/n8n:latest

3. 用完全相同的命令启动新容器:

  
docker run -d --name n8n -p 5678:5678 -v ~/n8n-data:/home/node/.n8n n8nio/n8n:latest

数据已经安全地存放在 ~/n8n-data 中,新的容器会直接加载它,整个过程无缝衔接。

另外,有一个重要信息,我原来配置n8n允许访问我的本地文件夹:/Users/mulele/Documents/4-n8ndata

如果你想保护核心数据并且允许n8n访问 /Users/mulele/Documents/4-n8ndata 文件夹,你应该使用下面这条最终版的命令来启动n8n:

  
docker run -d --restart always \    --name n8n \    -p 5678:5678 \    -v ~/n8n-data:/home/node/.n8n \    -v /Users/mulele/Documents/4-n8ndata:/data \    -e N8N\_FILESYSTEM\_ALLOW\_LIST=/home/node/.n8n,/data \    n8nio/n8n:latest
0
0
0
0
评论
未登录
暂无评论