n8n Docker 部署:持久化数据、域名与 Webhook 配置
用 Compose 运行 n8n,保留工作流数据,并配置 HTTPS 域名和正确的 Webhook 地址。
准备 Docker 和一个独立子域名
n8n 自建可以把工作流与凭据保存在自己的服务器。本文使用 SQLite 数据卷和外部 Caddy 反向代理,适合先运行一个实例;已有面板或其他代理时,由现有入口提供 HTTPS,不再安装第二套代理。
创建 compose.yaml
建立 ~/n8n 目录,把下面配置保存为 compose.yaml,并把 n8n.example.com 换成自己的域名。镜像使用稳定版本标签,首次部署后记录实际版本。
services:
n8n:
image: docker.n8n.io/n8nio/n8n:stable
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
environment:
N8N_HOST: n8n.example.com
N8N_PORT: "5678"
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.example.com/
GENERIC_TIMEZONE: Asia/Shanghai
TZ: Asia/Shanghai
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_PROXY_HOPS: "1"
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:启动应用并配置域名入口
mkdir -p ~/n8n
cd ~/n8n
sudo docker compose config --quiet
sudo docker compose up -d
sudo docker compose logs --tail=100创建目录后先保存 compose.yaml,再执行后面三条命令。Caddy 的域名配置指向 127.0.0.1:5678;域名 DNS 指向 VPS,80、443 端口由 Caddy 承接。示例假定只有一层反向代理,多层代理时按实际链路调整 N8N_PROXY_HOPS。
首次进入编辑器,建立一个测试工作流
通过 HTTPS 域名打开 n8n,创建自己的管理账号。先建一个简单触发器和返回结果的工作流,确认编辑器能保存,再接入正式凭据。
对外回调使用生产 Webhook 地址,并按 n8n 的工作流发布方式启用。测试 URL 与生产 URL 用途不同,第三方回调不能长期填写临时测试地址。
遇到回调失败时,检查 WEBHOOK_URL、HTTPS 和外部可访问性;编辑器可以打开,不代表第三方服务能访问回调地址。
记录版本,备份数据库与加密密钥
在 Compose 目录执行下面的检查,保存当前镜像版本与实际运行的 n8n 版本。备份 Compose 和环境配置;stable 标签会移动,后续升级选择已核对发行说明的明确版本,不以标签名代替版本记录。
docker compose images
docker compose exec -T n8n n8n --version本篇单实例 SQLite 方案在停止新触发、等待任务结束并停下 n8n 后,备份整个 n8n_data 卷。它包含数据库和自动生成的加密配置。使用 N8N_ENCRYPTION_KEY 的实例另保存原值;改成 PostgreSQL 时,数据库、.n8n 目录和二进制数据存储都需要按实际配置备份。工作流 JSON 导出不能替代完整恢复。
确认升级说明,再更新选定镜像
阅读当前版本到目标版本之间的发行说明,检查破坏性变更、节点兼容和数据库迁移要求。在隔离副本预演后,把 compose.yaml 的镜像标签改成目标明确版本;以下假定服务名仍为 n8n。
docker compose config --quiet
docker compose pull n8n
docker compose up -d n8n
docker compose ps
docker compose logs --tail=100 n8n启动后确认版本、原工作流与凭据。先执行不产生正式业务写入的测试工作流,再检查定时触发、生产 Webhook、反向代理地址及外部回调。测试 URL 正常,不能代替生产 URL 的检查。
回退需要旧数据,而不只是旧镜像
升级可能改变数据库结构。除非对应版本官方说明明确支持,否则不要让旧镜像读取升级后的数据库。失败时停下新实例,保留故障现场和升级后的数据,在隔离目录恢复升级前数据库、卷、密钥与原版本配置,再验证凭据可解密、工作流可执行。
新版本已经接收的任务和业务写入,需要单独记录并决定补处理方式。恢复期间暂停自动触发,验证完成后才开放生产回调,避免重放任务造成重复通知或写入。
