n8n 自托管部署教程:从安装到搭建第一个自动化流程
Docker / Docker Compose / 域名 HTTPS / 环境变量 / Webhook 实战 / 常见报错排查

适合发布:AI 自动化教程、n8n 部署教程、工作流自动化实战|版本:2026-05 网站发布版
导读:n8n 是一款适合搭建自动化流程的工作流平台。对于网站运营、内容生产、客户线索收集、AI 工具串联、数据同步等场景,自托管 n8n 的价值在于:数据掌握在自己服务器上、可以连接更多内部系统、也更方便与本地脚本或私有 API 配合。
这篇教程采用“先能跑起来,再逐步上线”的路线:先用 Docker 快速启动,再讲 Docker Compose 生产部署,最后搭建一个不依赖第三方账号的 Webhook 自动化流程。
| 重要提醒:自托管不是把命令复制完就结束。生产环境必须关注 HTTPS、域名、数据库、加密密钥、备份、访问控制和更新回滚。新手可以先本地测试,确认理解后再部署到公网服务器。 |
准备工作:先确认你适合哪种部署方式
n8n 官方文档建议多数自托管场景优先使用 Docker,因为容器可以减少系统环境差异,也方便管理数据库、卷和环境变量。对于新手,建议按下面三种路线选择。
| 部署路线 | 适合人群 | 优点 | 注意事项 |
| 本地 Docker 测试 | 想先体验 n8n 的用户 | 启动快、方便试错、不需要域名 | 不要把临时容器当正式环境;必须配置数据卷 |
| VPS + Docker Compose | 个人站长、自动化工作流使用者 | 可长期运行,方便反代 HTTPS、备份和更新 | 需要会使用 Linux、域名解析、防火墙和日志排查 |
| 云平台 / Kubernetes / 队列模式 | 企业团队、高并发流程 | 可扩展性更强,适合多 worker | 配置复杂,必须固定加密密钥并规划数据库 |
本文主线采用“VPS + Docker Compose”。如果你只是想快速体验,可以先阅读“本地快速启动”部分;如果要上线给真实业务使用,建议直接看“线上生产部署”。
服务器与域名环境建议
最低配置并没有一个绝对数字,取决于流程复杂度、执行频率、是否跑 AI 节点、是否保存大量执行数据。对于个人或小团队,建议从 2 核 CPU、2GB-4GB 内存、20GB 以上磁盘开始,后续按执行量扩容。
- 操作系统:Ubuntu 22.04/24.04 LTS、Debian 12,或其他能稳定运行 Docker 的 Linux 发行版。
- 端口:公网部署通常只暴露 80 和 443;5678 建议由反向代理转发,不直接裸露到公网。
- 域名:建议使用 n8n.example.com 这样的二级域名,并在 DNS 中添加 A 记录指向服务器 IP。
- 备份:正式使用前就要规划数据库备份、.n8n 配置目录备份、加密密钥备份。
- 安全:管理员强密码、必要时开启 2FA;不要把 API Key、Token、数据库密码写在文章截图或公开仓库里。

图 1:n8n 自托管部署架构示意图
方式一:本地快速启动 n8n
本地启动适合学习界面、测试节点、导入模板和熟悉工作流逻辑。以下命令会创建一个 Docker 卷保存 n8n 数据,再启动 n8n 容器。
| docker volume create n8n_data docker run -it –rm \ –name n8n \ -p 5678:5678 \ -e GENERIC_TIMEZONE=”Asia/Shanghai” \ -e TZ=”Asia/Shanghai” \ -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ -e N8N_RUNNERS_ENABLED=true \ -v n8n_data:/home/node/.n8n \ docker.n8n.io/n8nio/n8n |
- 浏览器打开 http://localhost:5678。
- 首次进入时创建 Owner 账号,填写邮箱、姓名和密码。
- 进入工作台后,可以先创建一个空白工作流,熟悉节点搜索、执行、保存和发布。
| 避坑:如果你没有挂载 -v n8n_data:/home/node/.n8n,删除容器或重新创建容器后可能丢失账号、工作流、凭据和加密密钥。正式环境一定要持久化。 |
方式二:VPS 线上部署 Docker Compose
线上部署建议使用 Docker Compose 管理服务。下面给出适合入门的生产化思路:n8n 使用 PostgreSQL 保存数据,反向代理负责 HTTPS,n8n 只在容器网络内部暴露。你也可以参考官方 Traefik 示例,或按自己的服务器习惯改成 Caddy/Nginx。

图 2:n8n 从服务器准备到上线的部署流程
第 1 步:安装 Docker 与 Docker Compose
先登录服务器,安装 Docker Engine 与 Docker Compose 插件。不同系统命令略有差异,安装完成后用以下命令检查:
| docker –version docker compose version |
如果提示 command not found,说明 Docker 或 Compose 没有安装成功;如果提示 permission denied,可以临时使用 sudo,也可以把当前用户加入 docker 用户组。
第 2 步:创建项目目录与 .env 文件
| mkdir -p /opt/n8n cd /opt/n8n mkdir -p local-files nano .env |
`.env` 文件用于集中管理域名、时区、数据库密码、加密密钥等变量。下面是可直接改造的示例:
| # 对外访问域名 N8N_DOMAIN=n8n.example.com N8N_PROTOCOL=https WEBHOOK_URL=https://n8n.example.com/ N8N_PROXY_HOPS=1 # 时区:影响 Schedule / Cron 类节点 GENERIC_TIMEZONE=Asia/Shanghai TZ=Asia/Shanghai # 建议生产环境固定,不要遗失或随意更换 N8N_ENCRYPTION_KEY=replace-with-a-long-random-secret # PostgreSQL POSTGRES_DB=n8n POSTGRES_USER=n8n POSTGRES_PASSWORD=replace-with-a-strong-password |
| 加密密钥很重要:n8n 会使用加密密钥加密凭据。正式环境建议一开始就设置 N8N_ENCRYPTION_KEY,并安全备份;如果后续丢失或更换,已有凭据可能无法解密。 |
第 3 步:编写 compose.yaml
下面示例使用 PostgreSQL + n8n。反向代理部分可用你熟悉的 Caddy、Traefik、Nginx Proxy Manager 或宝塔反代完成;如果使用官方 Traefik 示例,可以把证书和路由配置一起放入 Compose。
| services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: – postgres_data:/var/lib/postgresql/data n8n: image: docker.n8n.io/n8nio/n8n:latest restart: unless-stopped depends_on: – postgres ports: – “127.0.0.1:5678:5678” environment: N8N_HOST: ${N8N_DOMAIN} N8N_PROTOCOL: ${N8N_PROTOCOL} WEBHOOK_URL: ${WEBHOOK_URL} N8N_PROXY_HOPS: ${N8N_PROXY_HOPS} GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${TZ} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: “true” N8N_RUNNERS_ENABLED: “true” DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: 5432 DB_POSTGRESDB_DATABASE: ${POSTGRES_DB} DB_POSTGRESDB_USER: ${POSTGRES_USER} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD} volumes: – n8n_data:/home/node/.n8n – ./local-files:/files volumes: postgres_data: n8n_data: |
这个配置把 n8n 映射到服务器本机 127.0.0.1:5678,外部用户不能直接访问 5678,需要由反向代理转发。这比直接暴露 0.0.0.0:5678 更安全。
第 4 步:启动、查看日志与初始化账号
| cd /opt/n8n docker compose up -d docker compose ps docker compose logs -f n8n |
如果容器状态正常,配置好反向代理后,访问你的域名,例如 https://n8n.example.com。首次访问会进入账号初始化页面。创建 Owner 账号后,就可以进入 n8n 工作台。
第 5 步:配置 HTTPS 反向代理
公网部署必须启用 HTTPS。你可以使用 Caddy、Traefik、Nginx 或宝塔面板反向代理。核心逻辑是:外部访问 https://n8n.example.com,代理转发到服务器本机 http://127.0.0.1:5678。
如果 n8n 在反向代理后面运行,需要正确设置 WEBHOOK_URL。否则在 Webhook 节点、OAuth 回调、第三方平台回调中可能出现地址错误。
| # 反向代理后的关键变量示例 WEBHOOK_URL=https://n8n.example.com/ N8N_PROXY_HOPS=1 N8N_HOST=n8n.example.com N8N_PROTOCOL=https |
| 检查方法:进入 n8n 后新建 Webhook 节点,查看 Production URL 是否显示为 https://n8n.example.com/webhook/…。如果仍显示 localhost、IP、http 或 5678,说明反向代理或环境变量还没配对。 |
目录结构:n8n 数据、文件和备份应该放在哪里
很多 n8n 部署翻车不是因为安装失败,而是因为没有搞清楚“哪些数据必须保存”。下面这张表要重点看。
| 路径 / 数据 | 作用 | 是否必须备份 | 备注 |
| /home/node/.n8n | n8n 用户目录,包含配置、SQLite 数据库、加密密钥等 | 必须 | Docker 中通常挂载为 n8n_data 卷 |
| PostgreSQL 数据库 | 保存工作流、执行记录、凭据元数据等 | 必须 | 生产环境推荐使用独立数据库并定期备份 |
| N8N_ENCRYPTION_KEY | 加密和解密凭据 | 必须 | 不要公开,不要随意更换 |
| ./local-files 或 /files | 读写本地文件节点使用的共享目录 | 按业务需要 | 适合保存临时文件、导入导出文件 |
| compose.yaml / .env | 部署配置与变量 | 必须 | 注意不要把密钥提交到公开仓库 |

图 3:n8n 上线前检查清单
第一个自动化流程:Webhook 接收数据并返回结果
第一个流程建议选择“零第三方账号依赖”的 Webhook 示例。这样不需要邮箱、企业微信、Telegram、Slack 等凭据,部署成功后立刻可以测试。

图 4:Webhook 自动化流程结构
流程目标
外部系统向 n8n 发送一段 JSON 数据,n8n 接收后提取字段,最后返回一段处理后的 JSON。这个流程可以理解为:把 n8n 当成一个轻量 API 接口。
节点 1:Webhook Trigger
- 点击 New Workflow,新建空白流程。
- 添加 Webhook 节点。
- HTTP Method 选择 POST。
- Path 填写 first-demo。
- Response 方式选择 Using Respond to Webhook Node,便于后面自定义返回内容。
- 点击 Listen for test event,让测试 URL 进入监听状态。
Webhook 节点会提供 Test URL 和 Production URL。测试阶段用 Test URL,发布后给外部系统用 Production URL。
节点 2:Edit Fields / Set
添加 Edit Fields(有些版本显示为 Set)节点,用于整理输入数据。可以新增字段:
| name: {{$json.body.name}} source: {{$json.body.source}} receivedAt: {{$now}} |
如果你的 Webhook Body 结构不同,可以先执行一次测试请求,然后根据 n8n 左侧输入数据面板选择真实字段路径。
节点 3:Respond to Webhook
添加 Respond to Webhook 节点,返回 JSON:
| { “ok”: true, “message”: “收到 {{$json.name}} 的请求”, “source”: “{{$json.source}}”, “receivedAt”: “{{$json.receivedAt}}” } |
测试请求
复制 Webhook 节点的 Test URL,用 curl 或 Apifox/Postman 发送请求:
| curl -X POST https://n8n.example.com/webhook-test/first-demo \ -H “Content-Type: application/json” \ -d ‘{“name”:”AI Stack Nav”,”source”:”website”}’ |
如果返回 ok: true,并且 n8n 画布上能看到每个节点的输入输出数据,说明第一个自动化流程已经跑通。
从测试到发布
- 点击右上角 Save 保存工作流。
- 点击 Active / Publish,将流程发布为生产可用状态。
- 把 Test URL 换成 Production URL。生产 URL 一般是 /webhook/first-demo,而不是 /webhook-test/first-demo。
- 再次用 curl 测试生产地址。生产 Webhook 的执行数据可在 Executions 中查看。
| 关键区别:Test URL 适合调试,可在编辑器中查看实时输入;Production URL 适合正式接入第三方系统,流程必须保存并发布。 |
进阶流程示例:网站运营常用自动化
跑通第一个流程后,可以继续做更贴近网站运营的自动化。下面给出几个适合 AI 教程网站、资源站、会员下载站使用的方向。
| 场景 | 触发器 | 核心节点 | 落地价值 |
| 表单线索收集 | Webhook | Edit Fields、Google Sheets、Email | 把咨询、订单、合作信息自动归档并提醒 |
| 文章发布提醒 | Schedule Trigger | HTTP Request、RSS、Telegram/企业微信 | 每天检查新文章并自动推送 |
| 会员下载通知 | Webhook | IF、Email、数据库节点 | 支付成功后自动发送下载说明或售后边界 |
| AI 内容流水线 | Manual/Schedule | OpenAI/HTTP Request、Code、WordPress | 自动生成草稿、摘要、标签和 SEO 字段 |
| 数据备份提醒 | Schedule Trigger | Postgres、Email、IF | 检测备份状态,异常时通知管理员 |
常用环境变量解释
| 变量 | 用途 | 建议 |
| GENERIC_TIMEZONE | 设置实例默认时区,影响 Schedule/Cron 类节点 | 国内用户可设 Asia/Shanghai;海外业务按目标地区设置 |
| TZ | 容器系统时区 | 建议与 GENERIC_TIMEZONE 保持一致 |
| WEBHOOK_URL | 反向代理后生成正确的 Webhook 外部地址 | 公网部署必查,末尾建议保留 / |
| N8N_PROXY_HOPS | 告诉 n8n 代理链路跳数 | 单层反向代理常见值为 1 |
| N8N_ENCRYPTION_KEY | 凭据加密密钥 | 生产环境必须固定并安全备份 |
| DB_TYPE | 数据库类型 | PostgreSQL 使用 postgresdb |
| DB_POSTGRESDB_* | PostgreSQL 连接信息 | 生产环境建议使用强密码,限制数据库暴露范围 |
| N8N_RUNNERS_ENABLED | 启用任务运行器相关能力 | 按官方 Docker 示例开启 |
更新、备份与回滚
更新前先备份
升级 n8n 之前,至少备份三类内容:PostgreSQL 数据库、n8n_data 卷或 /home/node/.n8n 目录、compose.yaml 与 .env 文件。不要在没有备份的情况下直接拉取新镜像。
| # 查看当前镜像与容器 docker compose ps docker compose pull docker compose up -d docker compose logs -f n8n |
建议锁定版本
如果是生产环境,不建议长期使用 latest。更稳妥的方式是指定一个明确版本标签,先在测试环境验证,再更新正式环境。示例:
| image: docker.n8n.io/n8nio/n8n:2.x.x |
这里的 2.x.x 仅为示例,请以官方发布页或镜像仓库中的实际版本为准。
常见报错与排查清单
| 问题 | 可能原因 | 解决方向 |
| 访问域名打不开 | DNS 未生效、防火墙未放行、反向代理未启动 | 检查 A 记录、80/443 端口、安全组、代理日志 |
| Webhook URL 显示 localhost 或 5678 | WEBHOOK_URL / N8N_HOST / N8N_PROTOCOL 未配置正确 | 设置 WEBHOOK_URL=https://你的域名/,重启容器 |
| Schedule 时间不对 | 时区未设置或工作流单独时区不同 | 设置 GENERIC_TIMEZONE,检查 workflow settings |
| 重启后账号/流程丢失 | 没有持久化 /home/node/.n8n 或数据库 | 检查 volumes,确认 n8n_data 和 PostgreSQL 数据没有丢失 |
| 凭据全部变红/无法解密 | 加密密钥丢失或更换 | 找回旧 N8N_ENCRYPTION_KEY 或 .n8n/config;不要随意重置 |
| 502 Bad Gateway | n8n 容器未启动、端口不通、代理转发错误 | docker compose logs -f n8n;检查 127.0.0.1:5678 是否可访问 |
| Webhook 收不到请求 | 使用了 Test URL 但未监听,或 Production URL 流程未发布 | 测试用 Listen for test event;生产用发布后的 Production URL |
| 数据库越来越大 | 执行记录保存过多 | 设置执行数据清理策略,定期备份并清理历史执行 |
安全建议:自托管 n8n 不要忽略这些细节
- 不要把 n8n 直接通过 http://服务器IP:5678 暴露到公网,尽量用 HTTPS 域名访问。
- 不要在公开仓库提交 .env、API Key、数据库密码、N8N_ENCRYPTION_KEY。
- 不要让所有人都拥有管理员权限;团队使用时要做好账号分工。
- 不要在 Code 节点执行不可信代码;自托管环境中的脚本权限通常比云端更敏感。
- 对外 Webhook 建议开启 Header Auth、Basic Auth、JWT 或签名校验,避免被陌生请求刷爆。
- 定期更新 n8n 与基础镜像,但每次更新前先备份,并保留回滚方案。
FAQ:n8n 自托管常见问题
n8n 自托管免费吗?
不添加商业许可证时,自托管 n8n 通常以 Community edition 运行。实际可用功能请以 n8n 官方版本和许可说明为准。
新手应该用 npm 还是 Docker?
建议优先 Docker。Docker 更容易隔离环境,也方便持久化、升级和迁移。npm 适合本地开发或有 Node.js 运维经验的用户。
SQLite 和 PostgreSQL 怎么选?
本地体验、小型个人流程可以先用 SQLite;正式生产、多人协作、执行量较大时建议使用 PostgreSQL。
为什么 Webhook 地址不对?
大多是反向代理后没有设置 WEBHOOK_URL,导致 n8n 仍用容器内部地址拼接 URL。
Test URL 和 Production URL 有什么区别?
Test URL 用于调试,需要在编辑器中监听测试事件;Production URL 用于正式触发,流程需要保存并发布。
Schedule Trigger 为什么没自动执行?
检查流程是否发布、实例时区是否正确、Cron 表达式是否有效,以及容器是否正常运行。
备份 n8n 只备份数据库够吗?
不够。还要备份 .n8n 目录、加密密钥、compose.yaml、.env,以及业务流程依赖的本地文件目录。
可以用宝塔面板反向代理 n8n 吗?
可以。核心是把域名 HTTPS 请求反代到 127.0.0.1:5678,并设置正确的 WEBHOOK_URL。
n8n 适合做 AI 自动化吗?
适合。可以串联 HTTP Request、OpenAI/兼容 API、表格、邮件、数据库、Webhook 和自定义 Code 节点,适合做内容生产、数据处理和运营自动化。
总结:先跑通,再上线,再自动化
n8n 自托管的核心不是“装上就完事”,而是建立一套可持续运行的自动化基础设施。新手可以先用 Docker 本地跑通,再迁移到 VPS + Docker Compose;上线前必须处理域名、HTTPS、持久化、数据库、加密密钥和备份。
第一个 Webhook 流程跑通后,你就可以把 n8n 接到网站表单、支付回调、AI 生成接口、RSS、WordPress、企业微信、飞书、Telegram、Notion、Google Sheets 等工具上,逐步把重复操作变成稳定的自动化流程。
参考资料
- n8n Docs – Self-hosting n8n:https://docs.n8n.io/hosting/
- n8n Docs – Docker Installation:https://docs.n8n.io/hosting/installation/docker/
- n8n Docs – Docker Compose:https://docs.n8n.io/hosting/installation/server-setups/docker-compose/
- n8n Docs – Environment Variables:https://docs.n8n.io/hosting/configuration/environment-variables/
- n8n Docs – Configure webhooks with reverse proxy:https://docs.n8n.io/hosting/configuration/configuration-examples/webhook-url/