本文记录一套 n8n 自托管部署方式:Docker Compose + Postgres + 数据卷 + 反向代理。适合团队内部自动化工作流、Webhook 编排、告警分发和 AI 摘要场景。
环境说明
- Docker Engine / Docker Desktop 均可。
- n8n 使用
stable镜像。 - 数据库使用 Postgres。
- n8n 端口只绑定本机
127.0.0.1:5678。 - HTTPS 和公网/内网域名由反向代理处理。
1. 预检镜像
先确认服务器能拉到 n8n 和 Postgres 镜像:
bash
docker pull docker.1ms.run/n8nio/n8n:stable
docker pull docker.1ms.run/postgres:16-alpine
如果这一步卡住,先处理 Docker 镜像拉取问题,再继续配置数据库和 Webhook。
2. 准备 .env
env
N8N_HOST=n8n.example.com
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.example.com/
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=change-this-password
N8N_ENCRYPTION_KEY=change-this-to-a-long-random-string
N8N_ENCRYPTION_KEY 需要固定保存。迁移和恢复时不要更换,否则凭据相关数据会变得难处理。
3. 编写 compose.yaml
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_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PORT: 5678
N8N_PROTOCOL: ${N8N_PROTOCOL}
WEBHOOK_URL: ${WEBHOOK_URL}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${TZ}
volumes:
- n8n_data:/home/node/.n8n
volumes:
postgres_data:
n8n_data:
4. 启动和查看日志
bash
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f n8n
检查数据库:
bash
docker compose exec postgres pg_isready -U n8n
5. 配置反向代理
n8n 默认监听 5678。生产或团队内网环境建议不要直接暴露容器端口,而是用反向代理接 HTTPS:
nginx
server {
listen 443 ssl;
server_name n8n.example.com;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
验证:
bash
curl -I https://n8n.example.com/
如果 Webhook 回调地址不对,优先检查 .env 里的 WEBHOOK_URL、N8N_HOST 和 N8N_PROTOCOL。
6. 备份
备份 Postgres:
bash
docker compose exec -T postgres pg_dump -U n8n n8n > n8n-postgres.sql
备份 n8n 数据卷:
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 .
7. 升级
bash
docker compose pull
docker compose up -d
docker compose logs -f n8n
团队环境建议先在测试机导入关键工作流,确认 Webhook、凭据、定时任务和数据库连接都正常,再升级生产环境。
常见问题
只用 SQLite 可以吗
个人体验可以。团队使用更建议 Postgres,因为工作流、执行记录和凭据会变成团队资产。
用了 Postgres 还要挂载 /home/node/.n8n 吗
要。这个目录不只是 SQLite 数据库,还会涉及加密密钥、实例日志和本地资产。
tunnel 能用于生产吗
不建议。tunnel 更适合本地开发测试。生产或内网长期运行应使用自己的域名、HTTPS 和访问控制。
镜像拉取通过后就算部署完成吗
不是。镜像只是第一层。n8n 真正要跑稳,还要检查 Postgres、Webhook、反向代理、凭据、备份和升级回滚。