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

相关推荐
少威shaowei1 小时前
在 Mac 上搭建 DNS 服务器
运维·服务器·macos
qq_452396231 小时前
第十八篇:《Docker 监控与性能优化》
docker·容器·性能优化
utf8mb4安全女神2 小时前
shell脚本
linux·运维·服务器
网络与设备以及操作系统学习使用者2 小时前
多路由设备静态路由配置详解
运维·网络·学习·华为·智能路由器
openFuyao2 小时前
AI Native基础设施的目标形态和它存在的一些挑战有哪些?K8s驱动异构算力面临挑战,下一代的K8s是渐进式优化,还是革命式的驱动AI的发展
人工智能·容器·kubernetes
daad7772 小时前
sitl_5760_io记录
linux·运维·服务器
Albert Edison2 小时前
【Docker】镜像仓库(Registry)
运维·docker·容器
小则又沐风a2 小时前
今日算法----一篇文章学会背包问题
运维·服务器·算法
IT策士2 小时前
第 41 篇 k8s之监控:Metrics Server 与 Prometheus 快速上手
容器·kubernetes·prometheus