一、 核心架构设计
要构建一个可扩展的 SaaS,不能简单地让前端直连 Ollama。你需要一个稳健的后端来处理用户鉴权、计费、排队和模型调度。
前端: Next.js 或 Vue3 (处理用户交互、流式输出展示)。
后端 API: FastAPI (Python 框架,原生支持异步,非常适合处理 AI 的长连接)。
模型引擎: Ollama (运行 Llama 3.2, DeepSeek-V3 等开源模型)。
任务队列: Celery + Redis (处理耗时较长的推理任务,防止 API 超时)。
数据库: PostgreSQL (存储用户信息、对话历史) + Stripe (支付订阅)。
API 层:处理业务逻辑、流式输出。
鉴权层:简单的 API Key 校验。
模型层:后端与本地 Ollama 通信。
📂 项目目录结构:
ollasaas-backend/├── app/│ ├── __init__.py│ ├── main.py # 程序主入口 (FastAPI)│ ├── auth.py # 简单的 API Key 鉴权逻辑│ ├── schemas.py # Pydantic 数据模型 (输入/输出定义)│ ├── services/│ │ ├── __init__.py│ │ └── ollama_sdk.py # 封装 Ollama 的调用│ └── database.py # 数据库连接 (预留给用户/计费)├── .env # 环境变量 (存储 API Keys, 数据库 URL)├── requirements.txt # 项目依赖└── Dockerfile # 容器化部署
三、核心代码实现
1. 依赖配置文件 (requirements.txt)
fastapiuvicornollamapython-dotenvpydantic
2. 环境变量 (.env)
OLLAMA_HOST=http://localhost:11434ADMIN_API_KEY=sk-ollasaas-123456DEFAULT_MODEL=llama3.2
3. Ollama 封装逻辑 (app/services/ollama_sdk.py)
这里利用 ollama-python 的异步客户端,确保 SaaS 能够处理高并发请求。
import osfrom ollama import AsyncClientfrom dotenv import load_dotenvload_dotenv()class OllamaService: def __init__(self): self.client = AsyncClient(host=os.getenv("OLLAMA_HOST")) self.model = os.getenv("DEFAULT_MODEL", "llama3.2") async def generate_stream(self, prompt: str): """流式生成响应""" async for chunk in await self.client.chat( model=self.model, messages=[{'role': 'user', 'content': prompt}], stream=True ): yield chunk['message']['content']ollama_service = OllamaService()
4. 简单鉴权层 (app/auth.py)
在 SaaS 中,你需要根据 API Key 来识别用户并扣除额度。
import osfrom fastapi import HTTPException, Securityfrom fastapi.security.api_key import APIKeyHeaderfrom dotenv import load_dotenvload_dotenv()API_KEY_NAME = "X-API-KEY"api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=True)async def verify_api_key(api_key: str = Security(api_key_header)): if api_key != os.getenv("ADMIN_API_KEY"): raise HTTPException(status_code=403, detail="无效的 API Key") return api_key
5. 主程序 (app/main.py)
这是整个 SaaS 的大脑,负责路由和流式响应。
from fastapi import FastAPI, Dependsfrom fastapi.responses import StreamingResponsefrom app.services.ollama_sdk import ollama_servicefrom app.auth import verify_api_keyfrom pydantic import BaseModelapp = FastAPI(title="OllaSaaS API")class ChatRequest(BaseModel): prompt: str@app.get("/")def read_root(): return {"status": "OllaSaaS is running"}@app.post("/v1/chat/stream")async def chat_stream( request: ChatRequest, token: str = Depends(verify_api_key)): """ SaaS 核心接口:接受 Prompt,验证 Key,返回 AI 流式数据 """ return StreamingResponse( ollama_service.generate_stream(request.prompt), media_type="text/event-stream" )if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
四、🚀 如何从 0 运行起来?
第一步:启动 Ollama
确保你的电脑或服务器已安装 Ollama,并运行:
第二步:运行后端
创建虚拟环境:python -v venv venv
激活并安装依赖:pip install -r requirements.txt
启动服务:python -m app.main
第三步:测试接口
你可以使用 curl 模拟前端请求:
curl -X POST http://localhost:8000/v1/chat/stream \ -H "X-API-KEY: sk-ollasaas-123456" \ -H "Content-Type: application/json" \ -d '{"prompt": "你好,请自我介绍"}'
🛠️ 下一步有能力可以去实现的,上线
这只是一个骨架,要真正上线赚钱,还需要补全这三个模块:
数据库集成 (PostgreSQL):
前端门户 (Dashboard):
反向代理 (Nginx):