在 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 -d
Caddyfile 保持简洁(若已能通过 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)
评论