自托管 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。镜像只是第一层,真正要维护的是凭据、数据、回调入口和升级纪律。

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜7 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
程序员老赵7 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
SelectDB8 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207010 天前
如何搭建本地yum源(上)
运维
武子康10 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple