最近把几个内部自动化流程从脚本迁到 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。镜像只是第一层,真正要维护的是凭据、数据、回调入口和升级纪律。