在 Docker 里启动的 n8n (flow 容器)默认把所有外部链接拼成 http://localhost:5678,因为它直接把 N8N_PROTOCOL + N8N_HOST + N8N_PORT 组合起来;如果你什么都没配,这三个值分别是 http / localhost / 5678,于是编辑器里的 Webhook、OAuth 回调、邀请链接等都会指向本机端口➀➁。把 n8n 放到 Caddy/Nginx/Traefik 之类的反向代理后,只要给容器 加几行环境变量并重启,n8n 就会把所有外链改写为你的公开域名 https://flow.joyzhi.com,完全不用改 Caddy 配置也不用手动修补每条 URL。
为什么要改环境变量
n8n 在发现自己处于反向代理之后,官方文档建议直接设置
WEBHOOK_URL来避免把:5678带到公网➂➃。如果还要让邀请邮件、OAuth、SAML 等链接正确,官方同样建议把
N8N_EDITOR_BASE_URL指向你真实的 HTTPS 域名➄。这些变量全部可以通过
.env文件或docker-compose.yml的environment:块传入容器,重建即可生效➅➆。
操作步骤(Docker + Caddy 示例)
编辑
.env(或直接写到 compose 文件):DOMAIN_NAME=joyzhi.com SUBDOMAIN=flow修改
docker-compose.yml➡n8n 服务:environment: - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME} - N8N_PORT=5678 - N8N_PROTOCOL=https - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/ - N8N_EDITOR_BASE_URL=https://${SUBDOMAIN}.${DOMAIN_NAME} - NODE_ENV=production这一做法与官方示例和社区帖的解决方案一致➇➈。
重建容器:
docker compose down docker compose up -dCaddyfile 保持简洁(若已能通过 443 访问就不用改):
flow.joyzhi.com { reverse_proxy localhost:5678 }打开 n8n,随便新建一个 Webhook 节点,它的 Production URL 现在应该是
https://flow.joyzhi.com/webhook/xxxxxx——没有端口号,也不会再是
localhost➉。
常见陷阱与排查
参考资料(节选)
n8n 在反向代理下按
N8N_PROTOCOL+N8N_HOST+N8N_PORT生成 Webhook➀ (n8n 文档)Webhook 节点示例 URL 说明➁ (n8n 文档)
WEBHOOK_URL用于覆盖默认 URL➂ (n8n 文档)Telegram 触发器文档强调反向代理需
WEBHOOK_URL➃ (n8n 文档)n8n 配置方法文档,说明环境变量可通过 compose / .env 设置➅ (n8n 文档)
社区帖子成功案例:在 compose 里加五个变量解决
localhost:5678➇ (n8n Community)Reddit Caddy 部署帖同样用这些变量去掉
:5678➈ (Reddit)GitHub issue #8638 指出未改变量会在外链里带端口➉ (github.com)
评论