n8n部署及实现ai自动化生成产品图

2026-03-12

本文将详细复盘如何在一台独立的虚拟专用服务器(VPS)上从零部署开源自动化平台 n8n,并解决反向代理导致的前端失联问题。同时,本文将完整拆解一个典型的“AI 自动化流水线”的业务需求,涵盖第三方大语言模型 API 的配置、视觉模型的接入、底层数据格式转换,以及 Google Workspace 生态的 OAuth 2.0 授权集成。

一、 业务需求分析与系统架构设计

在着手搭建节点之前,必须对业务需求进行工程化拆解。本次任务的核心目标是:实现对非结构化/半结构化需求的处理,并自动化产出数字资产。

业务流程拆解(ETL 逻辑):

  1. 数据提取 (Extract):从 Google Sheets 定向读取状态为“待处理”的源数据(包含简短的中文产品描述与场景要求)。

  2. 数据转换 (Transform)

    • 语义重构:接入大语言模型(LLM),将非标的中文需求转化为符合机器视觉模型规范的专业英文提示词(Prompt)。

    • 资产生成:调用 Google Gemini 图像生成 API,基于英文提示词渲染图像。

    • 格式清洗:拦截 API 返回的 Base64 文本数据,在 Node.js 运行时层将其解码为标准的二进制文件流。

  3. 数据加载 (Load)

    • 资产落盘:将二进制图片文件推送到 Google Drive 对象存储池,并获取具有公共访问权限的 URL。

    • 状态回写:利用数据寻址穿透技术,将生成的 URL 映射回源 Google Sheets 的对应行,并将任务状态变更为“已完成”,形成事务闭环。

二、 核心基础设施部署 (VPS 环境)

为保证数据的独立性与可控性,我们选择在 VPS 上基于 Docker 容器化部署 n8n。

2.1 容器化部署方案

在服务器端创建 docker-compose.yml 文件,定义 n8n 服务:

version: '3.8'

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      - GENERIC_TIMEZONE=Asia/Shanghai
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

执行 docker-compose up -d 启动服务。

2.2 故障排查:Nginx 反向代理与 WebSocket 失联问题

现象描述:通过域名(Nginx 代理)访问 n8n 面板时,经常出现“Connection lost”提示,且在执行工作流时,节点状态无法实时变绿更新,必须手动刷新页面。 根因分析:n8n 的前端 UI 强依赖 WebSocket 协议与后端保持长连接,以推送实时执行日志和节点状态。默认的 Nginx 反向代理配置仅转发 HTTP 请求,未升级协议,导致 WebSocket 连接被阻断。 解决方案:在 Nginx 的配置文件(或虚拟主机配置)中,显式声明协议升级标头。

server {
    listen 443 ssl;
    server_name n8n.yourdomain.com;

    # SSL 配置略...

    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 $scheme;
        
        # 核心修复:开启 WebSocket 代理支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 延长超时时间,避免长任务被 Nginx 强行切断
        proxy_read_timeout 7200s;
        proxy_send_timeout 7200s;
    }
}

重载 Nginx 配置 (nginx -s reload) 后,失联问题即可彻底解决。

三、 工作流节点配置与 API 集成实战

3.1 接入第三方 LLM 代理平台 (HTTP Request)

由于直接调用 OpenAI 等官方接口存在网络或计费壁垒,通常采用第三方中转 API。

  • 节点类型HTTP Request

  • 请求方法POST

  • 鉴权配置:选择 Generic Credential Type -> Header Auth,设置 Name 为 Authorization,Value 为 Bearer YOUR_PROXY_API_KEY

  • 数据载荷 (Payload):必须选择 JSON 格式,并开启表达式(Expression)以注入动态变量。避免直接在键值对界面操作引发的转义错误。

{
  "model": "gpt-5.2",
  "messages": [
    {
      "role": "user",
      "content": "请将以下原始产品要求,转化为专业的英文图像生成 Prompt,仅返回纯英文文本:{{ $json.composedPrompt }}"
    }
  ]
}

3.2 接入 Google Gemini 视觉模型

通过 Google AI Studio 获取 API 密钥,调用底层大模型进行图像渲染。

  • 端点 URLhttps://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent

  • Header 参数x-goog-api-key : YOUR_GEMINI_API_KEY

  • 动态载荷配置:提取上一个 HTTP 节点返回的英文文本作为输入。

{
  "contents": [
    {
      "parts": [
        {
          "text": "{{ $json.choices[0].message.content }}"
        }
      ]
    }
  ]
}

3.3 数据流转换:Base64 至 Binary

RESTful API 无法直接传输文件实体,Gemini API 返回的图像载荷为 Base64 编码的字符串。需通过 Code 节点执行原生 JavaScript 进行流转换。

// 提取深层嵌套的 Base64 字符串
const base64Image = $input.first().json.candidates[0].content.parts[0].inlineData.data;

// 调用 Node.js 底层 Buffer 模块解码
const binaryData = Buffer.from(base64Image, 'base64');

// 按照 n8n 的底层数据结构规范输出
return {
  json: $input.first().json,
  binary: {
    data: {
      data: binaryData.toString('base64'),
      mimeType: 'image/jpeg',
      fileName: 'generated_image.jpg'
    }
  }
};

3.4 对象存储配置与 OAuth 2.0 鉴权排雷

在使用 Google Drive 节点执行 Upload file 操作时,极易遭遇 HTTP 403 storageQuotaExceeded 错误。

  • 故障机制:如果使用 Google Cloud Service Account(服务账号 JSON 凭证)进行鉴权,由于 Google Workspace 并不为服务账号分配网盘存储配额(0 KB),上传操作会被强制拒绝。

  • 架构级修复方案:全面转向 OAuth 2.0 Authorization Code Flow。

    1. 在 GCP 控制台中,创建类型为 Web application 的 OAuth Client ID。

    2. 将 n8n 面板提供的 Callback URL 填入重定向白名单。

    3. 在 n8n 中使用该凭证,通过个人/企业主体 Google 账号进行网页端交互授权,从而使用具有实际存储配额的主体网盘空间。

3.5 事务回写与上下文穿透寻址

最后一步为使用 Google Sheets 节点更新源表。

  • 技术难点 (Context Loss):n8n 的数据结构是线性覆盖的。历经网络请求、代码转换、文件上传等多个节点后,初始节点提取的行号(row_number)已从当前的 JSON 上下文中丢失。若直接更新,系统将报出索引为空的致命错误。

  • 解决方案:利用 n8n 的跨节点寻址语法,直接穿透当前作用域,读取工作流前端的历史执行记录。

row_number 字段开启表达式,输入:

{{ $('Get row(s) in sheet').item.json.row_number }}

随后更新目标列的状态值为“已完成”,并填入 $json.webViewLink,至此,整套自动化工作流闭环完成。

结语

通过梳理上述部署与配置流程,验证了无代码/低代码平台在处理复杂 API 编排与异构系统集成时的强大工程能力。合理的异常捕获、正确的鉴权协议选择以及对数据流传输机制的深刻理解,是确保自动化流水线具备高可用性的关键。

8139d6cbf0c12a44767dbfa088c660ec.jpg
image-Fkad.png
image-gIqF.png
image-sbDT.png
image-ABew.png