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

相关推荐
林间码客14 小时前
从DevOps到DevSecOps:构建现代软件交付的基石与护城河
大数据·运维·devsecops·devops
Lust Dusk15 小时前
记一次Linux应急响应题目解析
linux·运维·服务器·网络·安全·网络安全
轻揉小乔 真新人16 小时前
使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
运维·nginx·缓存
Yan_chen66617 小时前
SSH(Secure Shell)安全外壳协议详解
运维·网络协议·ssh
lingran__18 小时前
Linux 基础常用指令万字详解(上)|文件目录命令,结合底层原理剖析
linux·运维·服务器·后端·centos·linux基础指令
各类产品分享18 小时前
电力行业AR智能运维哪个品牌好
运维·ar·ar巡检
贾天佑忆月 迷失的昵19 小时前
客户端与服务器持续同步解析(轮询,comet,WebSocket)
运维·服务器·websocket
刘某的Cloud19 小时前
Galera Cluster mariadb 生产环境常见问题排查与运维指南
linux·运维·数据库·mariadb·集群高可用
雨辰AI19 小时前
K8s 国产数据库慢 SQL 自动监控|Prometheus+Grafana 可视化全落地
数据库·sql·安全·容器·kubernetes·grafana·prometheus
GGG76619 小时前
k8s的 Node and Cluster实战
容器·kubernetes