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 小时前
停服公告-柴框云
运维
程序猿阿伟2 小时前
《Opencloak代理的自动化验证指南》
java·运维·自动化
zhangfeng11332 小时前
htop命令根据实际Linux环境下的讲解,结合国家超算中心hpc
linux·运维·服务器
日取其半万世不竭2 小时前
Gitea SSH 克隆失败?域名、端口和 ROOT_URL 配置检查
运维·ssh·gitea
stolentime3 小时前
Mailwarm 2.0 邮件送达率提升效果实测
运维·网络·网易邮箱大师
志栋智能3 小时前
超自动化安全的文化挑战:如何推动安全团队变革?
运维·网络·人工智能·安全·自动化
IT策士3 小时前
第 42 篇 k8s之日志管理:使用 EFK 或 Loki 采集日志
云原生·容器·kubernetes
ReadVersion3 小时前
Ubuntu 22.04 设置时区
linux·运维·ubuntu
左心房的默白,,,3 小时前
32:Trace Data(S6F11)工艺追踪数据与FDC对接逻辑
运维·自动化