大数跨境
0
0

n8n工作流:域名+https访问

n8n工作流:域名+https访问 CodeGallop
2025-12-05
44
导读:引言上一篇文章虚拟机上安装n8n:docker compose方式因为n8n 的最新版本(1.120.x)为了


引言

上一篇文章虚拟机上安装n8n:docker compose方式因为n8n 的最新版本(1.120.x)为了安全增加了更严格的 HTTP 头(Header),只能在浏览器临时添加白名单解决访问受限的问题。要想正式的使用n8n平台,最好采用域名+https的方式进行部署访问。
所以准备在家里的NAS上重新部署一套n8n平台,这样以后就可以随时随地的调用n8n的工作流了。

环境介绍与部署方案

环境介绍:
  • 因为家里是电信宽带,有公网ip,但随时会变,所以采用在NAS上部署一个ddns随时监测并通过接口对托管在腾讯云上的域名进行解析变更。
  • 我的域名是托管在腾讯云上的,所以需要通过SecretId 和 SecretKey,以接口调用的方式来修改DNS 记录。
  • 通过电信光猫的端口映射,把NAS上的虚拟机端口映射到公网ip的端口上,这样就解决了端口的问题。
  • 因为电信宽带的公网ip不允许开放80、443等常用端口,所以https不能采用默认的端口。

部署方案:
  • 仍然采用docker compose方式进行n8n平台部署。
  • n8n默认使用的数据库是sqlite3,这里改为Postgres数据库,会比默认的更稳定。
  • 使用Traefik 处理HTTP 反向代理,它能自动管理和续期申请https证书。
  • Traefik的 流程图解:
    用户请求 ->  EntryPoints  (443端口) ->  Routers  (匹配域名) ->  Middlewares  (处理) ->  Services  (转发) ->  你的容器

Traefik 是一个现代化的 HTTP 反向代理和负载均衡器,它的核心设计理念是为了简化微服务和容器化应用(如 Docker、Kubernetes)的部署。

简单来说,Traefik 就是“云原生时代的 Nginx”。

它最大的特点是自动化和动态发现。在部署 n8n 时,几乎没有修改 Traefik 自身的主配置文件,而是在容器上打标签(Labels),Traefik 就自动把路由配好了,这就是它的魔力所在。

第一步:准备腾讯云 API 密钥

1.1获取腾讯云API密钥

Traefik 需要有权限修改你的 DNS 记录(添加一条 TXT 记录)来证明域名属于你。

1.  登录 腾讯云控制台:https://console.cloud.tencent.com/。

2.  进入访问管理 (CAM) -> 访问密钥 -> API 密钥管理

3.  新建密钥,获取 SecretId 和 SecretKey

4. 注意:为了安全,建议创建一个子账号,仅授予 `QcloudDNSPodFullAccess` 权限,但如果你嫌麻烦,用主账号密钥也可以,请保管好密钥。

腾讯云控制台的密钥截图如下:

SecretKey 只有在创建的时候能查看,所以创建的时候需要保管好。

1.2 解析一个n8n专用的二级域名

因为我的域名是托管在腾讯云上的,所以这里以腾讯云为例:

1.登录腾讯云DNS解析,地址:https://console.cloud.tencent.com/cns

2. 解析一个n8n专用的二级域名:

比如你的根域名是:gallop.com,解析后的n8n专用域名为:n8n.gallop.com,ip地址指向你家里NAS的公网ip地址即可。

第二步:配置 .env 文件

2.1 配置 .env 文件

在存放docker-compose.yml的目录中创建.env文件,文件内容如下:

# .env 文件
# 1. 域名配置# 你的完整域名 (例如 n8n.example.com)DOMAIN_NAME=<你的n8n平台域名># 你的邮箱 (用于 SSL 证书通知)SSL_EMAIL=<你的email地址>
# 2. 腾讯云 API 密钥 (Traefik 申请证书用)TENCENTCLOUD_SECRET_ID=<腾讯云的SecretId>TENCENTCLOUD_SECRET_KEY=<腾讯云的SecretKey>
# 3. 端口配置# 外部访问端口 (在路由器映射的端口,例如 9443)HTTPS_PORT=9443
# 4. n8n 配置GENERIC_TIMEZONE=Asia/ShanghaiN8N_PORT=5678# !!! 关键配置 !!!# 必须带上端口号,否则 OAuth 和 Webhook 会失败WEBHOOK_URL=https://${DOMAIN_NAME}:${HTTPS_PORT}/
# 5. 数据库配置POSTGRES_USER=n8nPOSTGRES_PASSWORD=n8n123456POSTGRES_DB=n8n
# 6. n8n 加密秘钥 (随便写一长串乱码)N8N_ENCRYPTION_KEY=beg7AoU8hAeFac0m9kCO/IbxAnK5IBx3

第三步:编写 docker-compose.yml

3.1 编辑docker-compose.yml

详细内容如下:

version: "3.7"
services:  # ----------------------------------------  # 1. Traefik (保持不变)  # ----------------------------------------  traefik:    image: "traefik:v2.10"    restart: always    container_name: traefik    dns:      - 119.29.29.29      - 223.5.5.5      - 8.8.8.8    command:      - "--api.insecure=true"      - "--providers.docker=true"      - "--providers.docker.exposedbydefault=false"      - "--entrypoints.websecure.address=:443"      # DNS 验证配置      - "--certificatesresolvers.myresolver.acme.dnschallenge=true"      - "--certificatesresolvers.myresolver.acme.dnschallenge.provider=tencentcloud"      # [核心修复步骤 1] 强制 Traefik 使用指定的 DNS 服务器进行验证 (绕过本地 DNS 问题)      # 这里指定腾讯云 DNS (119.29.29.29) 和 阿里 DNS (223.5.5.5)      - "--certificatesresolvers.myresolver.acme.dnschallenge.resolvers=119.29.29.29:53,223.5.5.5:53"      # [建议] 增加这个参数,禁用 CNAME 支持,有时能解决解析路径问题      - "--certificatesresolvers.myresolver.acme.dnschallenge.disablepropagationcheck=true"       - "--certificatesresolvers.myresolver.acme.dnschallenge.delaybeforecheck=30"      - "--certificatesresolvers.myresolver.acme.email=${SSL_EMAIL}"      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"    ports:      - "${HTTPS_PORT}:443"    environment:      - TENCENTCLOUD_SECRET_ID=${TENCENTCLOUD_SECRET_ID}      - TENCENTCLOUD_SECRET_KEY=${TENCENTCLOUD_SECRET_KEY}      # [建议] 增加 HTTP 超时设置,防止网络波动      - TENCENTCLOUD_HTTP_TIMEOUT=30      - TENCENTCLOUD_POLLING_INTERVAL=10    volumes:      - "./letsencrypt:/letsencrypt"      - "/var/run/docker.sock:/var/run/docker.sock:ro"  # ----------------------------------------  # 2. n8n 相关   # ----------------------------------------  postgres:    image: postgres:16-alpine    restart: always    container_name: n8n_postgres    environment:      - POSTGRES_USER=${POSTGRES_USER}      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}      - POSTGRES_DB=${POSTGRES_DB}    ports:      - "5432:5432"    volumes:      - ./postgres_data:/var/lib/postgresql/data    healthcheck:      test: ["CMD-SHELL""pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]      interval: 5s      timeout: 5s      retries: 5
  n8n:    image: n8nio/n8n:latest    restart: always    container_name: n8n    environment:      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}      - N8N_HOST=${DOMAIN_NAME}      - N8N_PORT=${N8N_PORT}      - N8N_PROTOCOL=https      - WEBHOOK_URL=${WEBHOOK_URL}      - 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}      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}    links:      - postgres    volumes:      - ./n8n_data:/home/node/.n8n      - ./templates:/files/templates  # 映射本地模板目录到容器内    depends_on:      postgres:        condition: service_healthy    labels:      - "traefik.enable=true"      - "traefik.http.routers.n8n.rule=Host(`${DOMAIN_NAME}`)"      - "traefik.http.routers.n8n.entrypoints=websecure"      - "traefik.http.routers.n8n.tls.certresolver=myresolver"      - "traefik.http.routers.n8n.tls.domains[0].main=${DOMAIN_NAME}"      - "traefik.http.services.n8n.loadbalancer.server.port=5678"
volumes:  n8n_data:  postgres_data:

我的n8n docker compose 目录截图如下:

第四步:启动与检查

4.1 docker compose 启动

1. 启动服务

docker compose up -d

2. 查看 Traefik 日志(重要)

   因为涉及到 API 调用,建议先查看日志确保证书申请成功:

docker compose logs -f traefik
  • 如果你看到 `Configuration loaded from flags` 且没有报错,说明成功了。

  • 如果报错 `LimitExceeded`,说明腾讯云 API 频率限制,稍等一会重试。

  • 如果报错 `AuthFailure`,说明 SecretId/Key 填错了。

截图如下:

查看n8n的启动日志,如截图:

docker compose logs -f n8n

第五步:路由器设置

5.1 端口映射

请确保你的路由器做了如下端口映射:

  • 外部端口9443 (或者你在 .env 里填写的 HTTPS_PORT)

  • 内部 IP:NAS 的局域网 IP

  • 内部端口9443 (这必须和 .env 里的 HTTPS_PORT 一致,因为上面的 docker-compose 映射是 "${HTTPS_PORT}:443")。

最终访问

在浏览器输入:

https://n8n.你的域名.com:9443

你会看到绿色的小锁,且 n8n 可以正常使用。

我的截图如下:

这样一套用域名+https部署的n8n平台就算完成了。很适合家里有NAS的个人用户,或者想在公司内网部署n8n的小规模公司使用。

今天就分享到这,下次见

如果本文对你有帮助,不妨点个免费的赞收藏备用。

👇 关注Gallop,让AI提升你的效率



👉 添加我的微信(gallop_liu),备注“加群”,交流并分享个人的一些资料。

程序猿的养生茶:

胎菊8颗+玫瑰6颗+枸杞少许

夏天胎菊多一些,枸杞少一些,冬天则相反

【声明】内容源于网络
0
0
CodeGallop
AI正在改变世界,而你可以轻松成为参与者!AI提高代码效率-->AI提高工作学习效率-->AI提升生活指数,用AI武装你的生活和工作吧!快来加入AI探索之旅吧!🤖🚀
内容 42
粉丝 0
CodeGallop AI正在改变世界,而你可以轻松成为参与者!AI提高代码效率-->AI提高工作学习效率-->AI提升生活指数,用AI武装你的生活和工作吧!快来加入AI探索之旅吧!🤖🚀
总阅读48
粉丝0
内容42