引言
环境介绍与部署方案
-
因为家里是电信宽带,有公网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: alwayscontainer_name: traefikdns:- 119.29.29.29- 223.5.5.5- 8.8.8.8command:- "--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=10volumes:- "./letsencrypt:/letsencrypt"- "/var/run/docker.sock:/var/run/docker.sock:ro"# ----------------------------------------# 2. n8n 相关# ----------------------------------------postgres:image: postgres:16-alpinerestart: alwayscontainer_name: n8n_postgresenvironment:- POSTGRES_USER=${POSTGRES_USER}- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}- POSTGRES_DB=${POSTGRES_DB}ports:- "5432:5432"volumes:- ./postgres_data:/var/lib/postgresql/datahealthcheck:test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]interval: 5stimeout: 5sretries: 5n8n:image: n8nio/n8n:latestrestart: alwayscontainer_name: n8nenvironment:- 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:- postgresvolumes:- ./n8n_data:/home/node/.n8n- ./templates:/files/templates # 映射本地模板目录到容器内depends_on:postgres:condition: service_healthylabels:- "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颗+枸杞少许
夏天胎菊多一些,枸杞少一些,冬天则相反

