在 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_PROTOCOL

http / https

N8N_HOST

公网可访问的主机名

N8N_PORT

n8n 内部监听端口(通常 5678)

WEBHOOK_URL

显式覆盖所有生产 Webhook URL(可去掉端口)

⚠ 推荐

N8N_EDITOR_BASE_URL

编辑器/邮件/SAML 里用到的前端 URL

可选

  • n8n 在发现自己处于反向代理之后,官方文档建议直接设置 WEBHOOK_URL 来避免把 :5678 带到公网➂➃。

  • 如果还要让邀请邮件、OAuth、SAML 等链接正确,官方同样建议把 N8N_EDITOR_BASE_URL 指向你真实的 HTTPS 域名➄。

  • 这些变量全部可以通过 .env 文件或 docker-compose.ymlenvironment:传入容器,重建即可生效➅➆。


操作步骤(Docker + Caddy 示例)

  1. 编辑 .env(或直接写到 compose 文件):

    DOMAIN_NAME=joyzhi.com
    SUBDOMAIN=flow
    
  2. 修改 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
    

    这一做法与官方示例和社区帖的解决方案一致➇➈。

  3. 重建容器

    docker compose down
    docker compose up -d
    
  4. Caddyfile 保持简洁(若已能通过 443 访问就不用改):

    flow.joyzhi.com {
      reverse_proxy localhost:5678
    }
    
  5. 打开 n8n,随便新建一个 Webhook 节点,它的 Production URL 现在应该是

    https://flow.joyzhi.com/webhook/xxxxxx
    

    ——没有端口号,也不会再是 localhost➉。


常见陷阱与排查

症状

原因

处理

Webhook 仍带 :5678

忘记设置 WEBHOOK_URL 或容器没重新部署

docker compose ps 确认镜像是最新并重启

OAuth 回调跳回 localhost

缺少 N8N_EDITOR_BASE_URL

加这一行并重启

变量改了没生效

变量只在容器里 export,退出即丢失

写进 compose / .env 文件再 up -d

Telegram 等服务提示需 HTTPS

WEBHOOK_URL 不是以 https:// 开头

修正为完整 HTTPS 地址


参考资料(节选)

  1. n8n 在反向代理下按 N8N_PROTOCOL+N8N_HOST+N8N_PORT 生成 Webhook➀ (n8n 文档)

  2. Webhook 节点示例 URL 说明➁ (n8n 文档)

  3. WEBHOOK_URL 用于覆盖默认 URL➂ (n8n 文档)

  4. Telegram 触发器文档强调反向代理需 WEBHOOK_URL➃ (n8n 文档)

  5. N8N_EDITOR_BASE_URL 描述和用途➄ (n8n 文档, n8n 文档)

  6. n8n 配置方法文档,说明环境变量可通过 compose / .env 设置➅ (n8n 文档)

  7. 官方“配置 Webhook URL”示例给出的 Docker 环境变量写法➆ (n8n 文档, n8n 文档)

  8. 社区帖子成功案例:在 compose 里加五个变量解决 localhost:5678➇ (n8n Community)

  9. Reddit Caddy 部署帖同样用这些变量去掉 :5678➈ (Reddit)

  10. GitHub issue #8638 指出未改变量会在外链里带端口➉ (github.com)