n8n Docker Compose 部署:Postgres、Webhook 和数据卷配置

本文记录一套 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_URLN8N_HOSTN8N_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、反向代理、凭据、备份和升级回滚。

相关推荐
蓝胖的四次元口袋2 小时前
Docker Compose多容器编排与Nginx集群实战
运维·nginx·docker compose
懂软件的胡子个哥2 小时前
微信 API 消息回调怎么设计,才能避免丢消息和重复处理
运维·微信·架构·wechatapi·个人微信号二次开发
吉甫作诵2 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
Acrellea4 小时前
告别粗放式能耗管理!安科瑞EIOT平台助力产业园区智慧低碳运营
运维·安全·能源
Databuff4 小时前
五款主流 SSH 免费工具介绍
运维·ssh·运维开发
菜鸟学编程o4 小时前
Linux常见指令
linux·运维·服务器
pt10435 小时前
AIOps机器学习——当警报阈值被调高之后
运维·人工智能·自动化
迪康coolmu5 小时前
企业文件外发管控落地实践 —— 基于迪康端点安全一体化管理系统
运维·网络·经验分享·安全
见闻小天地6 小时前
四方电气DL300变频器面向雕铣机多工况的技术参数与适配验证
运维·人工智能·业界资讯
千舟软件7 小时前
【宿舍管理小程序】新生入住不靠纸质表
大数据·运维·服务器·科技·业界资讯