自托管 n8n:Docker Compose、Webhook 和升级备份排查

最近把几个内部自动化流程从脚本迁到 n8n:表单提交后建工单,告警进来后做 AI 摘要,再把结果发到群里。n8n 本身不难跑,真正麻烦的是它一旦连上业务系统,就不再是一个普通容器。

这篇记录我会按这几个层次排:镜像、数据库、数据卷、Webhook、反代、备份升级。

1. 先别急着写工作流

我一般先看镜像能不能拉:

bash 复制代码
docker pull docker.1ms.run/n8nio/n8n:stable
docker pull docker.1ms.run/postgres:16-alpine

如果 docker compose pull 都卡住,后面排 WEBHOOK_URL、凭据和节点配置都是空转。镜像层通过以后,再进入应用配置。

2. Compose 配置

团队使用不建议只跑单容器。下面这份配置把 n8n 和 Postgres 放在一起,端口只暴露给本机反代:

yaml 复制代码
services:
  postgres:
    image: docker.1ms.run/postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

  n8n:
    image: docker.1ms.run/n8nio/n8n:stable
    restart: unless-stopped
    depends_on:
      - postgres
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_HOST: ${N8N_HOST}
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://${N8N_HOST}/
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      GENERIC_TIMEZONE: Asia/Shanghai
      TZ: Asia/Shanghai
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  postgres_data:
  n8n_data:

3. .n8n 数据卷别省

n8n 官方文档提到,默认可以用 SQLite 保存凭据、执行历史和工作流,也支持 Postgres。接了 Postgres 以后,/home/node/.n8n 仍然值得保留,因为这里还会有加密密钥、实例日志和部分本地资产。

所以这里有两类数据要备份:

bash 复制代码
docker compose exec -T postgres pg_dump -U n8n n8n > n8n-postgres.sql
bash 复制代码
docker run --rm \
  -v n8n_data:/data \
  -v "$PWD":/backup \
  docker.1ms.run/alpine:3.20 \
  tar czf /backup/n8n-data.tgz -C /data .

4. Webhook 要按外部访问路径配置

很多 n8n 流程是由 Webhook 触发的。内网能打开 http://127.0.0.1:5678,不代表外部平台能回调。

要检查:

典型问题
N8N_HOST 域名和实际访问域名不一致
N8N_PROTOCOL 反代是 HTTPS,但 n8n 生成 HTTP 地址
WEBHOOK_URL 外部服务拿到错误回调地址
反代头 缺少 X-Forwarded-Proto
入口安全 Webhook 没有签名或 Token

Nginx 方向:

nginx 复制代码
location / {
    proxy_pass http://127.0.0.1:5678;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto https;
}

5. 升级前先问三个问题

bash 复制代码
docker compose pull
docker compose up -d
docker compose logs -f n8n

升级动作很简单,但团队环境里要先确认:

  • 关键工作流有没有导出或备份。
  • Webhook 触发器是否在测试环境跑过。
  • 凭据、数据库和数据卷是否都能恢复。

否则一次小版本升级,可能会把一条没人记得细节的自动化流程打断。

6. 我的部署顺序

text 复制代码
镜像预检
  -> Postgres 和数据卷
  -> n8n 启动日志
  -> 反向代理和 HTTPS
  -> Webhook 回调
  -> 凭据最小权限
  -> 备份和升级演练

n8n 值得自托管,但前提是把它当成内部工作流系统,而不是一个临时 Demo。镜像只是第一层,真正要维护的是凭据、数据、回调入口和升级纪律。

相关推荐
XIAOYU6720138 分钟前
自动化考什么证书对就业有帮助?大学生就业规划与证书路线全攻略
运维·自动化
Yana.nice10 分钟前
Linux logrotate 日志切割未生效
linux·运维·服务器
运维老郭18 分钟前
Ubuntu下编译安装Redis:从0到1可用的完整指南
运维·云原生
爱喝水的鱼丶20 分钟前
SAP-ABAP:一次关于“交货日期”的增强需求:从复杂增强到标准功能的回归之旅
运维·开发语言·性能优化·sap·abap·经验交流
运维大师24 分钟前
【K8S 运维实战】07-Pod生命周期与故障排查
运维·容器·kubernetes
OpenAnolis小助手30 分钟前
龙蜥社区智算联盟发布《智算集群基础设施运维通用技术要求》(附下载链接)
运维·人工智能·智算运维·龙蜥智算联盟
.柒宇.40 分钟前
ELK日志分析系统实战指南:Elasticsearch搭建与入门(8.18.8版本)
运维·elk·elasticsearch·logback·日志系统
小刘数字化1 小时前
AR数字孪生:重塑工业运维的下一代交互范式
运维·ar
翰德恩咨询1 小时前
华为DSTE咨询洞察:如何规划人才支撑战略落地
运维·服务器·华为
敖行客 Allthinker14 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu