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、反向代理、凭据、备份和升级回滚。

相关推荐
2601_949499941 分钟前
芯瑞科技 DT‑1414完全兼容HFBR‑1414TZ光模块国产化优选方案深度解析(工程师视角)
运维·网络·人工智能·科技·光模块
高卧怡怡3 分钟前
Kubernetes的控制器实验
云原生·容器·kubernetes
一路向北finish4 分钟前
《CentOS7 OpenStack Mitaka 全栈部署实战:双节点搭建全流程与典型故障排坑指南》
运维·mysql·serverless·云计算·openstack
XUEYUAN52127 分钟前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
guo_wen_qiang24 分钟前
mac中iTerm有没有类似xshell远程连接服务器的用户名密码方式,不用每次都要输入用户密码
运维·服务器·macos
xzl0433 分钟前
Ubuntu24.04 生产环境 Docker(全国内源)
运维·docker·容器
lajidecrd36 分钟前
Ubuntu 24.04 LTS安装
linux·运维·ubuntu
沫璃染墨44 分钟前
《从零入门Linux系统篇(二十九):文件篇·二——深入文件描述符:从文件描述符表到重定向,再到Shell实现》
linux·运维·服务器·c++·驱动开发·系统架构
竣达技术1 小时前
守护变电站直流 “生命线”|竣达 BMS‑PRO‑II 智能电池综合管理单元,让蓄电池运维看得见、管得牢
运维·监控系统·机房监控
腾讯数据架构师1 小时前
摩尔线程 GPU 怎么接入 Kubernetes 跑 DeepSeek?CubeStudio 摩尔线程(MUSA)适配实操
人工智能·云原生·容器·kubernetes·开源·mlops·maas