# 用 Docker 自托管 n8n：安装、数据卷和更新

> 用 Docker 自托管 n8n，就是运行 n8nio/n8n 镜像，发布 5678 端口，再把一个卷挂载到 /home/node/.n8n，这样更新之后工作流和凭据都还在。n8n 的文档现在推荐，长期运行的部署用 Docker Compose，或者用一行命令的脚本来搭好。打开 http://localhost:5678，创建所有者账号就行。

Mindket 编辑部 · 发布于 2026-11-04 · 更新于 2026-11-05 · https://mindket.com/cn/learn/n8n/self-host-n8n-docker

## 要点

- 在 Docker 里启动 n8n，并在 5678 端口打开编辑器。
- 把数据放在卷里，更新永远不会把它清掉。
- 先设好时区、Webhook 地址和其他重要的环境变量。
- 用 n8n 文档给出的命令备份、更新和停止 n8n。

## 开始之前

你需要 Docker。Mac、Windows 或 Linux 上的 [Docker Desktop](https://docs.docker.com/get-started/get-docker/) 自带 Docker Engine 和 Docker Compose，n8n 的 [Docker 页面](https://docs.n8n.io/deploy/host-n8n/install-options/install-with-docker)就是按这个前提写的。

走 Compose 这条路，需要带 Compose v2 的 Docker Engine，所以 `docker compose version` 应该能打印出版本号，另外 n8n 说它这套服务至少需要 4 GB 内存和 2 个 vCPU。

在 Windows 上，n8n 让你用 WSL，并配合 Docker Desktop 的 WSL2 后端。自托管到底适不适合你，许可证允许做什么，[什么是 n8n](https://mindket.com/cn/blog/what-is-n8n)里有讲。简单说，给自己的业务用没问题，托管起来让客户自己搭工作流就不行。

## 在 Docker 里启动 n8n 的三种方式

n8n 的[安装方式](https://docs.n8n.io/deploy/host-n8n/install-options)列出了一行命令安装、Docker Compose、npm、普通 Docker 和云服务商。[一行命令安装的页面](https://docs.n8n.io/deploy/host-n8n/install-options/one-line-setup)说，从 n8n 3.0 起，旧的 npm 方式对全新安装已经不再适用，n8n 只通过 Docker 分发。已有的 npm 安装还能继续用。

这个版本现在处于抢先体验阶段，[发布公告](https://blog.n8n.io/introducing-n8n-v3/)说稳定版 12 月初推出。

README 的快速入门把一行脚本和两条命令的 Docker 运行并排放着。n8n 自己的 Docker 页面把普通的 docker run 标成了过时，并指向 Compose，所以下面的 run 命令，当作试用 n8n 的办法就好。

**改变自托管方式的几次发布**

1. **2025年12月8日** n8n 2.0。一次带破坏性变更的大版本，跨大版本升级之前先读发布说明。
2. **2026年8月21日** 一条命令自托管。n8n 发布一行命令安装，自带 n8n Assistant，已经在跑的实例加上 `--upgrade` 就能升级。
3. **2026年10月27日** n8n 3.0 抢先体验。自托管的 n8n 只跑在 Docker 上，npm 安装不再支持。稳定版预计 12 月初推出。

来源：[n8n Docs: Release notes](https://docs.n8n.io/changelog/release-notes) (2026-11-05 查阅)；[n8n.io on X: one command to self-host n8n, 21 August 2026](https://x.com/n8n_io/status/2090756675472949712) (2026-11-05 查阅)；[n8n Blog: Introducing n8n 3.0](https://blog.n8n.io/introducing-n8n-v3/) (2026-11-05 查阅)

| 方式 | 你得到什么 | n8n 怎么说 |
| --- | --- | --- |
| docker run | 一个带数据卷的容器 | 文档页面被标成过时，并推荐使用 Docker Compose |
| 一行命令安装 | 一个脚本写好 `compose.yml` 和 `.env`，再用 SQLite 启动 n8n | 内置的 SQLite 数据库和自带的沙盒适合测试，生产环境要用 Postgres |
| Docker Compose | 同样这套服务，变成你自己保存、可以修改的文件，Postgres 可选 | 推荐的方式，至少 4 GB 内存和 2 个 vCPU |

## 用 docker run 运行 n8n

下面这条命令是 n8n 自己的快速入门，出自它的 [Docker 页面](https://docs.n8n.io/deploy/host-n8n/install-options/install-with-docker)。把两处时区占位符都换成你的时区。`--rm` 会在容器停止时把容器删掉，所以数据必须放在卷里。

````bash
docker volume create n8n_data

docker run -it --rm \
 --name n8n \
 -p 5678:5678 \
 -e GENERIC_TIMEZONE="<YOUR_TIMEZONE>" \
 -e TZ="<YOUR_TIMEZONE>" \
 -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
 -v n8n_data:/home/node/.n8n \
 n8nio/n8n
````

1. [安装 Docker](https://docs.docker.com/get-started/get-docker/)，并确认 Docker 守护进程在运行。
2. 用上面的命令创建卷并启动容器，两处都填上你的时区。
3. 打开 `http://localhost:5678`，完成所有者设置。第一个完成设置的人就是所有者。
4. 搭一个小工作流，停止容器，再把同样的命令运行一遍。工作流还在，因为它存在卷里，不在容器里。
5. 想让 n8n 在后台一直运行，就加上 `-d`，n8n 在自己的更新步骤里也是这样做的。

## n8n 推荐的方式：一行命令安装和 Compose

[一行命令安装](https://docs.n8n.io/deploy/host-n8n/install-options/one-line-setup)会先检查 Docker 是否在运行，在当前目录下创建一个 `n8n` 文件夹，写入 `compose.yml`、`searxng-settings.yml` 和带有自动生成密钥的 `.env`，然后下载并启动 n8n 及其沙盒服务。它打印出网址后，打开那个网址就行。你的数据在 `./n8n` 和 Docker 卷 `n8n-data` 里。

真正代表 n8n 的那个服务很短。在脚本下载的[这份 Compose 文件](https://raw.githubusercontent.com/n8n-io/n8n/master/docker/get-n8n-compose.yml)里，它拉取 `docker.io/n8nio/n8n:${N8N_VERSION}`，发布 `5678:5678`，读取 `.env`，并把 `n8n-data` 挂载到 `/home/node/.n8n`。其余几个服务是为 n8n Assistant 和 Code 节点的任务准备的。只有 n8n 自己的端口应该对互联网开放。

这个脚本不能在命令提示符或 PowerShell 里运行，n8n 也没有验证过 Git Bash，所以 Windows 上要用 WSL。想自己写这些文件，就照着 [Compose 指南](https://docs.n8n.io/deploy/host-n8n/install-options/install-using-docker-compose)做：填好 `.env`，创建 `searxng-settings.yml`，从 n8n 的仓库取得 `compose.yml`，再运行 `docker compose up -d`。

````bash
# fresh install: creates ./n8n with compose.yml and .env, then starts n8n
curl -fsSL https://get.n8n.io | sh

# stop it, then start it again
docker compose -f ./n8n/compose.yml down
docker compose -f ./n8n/compose.yml up -d

# upgrade, keeping your data, secrets and settings
curl -fsSL https://get.n8n.io | sh -s -- --upgrade
````

## 数据存在哪里，怎么备份

n8n 把所有东西都放在一个 `.n8n` 文件夹里。里面有 `config` 文件，存着加密你凭据的密钥，默认配置下还有 SQLite 数据库。在 Docker 里，这个文件夹就是挂载在 `/home/node/.n8n` 的 `n8n_data` 卷，这是[备份指南](https://docs.n8n.io/deploy/host-n8n/keep-n8n-running/backup-and-restore)里写的。没有对应的密钥，恢复出来的数据库或加密导出的文件都解不开。

> **安装当天就存好加密密钥**
>
> 安装当天就把 config 文件复制一份，或者设置你自己的 `N8N_ENCRYPTION_KEY`。第一个凭据出现之前存好密钥，不花任何代价。等到磁盘坏了，就没有东西可存了。

- 用 SQLite 时，复制文件夹之前先停掉 n8n。n8n 正在写入数据库时去复制，可能得到不一致的备份。
- 只备份工作流和凭据，运行 `n8n export:workflow --backup --output=backups/workflows/` 和 `n8n export:credentials --backup --output=backups/credentials/`，两条命令各用各的输出文件夹。
- 在容器里，`backups/` 文件夹不会被保留。重新创建容器之前，先把文件复制出来。
- CLI 备份不包含用户和角色、执行记录、变量和实例设置。它可以把工作流迁到别的实例，却没法重建一个实例。
- 每次更新之前，先做一次完整备份。

## 最先要设置的环境变量

每个变量，在 `docker run` 命令里用 `-e` 传入，时区那几行就是这样，用 Compose 则写进 `.env`。按[代理页面](https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/configuration-examples/configure-webhook-urls-with-reverse-proxy)的说法，在反向代理后面，n8n 还要求最后一层代理设置 `X-Forwarded-For`、`X-Forwarded-Host` 和 `X-Forwarded-Proto` 这几个请求头。

| 变量 | 作用 | 什么时候设置 |
| --- | --- | --- |
| `GENERIC_TIMEZONE` | 基于时间的节点（比如 Schedule Trigger）使用的时区 | 一定要设，这样早上 8 点才是你的 8 点 |
| `TZ` | 容器的系统时区 | 和上一个一起设 |
| `N8N_WEBHOOK_URL` | n8n 在编辑器里显示、并登记给外部服务的公开基础网址。它取代 `WEBHOOK_URL`，后者从 n8n 2.35.0 起已弃用 | n8n 在反向代理后面时 |
| `N8N_PROXY_HOPS` | n8n 前面有几层反向代理，文档的示例把它设成 1 | n8n 在反向代理后面时 |
| `N8N_ENCRYPTION_KEY` | 你自己的凭据加密密钥 | 添加第一个凭据之前 |
| `N8N_PAYLOAD_SIZE_MAX` | 请求体的最大值，单位 MiB，默认 16，重启后生效 | Webhook 要接收更大的文件时 |
| `DB_TYPE` 与 `DB_POSTGRESDB_*` | 把数据库从 SQLite 换成 PostgreSQL | 团队或生产环境 |

## 更新时不丢任何东西

n8n 建议至少每月更新一次，因为几次小更新，比一次跨度很大的更新风险小。更新前先看发布说明里有没有破坏性变更，条件允许的话，先在测试实例上试一遍。[它的更新指南](https://docs.n8n.io/deploy/host-n8n/keep-n8n-running/update-n8n)把下面这些命令指向了 Docker 页面。

`n8nio/n8n` 这个标签是稳定版，`n8nio/n8n:next` 是不稳定版。凡是你要依赖的环境，我们会固定一个版本号，而不是跟着标签走，这样什么时候更新由你决定。Compose 这条路本来就是这样，版本号写在 `.env` 的 `N8N_VERSION` 里。

````bash
# a container started with docker run
docker pull n8nio/n8n
docker ps -a
docker stop <container_id>
docker rm <container_id>
docker run --name=<container_name> [options] -d n8nio/n8n

# a Docker Compose project
docker compose pull
docker compose down
docker compose up -d
````

- 换容器的时候，卷会保留。没挂卷就启动的容器，是空的。
- 一行命令的 `--upgrade` 只修改 `.env` 里的 `N8N_VERSION` 和 `N8N_SANDBOX_VERSION`，你的数据、密钥和设置都不动。

## n8n 团队怎么说一行命令安装和 n8n 3.0

2026 年 8 月 21 日，n8n 团队[在 X 上发布了一行命令安装](https://x.com/n8n_io/status/2090756675472949712)。卖点是一条命令装好，AI Assistant 也包含在内，不用写 Compose 文件，也不用配环境变量。对已经在跑的实例，帖子的建议是同一条命令加上 `--upgrade`，也就是安装代码的最后一行。

2026 年 10 月 28 日，团队[在 X 上宣布下一个大版本进入 beta](https://x.com/n8n_io/status/2115459582042534340)。帖子说，这一版没有一堆新功能，而是提升可靠性、稳定性和安全性，再把一年来攒下的破坏性变更一次放进来，稳定版 12 月初推出。

Ophir Prusak 在 n8n 博客上写的[发布公告](https://blog.n8n.io/introducing-n8n-v3/)说，自托管的 n8n 现在跑在 Docker 上，npm 和 `npx n8n` 安装不再支持。把在跑的实例升级到新版本之前，先更新到最新的 2.x，再打开 **Settings** 里的 **Migration Report**，它需要 2.39 或更高版本。先做一次完整备份，公告说得很直白：想退回去，只能靠恢复备份。

> 已经在自托管了？同一条命令，加上 --upgrade。
>
> n8n.io, n8n 的官方账号，引文为译文, [X](https://x.com/n8n_io/status/2090756675472949712) (2026-11-05 查阅)

[![n8n.io（@n8n_io）2026 年 8 月 21 日在 X 上的帖子：一条命令自托管 n8n，自带 AI Assistant，用的是 n8n 的 curl 一行命令。不用 Compose 文件，不用环境变量。填上模型密钥，就能用大白话搭工作流。已经在自托管了？同一条命令，加上 --upgrade。](https://mindket.com/blog/shots/x-n8n-io-one-command-self-host.webp?v=76ca6414403a)](https://x.com/n8n_io/status/2090756675472949712)

n8n.io 在 X 上，2026 年 8 月 21 日

[![n8n.io（@n8n_io）2026 年 10 月 28 日在 X 上宣布 n8n 3.0 进入 beta：没有一堆亮眼的新功能，而是更好的可靠性、稳定性和安全性，再加上过去一年攒下的所有破坏性变更，放进一个大版本。稳定版 12 月初推出。](https://mindket.com/blog/shots/x-n8n-io-3-0-beta.webp?v=73c5e6a23d2a)](https://x.com/n8n_io/status/2115459582042534340)

n8n.io 在 X 上，2026 年 10 月 28 日

> X 官方嵌入卡片的截图，拍摄于 2026 年 11 月 5 日，时间为 UTC。点击截图可到 X 上打开原帖。

## 常见错误

- 运行时没挂卷。没有 `-v n8n_data:/home/node/.n8n`，你的工作流和凭据就跟着容器一起消失。
- 变量名拼错。正确的名字是 `N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS`，n8n 的页面还特意说明，不是 `N8N_ENFORCE_SETTINGS_PERMISSIONS`。
- 为了重启而在 `docker compose down` 后面加 `-v`。这个参数会删除 n8n 的全部数据，n8n 只在卸载那一步列出它。
- 换成 Postgres，还指望工作流跟过去。已有的 SQLite 数据不会迁移。`n8n_data` 也要继续挂载，因为这个文件夹里仍然有加密密钥、日志和源代码管理的资源。
- 开放了 n8n 自己那个端口以外的端口。Compose 里的沙盒运行器是特权容器，n8n 说它实际上等同于宿主机的 root。
- 在 PowerShell 里运行一行命令脚本，或者把 Compose 项目放在 WSL 的 `/mnt/c` 下。要用 WSL，并把项目放在它自己的文件系统里。

## 自己试一试

- 带上你的时区启动 n8n，重建[第 1 课](https://mindket.com/cn/learn/n8n/n8n-first-workflow)里的定时任务，确认 8 点真的是你这边的 8 点。
- 停掉容器再重新创建，确认你的工作流还在。
- 在容器里运行备份指南里的导出命令，再把结果复制到宿主机上。
- 重建第 2 课里的 Webhook，对比编辑器显示的网址和你实际使用的地址。
- 打开一行命令脚本写出的 `compose.yml`，找到里面的卷和端口。

## 接下来学什么

到这里，你有了一个在运行的 n8n、第一个工作流、一个 Webhook 和一个智能体。下一门课是 [n8n 进阶课](https://mindket.com/cn/learn/n8n-advanced)，从[错误工作流](https://mindket.com/cn/learn/n8n-advanced/n8n-error-handling)学起。Error Trigger、重试和 Stop And Error，能让自己运行的工作流出了错，不至于没人发现。接着这门课还会讲子工作流、Code 节点，以及用队列模式来扩展。想先给新服务器找点事做，可以从 [Mindket 的 n8n 工作流](https://mindket.com/cn/automations/n8n)里[导入一个 n8n 工作流](https://mindket.com/cn/blog/import-n8n-workflow)，在你自己的编辑器里打开它。

## 自测一下

1. 你用 docker run 运行 n8n，之后又重新创建了容器。数据必须放在哪里才能保住？

   A. 容器里的一个 backups 文件夹
   B. 挂载在 /home/node/.n8n 的卷
   C. n8nio/n8n 镜像
   D. 5678:5678 这个端口映射

   答案：B。 --rm 会在容器停止时把容器删掉，所以工作流和凭据必须放在挂载于 /home/node/.n8n 的卷里。

2. 要让基于时间的节点在你自己的早上 8 点触发，该设置哪个变量？

   A. N8N_WEBHOOK_URL
   B. N8N_PROXY_HOPS
   C. N8N_PAYLOAD_SIZE_MAX
   D. GENERIC_TIMEZONE

   答案：D。 GENERIC_TIMEZONE 设置 Schedule Trigger 这类节点使用的时区，文档里还要同时给容器设置 TZ。

3. 为什么安装当天就要复制 config 文件，或者设置你自己的 N8N_ENCRYPTION_KEY？

   A. 没有对应的密钥，恢复出来的数据库或导出文件都解不开
   B. 这样 n8n 启动更快
   C. 没有它，Docker 会拒绝拉取镜像
   D. 这样 Webhook 能接收更大的文件

   答案：A。 config 文件里存着加密凭据的密钥，等到磁盘坏了，就没有东西可存了。

4. 你只想重启一个 Compose 项目，哪条命令却会删掉你全部的 n8n 数据？

   A. docker compose down
   B. docker compose up -d
   C. docker compose down -v
   D. docker compose pull

   答案：C。 -v 参数会删除数据卷，n8n 只在卸载那一步列出它。

## 常见问题

### n8n 用的是哪个 Docker 镜像？

`n8nio/n8n`。README 里写的是 `docker.n8n.io/n8nio/n8n`，Compose 文件拉取的是 `docker.io/n8nio/n8n`，版本取自 `.env`。还有一个 `next` 标签，对应不稳定的构建，两种快速入门都在 [README](https://github.com/n8n-io/n8n) 里。

### 怎么确认 n8n 已经在运行？

在 Compose 的部署里，运行 `docker compose ps`，等到 sandbox-api 显示 healthy。然后运行 `curl -sf http://localhost:5678/healthz`，或者在浏览器里打开 `http://localhost:5678`，[Compose 指南](https://docs.n8n.io/deploy/host-n8n/install-options/install-using-docker-compose)就是这么验证的。

### 自托管的 n8n 需要单独的数据库吗？

不需要。它自带 SQLite，起步够用。n8n 建议团队和生产环境用 Postgres，以后再换，旧的 SQLite 数据是留在原处的。

### 一行命令安装里多出来的那些容器是什么？

除了 n8n，这套服务还会启动一个代码沙盒、一个运行 Code 节点任务的运行器和一个搜索工具。它们为 n8n Assistant 服务，在你填入 AI 服务商的密钥之前，Assistant 保持关闭。沙盒运行器是特权容器，千万不要公开它的端口。

### 能用 Podman 或 Colima 代替 Docker 吗？

可以，只要是兼容 Docker 的引擎。一行命令安装的页面说，要安装带 compose 插件的 docker CLI，再把 DOCKER_HOST 设成该引擎的套接字。

### 自托管的 n8n 免费吗？

社区版免费，功能几乎齐全。注册它同样免费，会增加文件夹、debug in editor 和自定义执行数据。Business 和 Enterprise 要付费，这是 n8n [对比页面](https://docs.n8n.io/choose-how-to-use-n8n)上写的。

### 不用 Docker 的话，n8n 的文件放在哪里？

默认放在 `~/.n8n`。如果你设置了 `N8N_USER_FOLDER`，n8n 就用那个路径下的 `.n8n` 子文件夹。已有的 npm 安装能继续用，这个文件夹里的 config 文件和 SQLite 数据库，和 Docker 卷里的是同一类东西。

## 资料来源

- [n8n Docs: Install options](https://docs.n8n.io/deploy/host-n8n/install-options) (2026-11-04 查阅)
- [n8n Docs: Install with Docker](https://docs.n8n.io/deploy/host-n8n/install-options/install-with-docker) (2026-11-04 查阅)
- [n8n Docs: Install using Docker Compose](https://docs.n8n.io/deploy/host-n8n/install-options/install-using-docker-compose) (2026-11-04 查阅)
- [n8n Docs: One-line setup](https://docs.n8n.io/deploy/host-n8n/install-options/one-line-setup) (2026-11-04 查阅)
- [n8n Docs: Update n8n](https://docs.n8n.io/deploy/host-n8n/keep-n8n-running/update-n8n) (2026-11-04 查阅)
- [n8n Docs: Back up and restore](https://docs.n8n.io/deploy/host-n8n/keep-n8n-running/backup-and-restore) (2026-11-04 查阅)
- [n8n Docs: Endpoints environment variables](https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/endpoints) (2026-11-04 查阅)
- [n8n Docs: Configure webhook URLs with a reverse proxy](https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/configuration-examples/configure-webhook-urls-with-reverse-proxy) (2026-11-04 查阅)
- [n8n Docs: Choose how to use n8n](https://docs.n8n.io/choose-how-to-use-n8n) (2026-11-04 查阅)
- [GitHub: n8n-io/n8n](https://github.com/n8n-io/n8n) (2026-11-04 查阅)
- [GitHub: n8n-io/n8n get-n8n-compose.yml](https://raw.githubusercontent.com/n8n-io/n8n/master/docker/get-n8n-compose.yml) (2026-11-04 查阅)
- [n8n Docs: Release notes](https://docs.n8n.io/changelog/release-notes) (2026-11-05 查阅)
- [n8n Blog: Introducing n8n 3.0](https://blog.n8n.io/introducing-n8n-v3/) (2026-11-05 查阅)
- [n8n.io on X: one command to self-host n8n, 21 August 2026](https://x.com/n8n_io/status/2090756675472949712) (2026-11-05 查阅)
- [n8n.io on X: n8n 3.0 is now in beta, 28 October 2026](https://x.com/n8n_io/status/2115459582042534340) (2026-11-05 查阅)

[打开错误处理这一课](https://mindket.com/cn/learn/n8n-advanced/n8n-error-handling)
