1. 为什么 Gemini 3 应用不能直接“上线”先破除三个常见误解很多人看到“Gemini 3 做的应用”第一反应是我本地跑通了不就是个网页吗点开http://localhost:3000就能用那部署不就是把代码扔到服务器上、改个域名的事结果一动手就卡在第一步——页面空白、API 报 403、控制台疯狂刷CORS error或者更绝望的连服务进程都起不来。这不是你技术不行而是对 Gemini 3 应用的本质存在根本性误判。Gemini 3 应用不是传统静态网站它是一类典型的“前端AI后端协同体”。它的核心逻辑链条是用户在浏览器里输入问题 → 前端 JS 收集上下文并构造请求 → 发送给你的后端服务比如一个 FastAPI 或 Next.js API Route→ 后端服务调用 Google 的 Gemini 3 API → 拿到响应后返回给前端 → 前端渲染结果。这个链条里前端只是“壳”真正的智能和状态管理全在后端。而绝大多数人部署失败恰恰是因为把“壳”当成了全部。第一个误解以为前端 build 出来就能直接托管。你用 Vite 或 Create React App 构建出dist/目录上传到 Vercel 或宝塔的 Nginx 静态目录页面能打开但所有按钮点击后无反应。为什么因为你的前端代码里写的fetch(/api/chat)这个地址在静态托管环境下根本没人监听/api/chat这个路径。Vercel 的静态托管只处理.html,.js,.css这些文件它不会自动启动一个 Python 或 Node.js 服务来响应你的 API 请求。这就像把汽车的外壳焊在停车场却忘了装发动机和油箱——看起来像车但一踩油门就熄火。第二个误解以为把后端代码和前端一起扔进 Docker 就万事大吉。你写了个 Flask 后端app.py里调用了genai.GenerativeModel(gemini-3.0-pro)本地python app.py跑得飞起。你兴冲冲写好Dockerfiledocker build -t my-gemini-app .docker run -p 8000:8000 my-gemini-app浏览器访问http://localhost:8000结果页面加载一半就报错Error: Could not find a valid gemini api key。问题出在哪不是密钥没配而是你 Docker 容器启动时环境变量GOOGLE_API_KEY根本没传进去。docker run命令里漏了-e GOOGLE_API_KEYxxx或者你在docker-compose.yml里写了environment:却忘了加env_file:引入.env文件。更隐蔽的是很多新手会把.env文件直接 COPY 进镜像这在生产环境是严重安全违规——密钥会永久留在镜像层里任何人拉取你的镜像都能docker history看到明文密钥。第三个误解以为部署 解决技术问题忽略了合规与成本红线。Gemini 3.0 Pro 是付费模型Google 对 API 调用有严格的用量配额和计费规则。你本地测试一天调用 50 次没问题但一旦网站公开被爬虫扫一下、被朋友转发到群里几小时内就可能触发429 Too Many Requests。更关键的是Google 明确禁止将 Gemini API 密钥硬编码在前端代码中。如果你在src/App.jsx里写了const apiKey AIzaSy...;再用 Vite 构建这个密钥会原封不动打包进dist/assets/index.xxxxx.js里。任何懂点浏览器开发者工具的人点开 Sources 面板CtrlF 搜AIzaSy三秒就能拿到你的密钥然后你的账单会在第二天早上变成天文数字。这不是危言耸听是 Google Cloud Console 里白纸黑字的 Service Usage Policy。所以部署 Gemini 3 应用本质是解决三个维度的问题通信链路的打通前端如何安全地触达后端、运行环境的隔离与稳定后端服务如何在服务器上持续、安全地运行、以及商业模型的可持续性如何防止密钥泄露、用量失控。接下来要讲的三个方法每一个都是针对这三个维度中某个环节的最优解而不是简单罗列“Vercel、Railway、宝塔”三个名字。提示本文所有操作均基于 Gemini 3.0 Pro 的官方 SDK (google-generativeai) 和标准 REST API 实践。不涉及任何非官方 SDK、逆向工程或绕过认证的方案所有方法均符合 Google Cloud 的服务条款。2. 方法一Vercel Serverless Functions —— 为轻量级应用打造的“零运维”闭环Vercel 不是单纯的静态托管平台它的核心竞争力在于Serverless Functions无服务器函数。这是目前部署 Gemini 3 应用最省心、最符合现代前端开发直觉的方案特别适合个人项目、MVP 验证、内部工具等场景。它的逻辑是把你的后端 API 逻辑直接写成一个独立的、按需执行的函数和前端代码放在同一个 Git 仓库里Vercel 自动为你构建、部署、扩缩容、管理 HTTPS 和 CORS。2.1 为什么 Serverless Functions 是 Gemini 应用的天选之子我们来拆解一个典型 Gemini Web 应用的最小必要架构[用户浏览器] ↓ (HTTPS, GET/POST) [Frontend Static Files] ← 托管在 Vercel CDN 上全球加速毫秒级响应 ↓ (同域 fetch, 如 /api/chat) [Serverless Function] ← 这是一个独立的、短暂存活的 Node.js 进程只在收到请求时启动 ↓ (HTTPS, POST to Googles API) [Google Gemini 3.0 Pro API] ← 由你的函数代码发起调用 ↑ (JSON response) [Serverless Function] ← 处理响应添加日志、错误包装返回给前端 ↑ (JSON response) [用户浏览器] ← 渲染结果这个架构的精妙之处在于前端和后端 API 在同一个域名下如https://my-gemini-app.vercel.app天然规避了跨域CORS问题Vercel 自动为每个函数分配独立的、带 HTTPS 的 URL你无需管理任何服务器、容器或进程Vercel 的基础设施负责一切。这完美契合了 Gemini 应用“前端轻、后端重、调用频次不可预测”的特点。2.2 从零开始一个可运行的 Vercel Gemini 应用假设你已经有一个简单的 React 前端现在需要添加一个/api/chat接口。步骤如下第一步创建 API Route在你的 Next.js 项目推荐使用 App Router中创建文件app/api/chat/route.ts// app/api/chat/route.ts import { GoogleGenerativeAI } from google/generative-ai; import { NextRequest, NextResponse } from next/server; // 1. 从环境变量读取密钥 —— 这是唯一安全的地方 const apiKey process.env.GOOGLE_API_KEY; if (!apiKey) { throw new Error(Missing GOOGLE_API_KEY environment variable); } const genAI new GoogleGenerativeAI(apiKey); // 2. 创建模型实例注意这里必须在函数内创建不能全局 // 因为 Serverless 函数是无状态的每次调用都是全新进程 export async function POST(req: NextRequest) { try { // 3. 解析前端发来的 JSON 数据 const { message, history [] } await req.json(); // 4. 初始化模型指定版本 const model genAI.getGenerativeModel({ model: gemini-3.0-pro, // 可选配置温度、最大输出长度等 generationConfig: { temperature: 0.7, maxOutputTokens: 2048, }, }); // 5. 构造聊天历史Gemini 的 chat API 需要完整的对话历史 const chat model.startChat({ history: history.map((h: any) ({ role: h.role, // user or model parts: [{ text: h.content }], })), }); // 6. 发送新消息并获取响应 const result await chat.sendMessage(message); const response await result.response; // 7. 返回结构化 JSON 给前端 return NextResponse.json({ success: true, data: { content: response.text(), // 将本次响应也加入历史供下次调用 newHistory: [ ...history, { role: user, content: message }, { role: model, content: response.text() }, ], }, }); } catch (error: any) { console.error(Gemini API Error:, error); // 8. 关键永远不要把原始错误堆栈暴露给前端 return NextResponse.json( { success: false, error: AI service is temporarily unavailable, }, { status: 500 } ); } }第二步前端调用安全且简洁在你的app/page.tsx中调用方式极其简单// app/page.tsx use client; import { useState } from react; export default function Home() { const [input, setInput] useState(); const [messages, setMessages] useState{ role: string; content: string }[]([]); const [loading, setLoading] useState(false); const handleSubmit async (e: React.FormEvent) { e.preventDefault(); if (!input.trim() || loading) return; // 1. 添加用户消息到本地状态 const newUserMessage { role: user, content: input }; setMessages((prev) [...prev, newUserMessage]); setInput(); setLoading(true); try { // 2. 向同域的 /api/chat 发起请求无跨域问题 const res await fetch(/api/chat, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ message: input, history: messages }), }); const data await res.json(); if (data.success data.data?.content) { // 3. 添加 AI 的回复到本地状态 const newAIMessage { role: model, content: data.data.content }; setMessages((prev) [...prev, newAIMessage]); } } catch (err) { console.error(Fetch error:, err); alert(Failed to get response from AI.); } finally { setLoading(false); } }; return ( div classNamep-4 max-w-4xl mx-auto h1 classNametext-2xl font-bold mb-4My Gemini 3.0 Pro Assistant/h1 form onSubmit{handleSubmit} classNamemb-4 input typetext value{input} onChange{(e) setInput(e.target.value)} placeholderAsk anything... classNamew-full p-2 border rounded mr-2 disabled{loading} / button typesubmit disabled{loading} classNamep-2 bg-blue-500 text-white rounded disabled:opacity-50 {loading ? Thinking... : Send} /button /form div classNamespace-y-2 {messages.map((msg, i) ( div key{i} className{p-3 rounded-lg ${ msg.role user ? bg-gray-100 text-right : bg-blue-100 }} strong{msg.role user ? You: : Gemini:}/strong {msg.content} /div ))} /div /div ); }第三步Vercel 部署与密钥配置将你的 Next.js 项目推送到 GitHub/GitLab。登录 Vercel导入该项目。在 Vercel 项目的 Settings → Environment Variables 页面添加GOOGLE_API_KEY: 你的 Google Cloud API Key务必确保该 Key 已在 Google Cloud Console 中启用generativelanguage.googleapis.com服务并设置了合理的配额。可选NEXT_PUBLIC_APP_NAME: 用于前端显示的 App 名称。点击 Deploy。Vercel 会自动检测这是一个 Next.js 项目运行npm run build并将app/api/chat/route.ts编译为一个 Serverless Function。第四步实测与关键参数解析部署完成后访问https://your-app-name.vercel.app。整个过程通常在 2 分钟内完成。你可以用 Chrome DevTools 的 Network 面板观察/api/chat请求它会显示一个200 OK响应耗时通常在 1.5~3 秒之间这取决于 Gemini 3.0 Pro 的响应速度。为什么这个方案如此稳健我们来深挖几个关键点密钥安全process.env.GOOGLE_API_KEY在 Vercel 的构建和运行时环境中是安全的。它永远不会出现在前端代码中也不会被git push到你的代码仓库前提是你的.env.local文件已加入.gitignore。Vercel 的环境变量系统是经过严格审计的比你自己在服务器上export环境变量要可靠得多。CORS 自动解决因为前端和 API 在同一个域名下浏览器认为这是“同源请求”完全不需要设置Access-Control-Allow-Origin头。Vercel 的底层网络架构保证了这一点。冷启动与性能Serverless 函数有“冷启动”现象即第一次请求时Vercel 需要启动一个新的容器实例这会增加几百毫秒的延迟。但对于 Gemini 这种本身响应就较慢1~3秒的服务来说这几百毫秒的额外开销几乎可以忽略不计。而且Vercel 会根据流量自动保持一定数量的“热实例”后续请求几乎是即时的。成本与配额Vercel 的 Hobby 计划免费每月提供 100GB 的带宽和 10s 的 Serverless Function 执行时间。对于一个个人项目这意味着每天可以处理数百次 Gemini 调用完全够用。真正的成本瓶颈在 Google Cloud 的 API 调用费用上你需要自己监控console.cloud.google.com中的账单。注意Gemini 3.0 Pro 的 API 调用是按 token 计费的。一个典型的问答输入 100 字符 输出 300 字符大约消耗 100~200 tokens。Google 的定价是 $0.00000025 / token输入和 $0.0000005 / token输出。所以一次问答的成本大约是 $0.0001 ~ $0.0002。看似微不足道但如果你的应用被大量访问这笔费用会指数级增长。务必在 Google Cloud Console 中为你的 API Key 设置每日配额Quota例如限制为 1000 次调用/天以防意外。3. 方法二Railway —— 为需要长连接与状态管理的复杂应用提供“专属云服务器”当你的 Gemini 应用不再是一个简单的问答框而是演变成了一个需要实时流式响应streaming、持久化聊天历史、集成数据库、或运行长时间任务的复杂系统时Vercel 的 Serverless Functions 就力不从心了。它的函数有 30 秒的执行时间上限Pro 计划可延长至 15 分钟且每次调用都是无状态的无法在内存中保存用户会话。这时你需要一个真正的、有状态的、可自定义的运行环境。Railway 就是为此而生的。3.1 Railway 的核心价值像管理 Docker 容器一样管理你的应用Railway 的定位非常清晰它是一个现代化的 PaaS平台即服务目标是让开发者像使用docker run一样轻松地部署和管理任何容器化应用。它不像 Vercel 那样有特定的框架偏好也不像传统云服务器那样需要你手动配置 Nginx、PM2、防火墙。你只需要告诉 Railway“这是我用Dockerfile构建出来的镜像这是我的环境变量这是我要开放的端口”它就会为你创建一个专属的、可伸缩的、带公网 IP 的容器实例。这对于 Gemini 应用意味着什么意味着你可以实现真正的流式响应Streaming用户在提问后AI 的回答可以像打字一样逐字出现而不是等待整个回答生成完毕才一次性返回。这极大地提升了用户体验尤其是在处理长文本时。集成 PostgreSQL/MongoDB将每一次对话的历史、用户偏好、甚至 AI 的思考过程如果启用了thinkingConfig都存入数据库为后续的分析、个性化推荐打下基础。运行后台任务比如定时清理过期的会话数据、异步处理用户上传的文件PDF、图片并将其内容喂给 Gemini 进行分析。3.2 从零开始部署一个支持流式响应的 FastAPI Gemini 应用我们将构建一个比 Vercel 方案更强大的后端。它使用 FastAPIPython因为它原生支持异步和流式响应比 Node.js 的 Express 更适合处理 AI 这种 I/O 密集型任务。第一步编写 FastAPI 后端main.py# main.py from fastapi import FastAPI, HTTPException, Request, BackgroundTasks from fastapi.responses import StreamingResponse, JSONResponse from pydantic import BaseModel from typing import List, Dict, Any, AsyncGenerator import google.generativeai as genai import os import asyncio import logging # 配置日志 logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) # 1. 初始化 Gemini 客户端 genai.configure(api_keyos.getenv(GOOGLE_API_KEY)) app FastAPI(titleGemini 3.0 Pro Streaming API) class ChatRequest(BaseModel): message: str history: List[Dict[str, str]] [] stream: bool True # 默认开启流式 app.post(/api/chat) async def chat_endpoint(request: Request, chat_req: ChatRequest): 主要的聊天接口支持流式和非流式两种模式 try: # 2. 获取模型 model genai.GenerativeModel(gemini-3.0-pro) # 3. 构建聊天历史 chat_history [] for h in chat_req.history: chat_history.append({role: h[role], parts: [{text: h[content]}]}) # 4. 核心逻辑根据 stream 参数选择不同路径 if chat_req.stream: # 流式响应返回一个异步生成器 async def stream_generator() - AsyncGenerator[str, None]: try: # 使用 start_chat 并设置 streamTrue chat model.start_chat(historychat_history) response chat.send_message(chat_req.message, streamTrue) # 逐块 yield 响应 for chunk in response: if chunk.text: # 按照 SSE (Server-Sent Events) 格式发送 yield fdata: {chunk.text}\n\n await asyncio.sleep(0.01) # 微小延迟模拟打字效果 # 发送结束标志 yield data: [DONE]\n\n except Exception as e: logger.error(fStream error: {e}) yield fdata: ERROR: {str(e)}\n\n return StreamingResponse( stream_generator(), media_typetext/event-stream, headers{Cache-Control: no-cache, Connection: keep-alive} ) else: # 非流式等待完整响应 chat model.start_chat(historychat_history) response chat.send_message(chat_req.message) return JSONResponse({ success: True, data: {content: response.text()} }) except Exception as e: logger.error(fChat endpoint error: {e}) raise HTTPException(status_code500, detailInternal server error) # 一个健康检查端点Railway 会用它来判断服务是否存活 app.get(/health) def health_check(): return {status: ok, message: Gemini API is running}第二步编写 Dockerfile# Dockerfile # 使用官方 Python 镜像 FROM python:3.11-slim # 设置工作目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口Railway 会自动映射 EXPOSE 8000 # 启动命令 CMD [uvicorn, main:app, --host, 0.0.0.0:8000, --port, 8000, --reload]第三步requirements.txtfastapi0.111.0 google-generativeai0.8.1 uvicorn0.29.0 pydantic2.7.1第四步Railway 部署流程将你的代码main.py,Dockerfile,requirements.txt推送到 GitHub。登录 Railway点击 “New Project”。选择 “GitHub” 作为源授权并选择你的仓库。Railway 会自动检测到Dockerfile进入配置页面Service Name:gemini-backendEnvironment Variables: 点击 “Add Variable”添加GOOGLE_API_KEY值为你的真实密钥。Ports: 确保8000端口被正确识别Railway 会自动扫描EXPOSE指令。点击 “Deploy Now”。Railway 会自动执行docker build然后docker run并在几分钟内给你一个公网 URL例如https://gemini-backend.up.railway.app。第五步前端适配支持流式前端需要修改handleSubmit函数以处理流式响应// 修改 handleSubmit 函数中的 fetch 部分 const res await fetch(https://gemini-backend.up.railway.app/api/chat, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ message: input, history: messages, stream: true }), }); // 使用 ReadableStream API 处理流式响应 if (res.body) { const reader res.body.getReader(); let fullText ; while (true) { const { done, value } await reader.read(); if (done) break; // 将 Uint8Array 转换为字符串 const chunk new TextDecoder().decode(value); // 解析 SSE 格式 const lines chunk.split(\n); for (const line of lines) { if (line.startsWith(data: )) { const text line.slice(6).trim(); if (text text ! [DONE]) { fullText text; // 实时更新 UI setMessages((prev) [ ...prev.slice(0, -1), { role: model, content: fullText }, ]); } } } } }第六步Railway 的高级配置与避坑指南环境变量安全Railway 的环境变量面板是加密存储的比在服务器上echo KEYxxx .bashrc安全一万倍。你还可以为不同的环境Staging/Production设置不同的变量。服务健康与自动重启Railway 会定期向你的/health端点发送请求。如果连续几次失败它会自动重启你的容器。这就是为什么我们写了那个简单的健康检查端点。资源限制与成本Railway 的 Starter 计划免费提供 512MB 内存和 1 个 vCPU对于一个 Gemini 后端绰绰有余。它的计费是按小时计算的只要你把服务停掉就不会产生费用。这比租一台 24/7 运行的云服务器要经济得多。最大的坑忘记设置--host 0.0.0.0。Uvicorn 默认只监听127.0.0.1这意味着它只接受来自容器内部的请求外部Railway 的网关无法访问。--host 0.0.0.0是强制它监听所有网络接口的必需参数。我在第一次部署时就栽在这个坑里花了半小时排查最后发现docker logs里全是INFO: Uvicorn running on http://127.0.0.1:8000而不是http://0.0.0.0:8000。经验分享Railway 的日志系统是我用过的最友好的。你可以在 Dashboard 里实时看到docker logs -f的输出所有的print()和logger.info()都会立刻显示出来。当你遇到问题时第一时间去看 Logs90% 的问题都能在那里找到线索。比如如果看到ModuleNotFoundError: No module named google那一定是requirements.txt里漏写了google-generativeai。4. 方法三宝塔面板 —— 为追求完全自主可控与深度定制的企业级部署方案Vercel 和 Railway 都是优秀的托管平台但它们都有一个共同的前提你信任并依赖第三方服务商的基础设施和策略。Vercel 可能某天调整免费额度Railway 可能改变其定价模型。如果你的业务对稳定性、数据主权、网络策略有极致要求比如你是一家金融机构需要将所有数据包括用户聊天记录100% 存储在自己的物理服务器上或者你需要在内网部署一个仅供员工使用的 Gemini 助手那么回归到最传统的、也是最可控的方式——在自有服务器上用宝塔面板进行部署就成了唯一的选择。4.1 宝塔面板的价值将 Linux 服务器变成一个图形化的“应用商店”宝塔面板BT Panel是一个国产的、广受欢迎的 Linux 服务器管理面板。它的核心价值在于把复杂的 Linux 系统管理Nginx、MySQL、Python 环境、防火墙封装成一个直观的 Web 界面。对于一个不熟悉vim /etc/nginx/conf.d/myapp.conf或systemctl restart nginx的开发者来说宝塔是降低运维门槛的神器。它让你可以像在手机上安装 App 一样一键安装 Nginx、PHP、MySQL、Pure-FTPd甚至可以直接在面板里创建网站、绑定域名、申请 SSL 证书。对于 Gemini 应用宝塔的意义在于它提供了一个稳定、可预测、完全属于你自己的运行沙盒。你可以精确控制每一个环节用哪个版本的 Python用哪个版本的 NginxSSL 证书是用 Lets Encrypt 还是自签名防火墙只开放 80/443 端口其他端口一律关闭。这种掌控感是任何 SaaS 平台都无法提供的。4.2 从零开始在宝塔上部署一个 Nginx Gunicorn Flask 的 Gemini 应用我们将采用经典的“反向代理”架构用户请求https://my-gemini.com→ 宝塔的 Nginx 接收 → Nginx 将请求转发给本地运行的 Gunicorn 服务监听127.0.0.1:8000→ Gunicorn 运行你的 Flask 应用 → Flask 调用 Gemini API。第一步服务器准备与宝塔安装购买一台 Linux 云服务器推荐 Ubuntu 22.04 LTS 或 CentOS 7。通过 SSH 登录服务器执行宝塔官方一键安装脚本# Ubuntu/Debian wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh sudo bash install.sh # CentOS yum install -y wget wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh安装完成后脚本会输出宝塔的登录地址、用户名和密码。用浏览器访问http://your-server-ip:8888用初始账号登录。第二步在宝塔中创建网站与配置环境在宝塔面板左侧菜单点击“网站” → “添加站点”。域名填写你的域名如my-gemini.com根目录选择/www/wwwroot/my-geminiPHP 版本选择“纯静态”数据库选择“不创建”。点击提交。宝塔会自动为你创建 Nginx 配置文件/www/server/panel/vhost/nginx/my-gemini.conf。点击刚创建的网站右侧的“设置”按钮进入网站设置页。在“网站目录”选项卡中取消勾选“防跨站攻击open_basedir”因为我们的 Python 应用需要访问系统路径。在“SSL”选项卡中点击“申请”选择 Lets Encrypt填入邮箱一键申请并部署 HTTPS 证书。这是强制要求因为现代浏览器会阻止不安全的 API 调用。第三步上传与配置 Python 应用在宝塔的“文件”管理器中进入/www/wwwroot/my-gemini目录。点击“上传”将你的 Flask 应用代码app.py,requirements.txt上传至此。在宝塔面板左侧点击“软件商店”搜索并安装“Python 项目管理器”。安装完成后在左侧菜单找到“Python 项目管理器”点击“添加项目”。项目名称gemini-flask项目路径/www/wwwroot/my-geminiPython 版本选择3.11启动文件app.py启动命令gunicorn -w 2 -b 127.0.0.1:8000 --timeout 300 app:app环境变量点击“添加环境变量”添加GOOGLE_API_KEYyour_actual_api_key_here点击提交。宝塔会自动为你创建一个 systemd 服务并启动 Gunicorn。第四步配置 Nginx 反向代理这是最关键的一步决定了用户能否正常访问你的应用。在网站设置页点击“反向代理”选项卡。点击“添加反向代理”。代理名称gemini-api目标URLhttp://127.0.0.1:8000发送域名$host点击提交。宝塔会自动修改 Nginx 配置在my-gemini.conf文件中添加一段location /api/的配置。第五步修改 Flask 应用app.py以适配反向代理# app.py from flask import Flask, request, jsonify import google.generativeai as genai import os # 1. 从环境变量读取密钥 genai.configure(api_keyos.getenv(GOOGLE_API_KEY)) app Flask(__name__) app.route(/api/chat, methods[POST]) def chat(): try: data request.get_json() message data.get(message, ) history data.get(history, []) # 2. 创建模型 model genai.GenerativeModel(gemini-3.0-pro) chat model.start_chat(historyhistory) # 3. 发送消息 response chat.send_message(message) return jsonify({ success: True, data: {content: response.text()} }) except Exception as e: return jsonify({success: False, error: str(e)}), 500 # 4. 添加一个简单的首页用于测试 app.route(/) def index(): return h1Welcome to My Gemini 3.0 Pro Assistant!/h1 pThis is the backend API. Visit a href/static/index.html/static/index.html/a for the frontend./p if __name__ __main__: app.run(host127.0.0.1, port8000, debugFalse) # debugFalse 是生产环境必须的第六步部署前端静态文件在/www/wwwroot/my-gemini目录下创建一个static文件夹。将你构建好的前端dist/目录下的所有文件index.html,main.js,style.css等上传到/www/wwwroot/my-gemini/static/。修改index.html中的 API 地址从http://localhost:8000/api/chat改为/api/chat相对路径由 Nginx 代理。第七步防火墙与最终测试在宝塔面板左侧点击“安全”确保80和443端口是放行的8000端口必须是关闭的因为它只应该被 Nginx 本地访问。在终端中执行sudo ufw status确认防火墙规则正确。访问https://my-gemini.com/static/index.html测试你的应用。第八步宝塔部署的终极经验与避坑清单**Gunicorn