在 NAS 上用 Docker 部署 n8n,听起来并不复杂,但不少用户在实际操作中都会遇到同一个问题:容器跑起来了,配置也完成了,结果重启容器或者更新镜像之后,之前辛辛苦苦搭好的工作流、凭证和设置全部丢失,仿佛一切从头来过。这种情况通常不是因为 n8n 本身不稳定,而是部署时忽略了几个关键的配置关系。
这篇文章会从项目目录结构开始,把持久化数据、环境变量和访问验证这几块内容串联起来,给出一个在 NAS 上可执行、可复用的部署流程,并重点说明如何避免容器重建后配置丢失。
部署前的准备:理解 n8n 的数据存储方式
n8n 默认把工作流、凭证、执行历史等数据存储在 SQLite 数据库中。如果容器被删除,这个数据库文件也会跟着消失。持久化的核心思路,就是把这个数据库文件以及 n8n 的配置文件、密钥等,从容器内部映射到 NAS 宿主机的文件系统上。
在开始部署之前,建议在 NAS 的文件管理器里创建一个专用的项目目录。例如,在 Docker 共享文件夹下新建 n8n 目录,并在其中创建 data 子目录。这个 data 文件夹就是 n8n 所有持久化数据的最终落脚点。
部署流程:从 docker-compose 到容器启动
使用 Docker Compose 是管理 n8n 最清晰的方式,尤其是当你需要在不同 NAS 设备上复现相同配置时。以下是一个基础但完整的 docker-compose.yml 示例,它已经包含了持久化卷挂载和环境变量配置。
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- ./data:/home/node/.n8n
- ./local-files:/files
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=你的安全密码
- N8N_HOST=你的NAS本地IP:5678
- N8N_PROTOCOL=http
- N8N_PORT=5678
- N8N_ENCRYPTION_KEY=一个随机生成的32位以上字符串
- WEBHOOK_URL=http://你的NAS本地IP:5678/
逐一解释关键部分:
- volumes:
./data:/home/node/.n8n是持久化的核心。n8n 默认将数据库和配置文件存储在容器内的/home/node/.n8n目录,将其映射到宿主机的./data目录后,无论容器如何重建,数据都会保留在 NAS 硬盘上。另外映射了一个./local-files:/files,方便 n8n 工作流读取或写入 NAS 上的本地文件。
- N8N_ENCRYPTION_KEY:这是最容易忽略但极其重要的变量。n8n 使用该密钥加密凭证(如数据库密码、API Token)。如果容器重建后没有使用相同的密钥,n8n 将无法解密已有的凭证,导致工作流执行失败。 生成一个随机字符串并妥善保存,之后每次部署都使用同一个值。
- N8N_BASIC_AUTH_*:为 n8n 的 Web 界面设置基本的用户名和密码认证,防止未授权访问。
- WEBHOOK_URL:如果你计划使用 n8n 的 Webhook 节点接收外部请求,这个变量必须设置为你 NAS 的本地 IP 和端口,否则外部请求可能无法正确路由。
在 NAS 的 SSH 终端或 Portainer 的 Stack 功能中,将上述内容保存为 docker-compose.yml 并执行 docker compose up -d,n8n 就会在后台启动。
验证部署:从日志到界面访问
容器启动后,先检查日志确认没有错误:
docker logs n8n
正常的日志末尾会显示 n8n 正在监听 5678 端口。随后,在浏览器中输入 http://你的NAS本地IP:5678,应该能见到 n8n 的登录界面,使用你在环境变量中设置的用户名和密码登录。
此时可以做一个快速验证:创建一个最简单的测试工作流(比如一个 Webhook 节点加一个 Set 节点),保存并执行一次,确认一切正常。
排错思路:容器重建后配置丢失怎么办
如果你发现容器重建后 n8n 变成了一个全新的实例,或者登录后看不到之前的工作流,可以从以下几个方面排查:
- 检查卷挂载路径:确认
docker-compose.yml中的宿主机路径是否正确。进入 NAS 的./data目录,查看是否存在database.sqlite文件。如果该文件不存在,说明持久化没有生效。
- 确认加密密钥一致性:如果
N8N_ENCRYPTION_KEY在重建时被改变或未设置,n8n 会认为这是一个全新的实例,并生成新的加密密钥,导致无法读取旧数据。务必在每次部署时使用完全相同的密钥。
- 文件权限问题:NAS 上的 Docker 服务默认以特定用户(如
uid:1000)运行。如果./data目录的权限不允许该用户写入,n8n 可能无法正确保存数据。在 NAS 的文件管理器中将data目录的所有者设置为nobody或直接赋予 777 权限(临时测试用),可以快速定位这类问题。
- 端口冲突:如果 5678 端口已被其他容器占用,n8n 会启动失败。可以通过
docker ps查看端口占用情况,或在ports配置中更换宿主机端口,例如"5679:5678"。
进阶建议:让 n8n 更稳定地运行
如果你对数据安全有更高要求,可以考虑将 SQLite 替换为 PostgreSQL 或 MySQL,这在多用户场景或数据量较大时性能更优。只需在 environment 中添加 DB_TYPE=postgresdb 以及对应的数据库连接变量,并额外部署一个数据库容器即可。
另外,NAS 系统(如群晖、威联通、飞牛)通常自带定时任务功能,可以设置定期备份 ./data 目录到另一个存储池或云盘,为你的自动化工作流增加一道保险。
在 NAS 上运行 n8n 并不需要复杂的云端架构,只要理清持久化、密钥和权限这三者之间的关系,就能轻松实现工作流的稳定运行与安全迁移。

评论(1)
加密密钥这点很容易忘,确实得单独记好。