在这里插入图片描述

读完本文,你将收获:

  • 理解 n8n 是什么、能做什么、为什么值得选择
  • 掌握三种 Docker 部署方案:快速体验版、单机持久化版、生产就绪版
  • 学会配置 PostgreSQL 数据库、Nginx 反向代理、HTTPS 证书
  • 避开时区、Webhook、数据库膨胀等常见踩坑点
  • 拥有一套可直接复用的部署脚本和运维命令

故事的开始:
老板说要降本增效,小禾说好

上周五下班前,老板把小禾叫到办公室:“小禾啊,公司现在要降本增效,你看看能不能把那些重复性的工作自动化一下?比如每天早上把销售数据汇总发到群里、新客户注册自动发欢迎邮件、GitHub 有 issue 自动通知钉钉…”

小禾心想,这不就是要写一堆定时脚本吗?Python 脚本 + Crontab,经典组合,干就完了。

但转念一想,每个需求都写脚本,代码散落各处,维护起来像在玩"找茬游戏"。而且运营同事也有类似需求,难道还要他们学 Python?

于是小禾开始搜索"低代码自动化平台",一番比较后,目光停在了 n8n 上:

平台 开源? 私有化? 节点数量 社区活跃度
Zapier 5000+
Make (原 Integromat) 1000+
n8n 400+ 极高

开源、可私有化、Star 数 60k+、还支持自定义代码节点…

“就是你了!”

然后小禾用了一个下午就部署好了。这篇文章就是小禾的部署实战记录,手把手带你从零开始,绝不让你踩小禾踩过的坑。


n8n 是个啥?为什么选它?

一句话解释

n8n(发音:n-eight-n)是一个开源的工作流自动化平台,你可以把它理解为"开源版 Zapier"或"可私有化的 Make"。

它的核心理念是:用拖拽的方式,把各种服务串联起来,实现自动化。

触发器 → 处理节点 → 处理节点 → ... → 输出

比如:“每天早上 9 点,从数据库拉取昨日销售数据 → 用 AI 生成总结 → 发送到企业微信群”。

以前这需要写代码,现在只需要拖拽几个节点,连线,Done。

为什么选 n8n?

优势 说明
开源免费 MIT 协议,社区版完全免费,想怎么用就怎么用
私有化部署 数据完全在自己手里,不用担心商业机密泄露
400+ 集成 支持主流服务:Slack、Discord、飞书、钉钉、企业微信、MySQL、PostgreSQL、HTTP、OpenAI…
代码节点 内置 JavaScript/Python 节点,复杂逻辑照样能搞
AI 原生 内置 AI Agent、向量数据库、RAG 等节点,天生适合 AI 应用
可视化调试 每个节点的输入输出一目了然,debug 不抓瞎
社区活跃 GitHub 60k+ Star,社区节点丰富,遇到问题有人答

n8n 能做什么?几个真实场景

场景 1:销售数据日报

定时触发(每天9点) → 查询MySQL → AI总结 → 发送企业微信

场景 2:客户自动跟进

新客户注册(Webhook) → 发欢迎邮件 → 3天后检查是否下单 → 未下单则发优惠券

场景 3:GitHub Issue 通知

GitHub新Issue → 翻译成中文 → 发送钉钉/飞书

场景 4:内容自动分发

公众号发文(RSS) → AI生成摘要 → 同步发到Twitter/LinkedIn/知乎

场景 5:AI 客服机器人

收到用户消息 → RAG检索知识库 → GPT生成回复 → 返回用户

看到这里,是不是有点心动了?下面开始动手部署!


前置准备:磨刀不误砍柴工

硬件与系统要求

组件 最低要求 推荐配置 本文测试环境
CPU 1 核 2 核+ 2 核
内存 2GB 4GB+ 4GB
硬盘 10GB 20GB+ 40GB SSD
系统 Ubuntu 22.04/24.04 Ubuntu 22.04 LTS Ubuntu 22.04

💡 小贴士:n8n 本身不吃太多资源,但如果你要跑 AI 相关节点(调用 OpenAI 等),建议内存 4GB 起步。

软件准备清单

在开始之前,确保你的服务器上有:

  • Docker(必须)
  • Docker Compose(必须)
  • 一个域名(可选,但强烈建议用于 HTTPS)
  • 能科学上网(部分节点需要访问海外服务)

一键检查环境

# 检查系统版本
cat /etc/os-release | grep VERSION

# 检查 Docker
docker --version

# 检查 Docker Compose
docker compose version

如果 Docker 没装,别慌,下一节就教你。


开始部署:三种姿势任你选

n8n 官方推荐使用 Docker 部署,小禾这里提供三种方案,根据你的需求选择:

方案 适用场景 难度
方案 A:快速体验版 本地试玩,不保存数据
方案 B:单机持久化版 个人/小团队使用
方案 C:生产就绪版 正式环境,带数据库+反向代理

方案 A:快速体验(5 分钟上手)

这个方案适合你先体验一下 n8n 长什么样,数据不持久化,重启就没了

Step 1:安装 Docker(如果没装的话)

# 更新包管理器
sudo apt update && sudo apt upgrade -y

# 一键安装 Docker
curl -fsSL https://get.docker.com | sh

# 把当前用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER

# 重新登录或执行以下命令使生效
newgrp docker

# 验证安装
docker --version

Step 2:一行命令启动 n8n

docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  docker.n8n.io/n8nio/n8n:1.123.5

Step 3:打开浏览器访问

http://你的服务器IP:5678

第一次访问会让你设置管理员账号,填完就能进入主界面了。

⚠️ 注意:这种方式容器停止后数据就没了,仅供体验,不要用于生产环境!


方案 B:单机持久化版(推荐个人使用)

这个方案会把数据保存在本地目录,重启不丢失。

Step 1:创建数据目录

# 创建 n8n 工作目录
mkdir -p ~/n8n-data
cd ~/n8n-data

Step 2:创建 docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:1.123.5
    container_name: n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      # 基础配置
      - N8N_HOST=0.0.0.0
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - NODE_ENV=production

      # 时区设置(重要!)
      - GENERIC_TIMEZONE=Asia/Shanghai
      - TZ=Asia/Shanghai

      # 数据加密密钥(请修改为你自己的随机字符串)
      - N8N_ENCRYPTION_KEY=your-super-secret-encryption-key-change-me

      # 可选:允许使用社区节点
      - N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
    volumes:
      - ./data:/home/node/.n8n
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3
EOF

Step 3:启动服务

# 启动
docker compose up -d

# 查看日志
docker compose logs -f

# 看到类似这行就是启动成功了:
# n8n  | Editor is now accessible via:
# n8n  | http://localhost:5678

Step 4:访问并初始化

浏览器访问 http://你的服务器IP:5678,按提示设置管理员账号。

常用管理命令

# 停止
docker compose down

# 重启
docker compose restart

# 查看状态
docker compose ps

# 更新到最新版(注意检查版本号)
docker compose pull && docker compose up -d

# 查看日志
docker compose logs -f --tail=100

方案 C:生产就绪版(推荐团队/正式环境)

这个方案使用 PostgreSQL 作为数据库,Nginx 作为反向代理,支持 HTTPS,适合正式环境使用。

架构图

Docker Network

HTTPS

用户

Nginx 反向代理

n8n 应用

PostgreSQL

Redis 可选

Step 1:创建项目目录

mkdir -p ~/n8n-production
cd ~/n8n-production
mkdir -p {nginx,postgres-data,n8n-data}

Step 2:创建环境变量文件

cat > .env << 'EOF'
# 数据库配置
POSTGRES_USER=n8n
POSTGRES_PASSWORD=your-strong-postgres-password-change-me
POSTGRES_DB=n8n

# n8n 配置
N8N_ENCRYPTION_KEY=your-32-character-encryption-key!!
N8N_HOST=n8n.yourdomain.com
N8N_PROTOCOL=https
N8N_PORT=5678

# 时区
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
EOF

⚠️ 重要:请务必修改密码和加密密钥为你自己的值!

Step 3:创建 docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - n8n-network

  n8n:
    image: docker.n8n.io/n8nio/n8n:1.123.5
    container_name: n8n
    restart: always
    depends_on:
      postgres:
        condition: service_healthy
    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 配置
      - N8N_HOST=${N8N_HOST}
      - N8N_PORT=${N8N_PORT}
      - N8N_PROTOCOL=${N8N_PROTOCOL}
      - NODE_ENV=production
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}

      # Webhook URL(用于外部回调)
      - WEBHOOK_URL=https://${N8N_HOST}/

      # 时区
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${TZ}

      # 性能优化
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=168
      - EXECUTIONS_DATA_SAVE_ON_ERROR=all
      - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none

      # 安全配置
      - N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
    volumes:
      - ./n8n-data:/home/node/.n8n
    networks:
      - n8n-network
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3

  nginx:
    image: nginx:alpine
    container_name: n8n-nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/certs:/etc/nginx/certs:ro
    depends_on:
      - n8n
    networks:
      - n8n-network

networks:
  n8n-network:
    driver: bridge
EOF

Step 4:创建 Nginx 配置

cat > nginx/nginx.conf << 'EOF'
events {
    worker_connections 1024;
}

http {
    upstream n8n {
        server n8n:5678;
    }

    # HTTP -> HTTPS 重定向
    server {
        listen 80;
        server_name n8n.yourdomain.com;
        return 301 https://$server_name$request_uri;
    }

    # HTTPS 配置
    server {
        listen 443 ssl http2;
        server_name n8n.yourdomain.com;

        # SSL 证书(请替换为你的证书路径)
        ssl_certificate /etc/nginx/certs/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/privkey.pem;

        # SSL 安全配置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        # 代理配置
        location / {
            proxy_pass http://n8n;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            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 $scheme;

            # Webhook 长连接支持
            proxy_read_timeout 300s;
            proxy_connect_timeout 75s;
        }
    }
}
EOF

Step 5:申请 SSL 证书

使用 Let’s Encrypt 免费证书(需要先将域名解析到服务器):

# 安装 certbot
sudo apt install certbot -y

# 申请证书(先停止 nginx 或使用 webroot 模式)
sudo certbot certonly --standalone -d n8n.yourdomain.com

# 复制证书到项目目录
sudo cp /etc/letsencrypt/live/n8n.yourdomain.com/fullchain.pem ./nginx/certs/
sudo cp /etc/letsencrypt/live/n8n.yourdomain.com/privkey.pem ./nginx/certs/
sudo chown -R $USER:$USER ./nginx/certs/

Step 6:启动所有服务

# 启动
docker compose up -d

# 查看状态
docker compose ps

# 应该看到三个服务都是 running/healthy 状态

Step 7:访问并测试

  1. 浏览器访问 https://n8n.yourdomain.com
  2. 设置管理员账号
  3. 创建一个简单的工作流测试

部署后的必做配置

1. 设置证书自动续期

# 创建续期脚本
cat > ~/n8n-production/renew-cert.sh << 'EOF'
#!/bin/bash
cd ~/n8n-production
certbot renew --quiet
cp /etc/letsencrypt/live/n8n.yourdomain.com/fullchain.pem ./nginx/certs/
cp /etc/letsencrypt/live/n8n.yourdomain.com/privkey.pem ./nginx/certs/
docker compose restart nginx
EOF

chmod +x ~/n8n-production/renew-cert.sh

# 添加定时任务(每月 1 号凌晨 3 点执行)
(crontab -l 2>/dev/null; echo "0 3 1 * * ~/n8n-production/renew-cert.sh") | crontab -

2. 设置数据库备份

cat > ~/n8n-production/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR=~/n8n-backups/$(date +%Y%m%d)
mkdir -p $BACKUP_DIR

cd ~/n8n-production

# 备份数据库
docker compose exec -T postgres pg_dump -U n8n n8n > $BACKUP_DIR/n8n-db.sql

# 备份 n8n 数据目录
cp -r ./n8n-data $BACKUP_DIR/

# 保留最近 7 天的备份
find ~/n8n-backups -type d -mtime +7 -exec rm -rf {} + 2>/dev/null

echo "Backup completed: $BACKUP_DIR"
EOF

chmod +x ~/n8n-production/backup.sh

# 每天凌晨 2 点自动备份
(crontab -l 2>/dev/null; echo "0 2 * * * ~/n8n-production/backup.sh") | crontab -

3. 开放防火墙端口

# 如果使用 UFW
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 如果使用云服务器,记得在安全组也开放 80 和 443 端口

踩坑记录:小禾替你踩过的坑

坑 1:时区不对,定时任务抽风

现象:设置的定时任务执行时间不对,比如设置早上 9 点执行,结果凌晨 1 点就跑了。

原因:n8n 容器默认使用 UTC 时区。

解决

environment:
  - GENERIC_TIMEZONE=Asia/Shanghai
  - TZ=Asia/Shanghai

坑 2:Webhook 收不到回调

现象:配置了 Webhook,但外部服务回调不成功。

原因WEBHOOK_URL 没配置或配置错误。

解决

environment:
  - WEBHOOK_URL=https://n8n.yourdomain.com/

坑 3:社区节点安装失败

现象:想安装社区节点,但一直失败。

原因:n8n 默认禁止了一些可能有风险的操作。

解决

environment:
  - N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true

坑 4:执行历史太多,数据库爆了

现象:运行一段时间后,数据库越来越大,甚至磁盘满了。

解决:配置执行记录自动清理

environment:
  - EXECUTIONS_DATA_PRUNE=true
  - EXECUTIONS_DATA_MAX_AGE=168  # 保留 7 天
  - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none  # 成功的执行不保存详情

坑 5:容器重启后数据没了

现象:用方案 A 快速体验后,重启容器数据全没了。

原因:没挂载数据卷。

解决:使用方案 B 或 C,确保有 volumes 配置。


快速避坑清单

# 1. 检查服务状态
docker compose ps

# 2. 查看日志排错
docker compose logs -f n8n

# 3. 进入容器调试
docker compose exec n8n sh

# 4. 检查数据库连接
docker compose exec postgres psql -U n8n -d n8n -c "SELECT 1"

# 5. 检查磁盘空间
df -h

# 6. 检查内存使用
free -h

# 7. 重启所有服务
docker compose restart

# 8. 更新版本(注意先查看 Release Notes)
# 修改 docker-compose.yml 中的版本号,然后:
docker compose pull && docker compose up -d

第一个工作流:体验"真香"时刻

部署完成后,让我们创建第一个工作流来体验一下 n8n 的魅力。

示例:每日天气通知

  1. 点击右上角 “Add workflow” 创建新工作流
  2. 添加 Schedule Trigger 节点,设置每天早上 8 点触发
  3. 添加 HTTP Request 节点,调用天气 API
  4. 添加 Code 节点,格式化数据
  5. 添加 Send EmailHTTP Request(发到企业微信/钉钉)节点

这样,每天早上你就能收到天气预报了。这只是冰山一角,n8n 能做的事情远超你的想象!


彩蛋:n8n 2.0 来了!

2025 年 12 月 5 日,n8n 发布了 2.0 版本,这是一个重要的安全加固版本:

变化 说明
任务运行器默认启用 所有代码节点在隔离环境中执行,更安全
环境变量保护 Code 节点无法直接访问环境变量
危险节点禁用 允许执行任意命令的节点默认禁用
性能优化 高负载下表现更好

💡 n8n 1.x 版本将在 2.0 发布后继续维护 3 个月(仅安全和 bug 修复),如果你追求稳定,可以继续使用本文的 1.123.5 版本;如果你想尝鲜,可以把镜像标签改为 2.0.1latest


写在最后:自动化是解放生产力的第一步

从接到老板的任务到部署完成,小禾只用了一个下午。而这个一下午的投入,换来的是未来无数个小时的解放。

现在,每天早上 9 点,销售数据自动汇总发到群里;新客户注册后,欢迎邮件自动发出;GitHub 有新 issue,钉钉立刻通知。

老板问小禾:“小禾,最近效率挺高啊,是不是偷偷请了助理?”

小禾微微一笑:“是的老板,我请了个 7×24 小时不休息的机器人助理,它叫 n8n。”

如果你也想拥有这样一个永不疲倦的数字助理,现在就动手部署吧!有问题欢迎留言交流。


参考资料:


📚 本文是「AI 基础设施部署」合集的重要篇章。 如果你对私有化部署 AI 应用感兴趣,欢迎 👉 查看「AI 基础设施部署」完整合集,从基础环境搭建到各类 AI 服务部署,一步步构建你的 AI 城堡。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐