中级 11 分钟n8n

使用 Docker 的 n8n:安装并自行托管 免费地

使用 Docker 部署 n8n,是获得一个能经受重启和更新的自托管自动化实例的最简便方式。本指南有意止步于基础部分:一个 Docker Compose 文件、一个用于存储数据的卷、一把由您控制的加密密钥、一套备份与更新流程,以及谨慎启用 HTTPS。AI 节点和连接 Ollama 的内容将在另一篇指南中介绍;这里的目标是完成一次无需反复重做的干净安装。

作者: Samir K.·更新于 2026-10-14·已在 Windows、macOS 和 Linux 上测试

#为什么使用 Docker 而不是 npm 安装 n8n

n8n 是一个 Node.js 应用。可以使用 npm 或 npx 启动它,文档也建议用这种方式进行快速试用。对于持续运行的实例,项目推荐使用官方 Docker 镜像:它包含正确版本的 Node.js,将 n8n 与机器的其他部分隔离开来,并且只需更换镜像即可轻松完成更新。这也是 n8n 托管文档描述其所有服务器示例时采用的格式。

第二个优势是可复现性。docker-compose.yml 文件描述了完整配置:镜像、端口、环境变量和数据卷。你可以将其纳入版本控制、复制到另一台机器,或在六个月后重新查看,以准确了解正在运行的内容。使用 npm 安装时,这些信息分散在系统、用户配置文件和服务管理器之间。

本指南涵盖的内容
本地安装或安装在小型服务器上、数据持久化、加密密钥、备份、更新、HTTPS 访问。
它不涵盖的内容
n8n 的 AI 节点、连接 Ollama、MCP 服务器,以及队列模式下的扩展。前两个主题各有单独的指南,链接位于文章末尾。
我们没有声称的内容
没有安装时长、没有测得的资源消耗,也没有固定的版本号。这些值会随每个 release 变化,应在安装时从官方来源中查看。

#社区版的许可证与限制

本地智能体套件

在你的机器上执行操作的智能体:具备智能体能力的 Cline、MCP、n8n + Ollama、本地自动化。

  • 在线空间,终身可用
  • PDF + 文件
  • 30 天内退款

按照 OSI 的定义,n8n 并不采用开源许可证。其代码发布在 Sustainable Use License 下,发布方称之为“fair-code”模式。概括来说,您可以自由地将 n8n 用于内部、个人或企业自身需求,也可以修改和自行托管。受限制的是转售:将 n8n 作为托管服务提供给第三方,或将其集成到商业产品中,都需要获得发布方的许可。完整文本及其 FAQ 位于 docs.n8n.io/sustainable-use-license/;如果您的用途超出内部自动化范围,请阅读这些内容。

使用 Docker 安装的是社区版。它包含完整编辑器、数百个集成节点、webhook、计划触发器、AI 节点和用户管理。某些功能仅限于付费的自托管方案:单点登录(SSO)、带 Git 同步的环境、外部密钥、将日志发送到外部工具,以及部分协作功能。此外,发布方还提供一种称为“已注册社区”的免费密钥,只需在设置中填写电子邮件地址即可获取,并可解锁一些额外功能。具体列表会变化:应以 docs.n8n.io/hosting/community-edition-features/ 页面为准。

i
免费,但不是开源软件
对于个人或内部使用,这一区别在实践中没有影响。如果你打算转售基于 n8n 构建的服务,或企业要求使用 OSI 批准的许可证,那么这一区别就很重要:此时应在安装前而不是安装后阅读许可证。

#先决条件

Docker 和 Docker Compose
Linux 上带有 Compose 插件的 Docker Engine,或 Windows 和 macOS 上的 Docker Desktop。请使用 docker compose version 验证:该命令应返回版本号,并且命令由两个单词组成(docker compose),而不是旧工具所使用的连字符形式。
一台持续开机的机器
n8n 会在预定时间或收到 webhook 时执行工作流。晚上关机的电脑无法看到夜间触发。迷你电脑、兼容 Docker 的 NAS 或小型 VPS 都可以;对于几个简单工作流,内存需求仍然不高。
一个空闲端口
n8n 在容器内部监听 5678 端口。我们将主机侧也发布到相同端口;如果该端口已被其他服务占用,请更改它。
仅用于 HTTPS 步骤
一个指向该机器的域名,以及可从互联网访问的 80 和 443 端口。否则,请使用本地访问,或改用 VPN:HTTPS 部分会详细介绍这两个选项。
终端
docker --version
docker compose version

#使用 Docker Compose 分步安装 n8n

n8n 文档首先给出一行式 docker run 命令,适合试用。我们直接使用 Compose:文件只稍微长一些,却会成为安装配置的基准。下面的所有值都来自 n8n 文档;只有时区和端口值是本指南的选择。

  1. 01
    创建项目目录
    专用目录包含 Compose 文件、.env 文件,以及之后的备份。n8n 本身的数据将存储在一个命名的 Docker 卷中,而不是这个目录里。
  2. 02
    生成加密密钥
    首次启动前,生成一个随机密钥并将其放入 .env 文件中。下一节将解释为什么顺序很重要。
  3. 03
    编写 docker-compose.yml
    复制下面的文件。它会将 n8n 发布到本机的 5678 端口,并限制为本地地址 127.0.0.1;同时将 n8n_data 卷挂载到容器中的 /home/node/.n8n 目录。n8n 会在此处存储其 SQLite 数据库、配置和文件。
  4. 04
    开始
    docker compose up -d télécharge l'image et lance le conteneur en arrière-plan. La première exécution prend le temps du téléchargement de l'image ; les suivantes sont immédiates.
  5. 05
    创建所有者账户
    在浏览器中打开 http://localhost:5678。n8n 会要求创建第一个账户,该账户将成为实例所有者。从 1.0 版开始,正是这个账户负责保护访问权限;以前通过环境变量实现的基本身份验证已不复存在。
终端
mkdir -p ~/n8n && cd ~/n8n

# Clé de chiffrement : 64 caractères hexadécimaux
echo "N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)" > .env
chmod 600 .env
cat .env
docker-compose.yml
services:
  n8n:
    image: docker.n8n.io/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=Europe/Paris
      - TZ=Europe/Paris
      - N8N_RUNNERS_ENABLED=true
      - N8N_DIAGNOSTICS_ENABLED=false
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=336
    volumes:
      - n8n_data:/home/node/.n8n
      - ./local-files:/files

volumes:
  n8n_data:
终端
docker compose up -d
docker compose logs -f n8n   # Ctrl+C pour quitter les journaux

下面对这些变量作一些说明。GENERIC_TIMEZONE 设置 Schedule Trigger 节点和日期表达式使用的时区;TZ 则使容器内的系统时钟保持一致。N8N_RUNNERS_ENABLED 启用任务运行器,这是让 Code 节点代码在独立进程中执行的机制;文档建议启用它,近期版本在缺少该变量时也会显示警告。N8N_DIAGNOSTICS_ENABLED=false 会停止向编辑器发送遥测数据。两个 EXECUTIONS_DATA_* 变量要求 n8n 清理超过 336 小时,也就是十四天的执行历史,以避免数据库无限增长。

./local-files:/files 挂载是可选的。它会为 n8n 提供一个与宿主机共享的目录,适合读取或写入文件的节点。如果您不需要使用它,请删除这一行。

→
从本地网络中的另一台机器访问
该文件将端口发布到 127.0.0.1:只有托管 n8n 的机器可以访问它。若要向本地网络开放,请替换为 "5678:5678",并在变量中添加 N8N_SECURE_COOKIE=false;否则,n8n 会拒绝来自 localhost 以外地址的 HTTP 连接,并明确提示安全 Cookie 的问题。对于暴露在 Internet 上的实例,绝不能保留此变量:请使用 HTTPS 部分。

#加密密钥:绝不能丢失的变量

n8n 会加密您在界面中保存的所有凭据,也就是集成所使用的 API 令牌、密码和 OAuth 密钥。使用的加密密钥是 N8N_ENCRYPTION_KEY。如果未设置该密钥,n8n 会在首次启动时生成一个,并将其写入 /home/node/.n8n 目录中的 config 文件,也就是写入卷中。这种方式可以正常工作,但密钥随后只存在于该卷中:如果卷丢失,或您在没有它的情况下重新创建实例,每个凭据都会变得无法读取,必须重新输入。

因此,本指南会在首次启动前将密钥固定在 .env 文件中。密钥始终由您控制,会随 Compose 文件一起备份,并且可以在另一台机器上恢复数据库而不会丢失凭据。由此产生两条规则。

事后绝不要更改密钥
与用于加密的密钥不同的密钥会使所有现有凭据无法使用。如果必须更换密钥,请先使用 export:credentials 命令导出已解密的凭据,然后在更换后重新导入。
单独备份 .env 文件
请在密码管理器中另存一份密钥。没有密钥的卷备份对凭据毫无价值,即使工作流仍然可读。
!
首次启动时未设置密钥,之后才定义密钥
如果您已经在未设置 N8N_ENCRYPTION_KEY 的情况下启动过 n8n,容器中会包含一把自动生成的密钥。随后在 .env 中设置不同的值,会触发启动错误,或导致凭据无法读取。此时,请使用 docker exec n8n cat /home/node/.n8n/config 获取现有密钥,并将该值写入 .env,而不是重新生成一把。

#数据持久化与备份

n8n 需要保留的所有内容都位于 /home/node/.n8n:包含工作流、加密凭据和执行历史的 SQLite 数据库、config 文件、已安装的社区节点,以及磁盘存储模式下的二进制文件。命名卷 n8n_data 在执行 docker compose down 和删除容器后仍会保留。但执行 docker compose down -v 或 docker volume rm 后不会保留:这两个命令都会删除数据。

备份可以采用两种互补的方法。第一种归档整个卷:复制文件时先停止 n8n,以避免捕获正在写入的 SQLite 数据库。第二种使用 n8n 的命令行工具,将工作流和凭据导出为 JSON,以便单独读取和重新导入。

完整卷备份
cd ~/n8n
mkdir -p backups
docker compose stop n8n
docker run --rm \
  -v n8n_data:/data:ro \
  -v "$PWD/backups":/backup \
  alpine tar czf "/backup/n8n_data-$(date +%F).tgz" -C /data .
docker compose start n8n
ls -lh backups/
通过 n8n CLI 导出 JSON
# Un fichier par workflow, puis un par identifiant, dans le volume
docker exec n8n n8n export:workflow --backup --output=/home/node/.n8n/exports/workflows/
docker exec n8n n8n export:credentials --backup --output=/home/node/.n8n/exports/credentials/

# Récupérer les exports sur la machine hôte
docker cp n8n:/home/node/.n8n/exports ./backups/exports-$(date +%F)

导出命令的 --backup 选项会组合各项选项,为每个元素生成一个可读格式的文件。导出的凭据仍使用你的密钥加密,除非添加 --decrypted;在这种情况下,应将该文件视为机密。恢复时,import:workflow 和 import:credentials 命令接受同一个目录,并使用 --separate 选项。CLI 的完整参考位于 docs.n8n.io/hosting/cli-commands/。

要在另一台机器上进行完整恢复:使用相同的 docker-compose.yml 和相同的 .env 重新创建目录,运行 docker compose up -d 后再运行 docker compose stop 创建空卷,用与备份相反的命令将压缩包解压到卷中,然后重启。要恢复凭据,必须使用同一把加密密钥。

i
SQLite 还是 PostgreSQL?
SQLite 是默认数据库,对于个人实例或小型团队已经足够。n8n 文档建议生产环境使用 PostgreSQL,尤其是在多个工作流并行运行,或您计划使用队列模式时。切换通过变量 DB_TYPE=postgresdb 和 DB_POSTGRESDB_* 完成,并在 Compose 文件中添加 postgres 服务。从 SQLite 迁移到 PostgreSQL,需要执行上文所述的导出和import CLI。

#更新 n8n 而不破坏实例

n8n 会频繁发布版本。镜像的 latest 标签指向最新稳定版本,next 标签指向测试版本;带编号的标签则可以固定到特定版本。使用 Compose 时,更新只需三条命令:获取新镜像、停止旧容器、使用相同配置重新创建容器。数据保留在卷中,不会受到影响。如果存在数据库架构迁移,会在启动时自动执行。

终端
cd ~/n8n

# 1. Sauvegarde avant toute mise à jour (voir section précédente)

# 2. Mise à jour
docker compose pull
docker compose down
docker compose up -d

# 3. Contrôle
docker compose logs --tail=50 n8n
docker exec n8n n8n --version

三项预防措施可以避免大多数意外。先进行备份:数据库迁移无法回滚。请阅读 github.com/n8n-io/n8n/releases 上的发行说明和文档中的更新页面 docs.n8n.io/hosting/installation/updating/:主要版本会移除环境变量或更改默认行为,文档还专门记录了不兼容变更。最后,如果实例对你很重要,最好使用带编号的标签,而不是 latest:这样可以由你选择升级时机,而不是在下次 pull 时被动升级。

docker-compose.yml(固定版本,格式示例)
services:
  n8n:
    # Remplacez par un numéro lu sur la page des releases
    image: docker.n8n.io/n8nio/n8n:1.XX.Y
→
恢复原设置
如果某个版本出现问题,请将之前的标签恢复到 Compose 文件中,然后重新运行 docker compose up -d。只要新版本尚未迁移数据库架构,这样就能奏效;否则,请恢复更新前创建的备份。这就是第 1 步存在的原因。

#谨慎地通过 HTTPS 暴露 n8n

只要您是在运行 n8n 的机器上或从本地网络使用它,前面的安装就足够了。当需要暴露服务时,通常是因为 webhook:第三方服务需要调用您的实例,或您需要从外部访问它。有两条路径,第一条通常就是正确选择。

使用 VPN,而不是公开暴露
Tailscale、WireGuard 或路由器的 VPN 可以让您从任何地方访问 n8n,而无需在 Internet 上开放端口。对于不使用公共 webhook 的个人用途,这是最安全、最简单的方案。实例在私有网络中仍使用 HTTP;如果通过 VPN 地址访问,则必须将 N8N_SECURE_COOKIE=false。
带证书的反向代理
要接收公共 Webhook,需要域名、负责终止 TLS 的反向代理以及证书。n8n 的官方示例使用 Traefik;我们展示 Caddy,其配置只需三行,并且会自行获取 Let's Encrypt 证书。

在下面的配置中,n8n 不再发布任何端口:只有 Caddy 可通过 80 和 443 访问,并通过 Compose 的内部网络将请求转发给 n8n 容器。N8N_HOST、N8N_PROTOCOL 和 WEBHOOK_URL 变量会告知 n8n 对外提供服务时使用的公共地址;没有这些变量,编辑器中显示的 webhook URL 会指向 localhost,OAuth 重定向也会失败。

docker-compose.yml(使用 Caddy)
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    environment:
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_HOST=n8n.votre-domaine.fr
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.votre-domaine.fr/
      - GENERIC_TIMEZONE=Europe/Paris
      - TZ=Europe/Paris
      - N8N_RUNNERS_ENABLED=true
      - N8N_DIAGNOSTICS_ENABLED=false
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=336
    volumes:
      - n8n_data:/home/node/.n8n

  caddy:
    image: caddy:2
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config

volumes:
  n8n_data:
  caddy_data:
  caddy_config:
Caddyfile
n8n.votre-domaine.fr {
    reverse_proxy n8n:5678
}

在运行 docker compose up -d 之前,n8n.votre-domaine.fr 的 DNS 记录必须指向该机器的公网地址,并且 80 和 443 端口必须转发到该地址。随后,Caddy 会向 Let's Encrypt 申请证书,并自动续期。caddy_data 和 caddy_config 卷会在重启之间保留证书和状态。

!
公开暴露服务意味着什么
一个可从互联网访问的 n8n 实例就是一个攻击目标:它持有您的集成凭据,并且可以执行代码。所有者账户应使用长且唯一的密码,在设置中启用双因素身份验证,及时应用更新,并且不得残留任何 HTTP 访问。如果您不需要公开 Webhook,VPN 仍然是更好的选择。我们的 Ollama 服务器安全指南中详述的原则同样适用于 n8n。

#故障排除:常见阻塞问题

打开时显示的安全 Cookie 消息
您通过 HTTP 从非 localhost 地址访问 n8n。您可以改用 HTTPS,或者仅在私有网络中添加 N8N_SECURE_COOKIE=false。
/home/node/.n8n 的权限错误
容器以 node 用户而非 root 用户运行。当您将命名卷替换为权限不匹配的主机目录时,就会出现这种情况。请保留命名卷,或将目录所有者对齐到用户 ID 1000,也就是镜像中的 node 用户。
计划任务工作流在错误的时间运行
GENERIC_TIMEZONE 缺失或拼写错误。预期值应为 IANA 时区名称,例如 Europe/Paris。每个工作流也可以在其设置中指定自己的时区。
Webhook 显示 localhost 地址
WEBHOOK_URL 未定义,或与第三方服务联系你的地址不一致。该值必须以斜杠结尾,并包含协议。
数据库无限膨胀
执行记录清理已禁用或时间设置过长。请检查 EXECUTIONS_DATA_PRUNE 和 EXECUTIONS_DATA_MAX_AGE,也要留意保留成功执行记录数据的选项;该选项可以针对每个工作流单独禁用。
更新后,n8n 拒绝启动
使用 docker compose logs n8n 查看日志:其中的消息通常会指出某个变量已被移除,或某次迁移失败。请与版本说明进行比较,必要时恢复备份。
n8n 在同一台机器上看不到 Ollama
在容器中,localhost 指的是容器本身,而不是主机。应使用的地址取决于系统以及 Ollama 的启动方式;下面引用的 n8n 指南和 Ollama 将对此进行说明。
实用命令
docker compose ps                     # état du conteneur
docker compose logs --tail=100 n8n   # dernières lignes du journal
docker exec n8n n8n --version         # version installée
docker volume inspect n8n_n8n_data    # emplacement réel du volume (préfixe = nom du dossier)
docker compose restart n8n            # redémarrage simple

对于文档中找不到答案的问题,community.n8n.io 论坛很活跃,开发方也会在那里答复。请注明确切版本、安装方式和日志行:这是他们首先会询问的三项信息。


#深入了解

实例已经部署、完成备份并保持最新。下一步自然是将其连接到本地模型,然后集成到更大的技术栈中。本指南参考的官方来源包括:n8n 文档的托管部分(docs.n8n.io/hosting/)、Docker 安装页面(docs.n8n.io/hosting/installation/docker/)、更新页面、许可证页面以及社区版功能页面。这些页面会随版本变化:如果它们与本指南存在差异,应以这些页面为准。

n8n + Ollama:使用 100 % 本地 AI 实现自动化
后续指南:AI 节点、从容器连接到 Ollama,以及首批翻译和摘要工作流。https://quelllm.fr/guide/n8n-ollama-automatisation-workflow
通过 Docker 运行 Ollama
如果你还想让 Ollama 以容器形式运行在 n8n 旁边,并访问 GPU。https://quelllm.fr/guide/ollama-docker-installation-guide
使用 Docker Compose 在生产环境中部署 LLM
完整技术栈 Ollama、Open WebUI、Qdrant、n8n 和 Traefik 都放在同一个 Compose 文件中,用于超越单独实例的场景。https://quelllm.fr/guide/deployer-llm-docker-compose-production
保护你的 Ollama 服务器
身份验证、防火墙、反向代理:这些暴露规则适用于所有自托管服务,包括 n8n。https://quelllm.fr/guide/securiser-serveur-ollama
这份指南对您有帮助吗?

有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。