> ## Content Index
> Fetch the complete content index at: https://qilinora.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# 数据卷不是文件夹：你敢重装 n8n，是因为知道数据不会丢
- URL: https://qilinora.com/shu-ju-juan-bu-shi-wen-jian-jia-ni-gan-zhong-zhuang-n8n-shi-yin-wei-zhi-dao-shu-ju-bu-hui-diu/
- Published: 2026-08-23T00:24:27.000Z
- Updated: 2026-08-23T00:24:27.000Z
- Author: Liyaoming
- Tags: n8n, Docker

你可能已经把 n8n 跑起来了。工作流能执行，接口也接好了，甚至已经自动帮你整理表格、发送通知、同步内容。

然后有一天，你看到 Docker Desktop 提示镜像可以更新。你想点击更新，却突然不敢动。

你真正担心的并不是“更新会不会失败”。你担心的是：**万一我重装容器，前几天做好的工作流、登录过的账号、保存的凭据，会不会全部没了？**

这正是很多人第一次接触 Docker 时最容易踩的坑：他们以为“容器正在运行”，就等于“数据已经安全”。其实不是。

今天这篇文章只解决一件事：**让你的 n8n 像住进一间可以随时翻新的房间，但所有重要资料都放在房间外的独立储物柜。**

这样以后升级、重启、重建容器时，你不会再因为害怕丢数据而不敢操作。

---

## 先给你一个最重要的结论

> 容器负责运行 n8n；数据卷负责保存 n8n 的资料。容器可以换，数据卷不能乱删。

你可以把 Docker 容器理解成一间租来的房间。

这间房里有桌子、椅子、灯，也就是 n8n 程序本身。房间旧了、装修坏了、想换新版本，最简单的方式不是在旧房间里一直补，而是把这间房拆掉，再按同一套图纸搭一间新的。

问题来了：你放在房间里的文件、证件、钥匙怎么办？

如果它们都留在房间里，房间拆掉时，东西当然也没了。

所以现实生活里，你会把重要资料放进一个**独立储物柜**。房间可以换，储物柜一直在；新房间建好后，再把这只储物柜接回来就行。

在 Docker 里，这只独立储物柜就叫 **volume，也就是数据卷**。

| 你看到的东西       | 用生活化的话解释         | 它真正负责什么           |
| ------------ | ---------------- | ----------------- |
| 容器 Container | 你现在正在使用的一间房      | 运行 n8n 这个程序。      |
| 镜像 Image     | 这间房的标准装修图纸       | 决定程序和基础环境是什么样。    |
| 数据卷 Volume   | 房间外独立上锁的储物柜      | 保存工作流、配置和应用数据。    |
| 加密密钥         | 打开储物柜里“机密文件”的主钥匙 | 让 n8n 能够读回保存过的凭据。 |

Docker 官方对 volume 的定义很直接：它是由 Docker 管理的持久化数据存储，生命周期独立于容器。也就是说，容器删除后，只要 volume 没删，数据通常仍然在。[Docker 官方说明](https://docs.docker.com/engine/storage/volumes/?ref=qilinora.com)

---

## 先别写代码：你到底想保住什么？

如果你只是打开 n8n 看一看，随时可以从头来过，那不一定需要担心数据。

但只要你做过下面任意一件事，就应该使用数据卷：

- 你已经搭好工作流，不想下次重新连一遍节点。
- 你在 n8n 里保存过 API Key、账号密码或 OAuth 登录信息。
- 你希望 Docker 重启后，n8n 仍然是原来的样子。
- 你准备把 n8n 从一台电脑迁到 NAS 或服务器。

如果你属于其中任何一种，下面的配置不是“可选优化”，而是**应该从一开始就写好**的基础配置。

---

## 你只需要看懂这一行

在 `compose.yaml` 中，找到 n8n 服务，然后加上：

```yaml
volumes:
  - n8n_data:/home/node/.n8n

```

第一次看这行很容易紧张。其实它只有一句人话：

> **把叫作 `n8n_data` 的独立储物柜，接到 n8n 房间里保存资料的位置。**

左边和右边分别是什么？

```yaml
n8n_data:/home/node/.n8n

```

| 位置                 | 它是什么          | 你可以怎样理解                      |
| ------------------ | ------------- | ---------------------------- |
| 左边 n8n\_data       | 数据卷的名字        | 储物柜的编号。你给它起什么名字都可以，但最好一眼能看懂。 |
| 右边 /home/node/.n8n | n8n 在容器中的数据目录 | n8n 房间里那个专门放资料的柜子位置。         |

你不需要记住右边这串路径从哪来。对 n8n 来说，`/home/node/.n8n` 是它保存重要资料的常用位置；你现在做的不是修改 n8n，而是告诉 Docker：**这个位置的资料不要只放在临时房间里，要同步放进独立储物柜。**

---

## 跟着做：用最稳妥的方式给 n8n 加上数据卷

下面的步骤请慢一点做。每完成一步，你都知道自己在保护什么。

### 第 1 步：找到你的 n8n 文件夹

找到之前放 `compose.yaml` 的目录。它可能在桌面、文稿、NAS 的某个应用目录，或者你自己创建的 `n8n` 文件夹中。

如果你现在还没有 `compose.yaml`，可以新建一个文件夹，例如：

```
n8n-docker

```

后面的文件都放进这里。把它想成“这栋 n8n 小楼的物业办公室”。

### 第 2 步：创建或打开 `compose.yaml`

把下面这段完整配置复制进去。先不要急着改每一行，后面会逐行解释。

```yaml
services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=Asia/Shanghai
      - TZ=Asia/Shanghai
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

```

你会发现，最下面还有两行：

```yaml
volumes:
  n8n_data:

```

它们的意思是：**物业系统，请为我登记一只叫 `n8n_data` 的独立储物柜。**

上面那一段是“房间里要接这只柜子”，最下面这一段是“这只柜子本身要存在”。两部分都要有。

### 第 3 步：再创建一个 `.env` 文件

在同一个文件夹中创建一个名为 `.env` 的文件。注意：它前面有一个英文句点，而且没有 `.txt` 后缀。

写入：

```
N8N_ENCRYPTION_KEY=请替换成你自己生成的一长串随机字符

```

这串 `N8N_ENCRYPTION_KEY` 不要随便复制教程里的示例，也不要每次重装时换一个新的。

把它想成储物柜中“加密文件的主钥匙”。你的 n8n 数据卷可能还在，但如果主钥匙换了，之前保存的一些机密凭据就可能无法正确读取。

你可以先用密码管理器生成一串较长的随机字符，然后保存到安全的地方。**不要把真实密钥截图、发到群里，或提交到公开 GitHub。**

### 第 4 步：启动 n8n

在这个文件夹中打开终端，输入：

```bash
docker compose up -d

```

这句话的意思是：

> 请物业根据配置册，把这间 n8n 房间和它的独立储物柜一起准备好，并在后台运行。

第一次启动时，Docker 会自动创建 `n8n_data` 数据卷。你不需要手动去电脑某个隐藏目录里建文件夹。

### 第 5 步：确认储物柜真的已经接上

输入：

```bash
docker volume ls

```

你会看到一个名字中带有 `n8n_data` 的数据卷。Compose 有时会在前面加上项目文件夹名，这是正常的。

再输入：

```bash
docker compose ps

```

如果 n8n 状态是 `running` 或 `Up`，就可以在浏览器打开：

```
http://localhost:5678

```

此时请创建一个名字很容易辨认的测试工作流 ，例如：

```
数据卷测试，请不要删除

```

它不是无意义的测试。下一步我们会用它验证：房间换了，资料是否还在。

---

## 最关键的一次验证：不是看它能不能启动，而是看它能不能回来

很多人部署完就停在“能打开网页”这一步。但真正让你放心的，是确认数据可以跟着储物柜回来。

在测试环境中，执行：

```bash
docker compose down

```

这会停止并移除当前容器。先别紧张：你没有写 `-v`，所以数据卷不会被删除。

然后再执行：

```bash
docker compose up -d

```

再次打开 n8n。如果刚才创建的“数据卷测试，请不要删除”工作流还在，说明你已经成功完成了最重要的一件事：**容器可以重建，但数据没有跟着容器一起消失。**

这就是以后更新镜像、迁移环境、修复容器时，你敢动手的底气。

---

## 这几个词看起来像技术，其实都很好理解

### `restart: unless-stopped` 是什么？

它像物业恢复供电后，会重新打开原本还在营业的店铺。

当电脑或 Docker Desktop 重启时，Docker 会尝试再次启动 n8n；但如果你曾经手动把 n8n 停掉，它会尊重你的决定，不会强行把它再次打开。

它不能解决所有故障，但能避免“电脑重启一次，n8n 就忘记启动”这种低级麻烦。

### 为什么建议先写 `127.0.0.1:5678:5678`？

它表示 n8n 先只允许当前这台电脑访问。

你可以把它理解为：大楼门牌只对自己家的门铃生效，局域网里其他设备暂时按不到。对于刚开始学习的人，这是一种更稳妥的默认设置。

等你未来需要从外网访问 n8n，再单独学习域名、HTTPS、反向代理和登录保护。不要为了“先能访问”就直接把管理后台暴露到公网。

---

## 你最容易犯的 4 个错误，我提前替你避开

### 错误一：只写了上面的挂载，没有写最下面的 `volumes`

你可能写了：

```yaml
volumes:
  - n8n_data:/home/node/.n8n

```

却忘了最末尾：

```yaml
volumes:
  n8n_data:

```

这就像你告诉搬运工“把东西放进 12 号储物柜”，却没有让物业登记 12 号柜。Compose 往往会直接报错，或者配置无法通过检查。

### 错误二：执行了 `docker compose down -v`

普通的：

```bash
docker compose down

```

相当于把房间暂时拆掉，但储物柜还在。

而带 `-v` 的：

```bash
docker compose down -v

```

相当于拆房时连储物柜一起清空。

除非你明确要从零开始测试，否则不要把 `-v` 当作常规关闭命令。

### 错误三：重建后 n8n 能打开，但以前的凭据提示异常

先检查 `.env` 中的 `N8N_ENCRYPTION_KEY` 是否和以前相同。

这不是“数据卷失效”，更像是你仍然拿着同一个储物柜，却换掉了机密文件的钥匙。工作流可能还在，但涉及加密凭据的内容会受到影响。

### 错误四：我在电脑上找不到 volume 文件夹，是不是它没保存？

不一定。Named volume 是 Docker 管理的储物柜，不建议新手直接进入 Docker 的内部目录修改文件。你应该通过下面的命令确认它存在：

```bash
docker volume ls

```

如果想查看某个 volume 的详细信息：

```bash
docker volume inspect 数据卷名称

```

先让 Docker 管理它，比你直接在隐藏目录中翻找更安全、更不容易误删。

---

## 你现在已经拿到的，不只是一个配置

很多教程会把 `volumes` 当成 YAML 里一个小小的字段。但对真正开始使用 n8n 的人来说，它决定的是：你以后敢不敢升级、敢不敢迁移、敢不敢修复故障。

现在请你记住这句话：

> **程序住在容器里，成果住在数据卷里。**

只要这个边界清楚，Docker 就不再是“删了就怕全没”的黑箱，而会成为一种你可以安心管理的工具。

下一篇我们会把 n8n、数据库、端口、网络和数据卷全部写进同一份 `compose.yaml`。你会第一次真正看懂：为什么一份配置文件，可以把一套应用完整地搭起来。