版本: v0.1.0
日期: 2026-05-09
适用: 生产环境 / 开发环境部署
| 组件 | 最低版本 | 说明 |
|---|---|---|
| Python | 3.10+ | 后端运行时 |
| Node.js | 18+ | 前端构建 |
| Docker | 24+ | 容器化部署(可选) |
| Docker Compose | 2.0+ | 服务编排(可选) |
| Git | 2.0+ | 版本控制 |
| 服务 | 用途 | 必需? |
|---|---|---|
| DeepSeek API | LLM 大模型推理 | 是(智能体功能) |
| 东方财富妙想 API | 金融数据获取 | 是(行情/财务/资讯) |
git clone <your-repo-url>
cd 智能股票分析器
cp .env.example .env
# 编辑 .env,填入 LLM_API_KEY、MX_APIKEY
# 本地开发请使用 BACKEND_PORT=8000(与 vite proxy 一致)
# 创建虚拟环境(推荐)
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# 安装依赖
pip install -r backend/requirements.txt
# 启动后端服务(开发模式,热重载)
cd backend
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
# 或从项目根目录启动
python -m uvicorn backend.app.main:app --host 0.0.0.0 --port 8000 --reload
API 文档地址:http://localhost:8000/docs
cd frontend
npm install
npm run dev
前端访问地址:http://localhost:5173
开发模式下 Vite 自动将
/api代理到http://localhost:8000,无需额外配置。
# 健康检查(端口与 BACKEND_PORT 一致,默认开发为 8000)
curl http://localhost:8000/api/v1/system/health
# 前端构建验证
cd frontend && npm run build
端口提示:
backend/app/config.py中开发模式默认后端端口为 8000,与frontend/vite.config.js里/api→http://localhost:8000一致。若在.env中修改BACKEND_PORT,请同步修改 Viteproxy.target,否则前端无法代理到后端。
智能股票分析器/
├── backend/ # 后端 FastAPI
│ └── Dockerfile
├── frontend/ # 前端 Vue3
│ ├── Dockerfile
│ └── nginx.conf
├── docker-compose.yml # 服务编排
├── .dockerignore # 构建忽略
└── .env # 环境变量
# 确保 .env 已配置正确
docker compose up -d
# 构建后端镜像
docker build -t stock-analyzer-backend -f backend/Dockerfile .
# 构建前端镜像
docker build -t stock-analyzer-frontend -f frontend/Dockerfile .
# 运行后端
docker run -d -p 8000:8000 \
-v stock_data:/app/data \
--name stock-backend \
stock-analyzer-backend
# 运行前端
docker run -d -p 8080:80 \
--name stock-frontend \
stock-analyzer-frontend
| 服务 | 端口 | 访问地址 |
|---|---|---|
| 后端 API | 8000 | http://localhost:8000/docs |
| 前端界面 | 8080 | http://localhost:8080 |
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f backend
docker compose logs -f frontend
# 重启服务
docker compose restart
# 停止并清理
docker compose down
# 重新构建并启动
docker compose up -d --build
SQLite 数据库通过 Docker Volume 持久化:
stock_analyzer_data/app/data数据库文件: /app/data/stock_analyzer.db
# 查看 Volume
docker volume ls | grep stock
# 备份数据库
docker compose exec backend python -c "
import shutil
shutil.copy('/app/data/stock_analyzer.db', '/tmp/backup.db')
"
docker compose cp backend:/tmp/backup.db ./backup.db
将前后端打包为一个独立 .exe 文件,无需安装 Python/Node.js 即可运行。
| 组件 | 用途 | 仅打包时需要? |
|---|---|---|
| Python 3.10+ | PyInstaller 打包 | 是 |
| Node.js 18+ | 前端构建 | 是 |
| PyInstaller | Python → exe | 是 |
运行时仅需 Windows 系统,无需任何依赖。
# 1. 安装打包依赖
pip install pyinstaller
# 2. 执行打包脚本(从项目根目录)
python scripts/build_exe.py
# 3. 或设置环境变量强制重建前端
# 编辑 .env,设置 BUILD_EXE=1,然后执行上述命令
dist_exe/
├── stock_analyzer.exe # 主程序(前后端合一)
├── .env.example # 配置模板
└── data/ # 数据目录(运行时自动使用)
# 1. 将 dist_exe/ 目录拷贝到目标 Windows 机器
# 2. 将 .env.example 重命名为 .env
# 3. 编辑 .env,填入 API Key(LLM_API_KEY、MX_APIKEY)
# 4. 双击 stock_analyzer.exe 启动
# 5. 浏览器访问 http://127.0.0.1:<BACKEND_PORT>/dashboard(默认与 `app.config` 一致:exe 常为 5174,以 exe 旁 `.env` 为准)
NO_BROWSER=1 可禁用自动打开)可通过环境变量 BUILD_EXE 控制打包行为:
# Windows PowerShell
$env:BUILD_EXE="1"
python scripts/build_exe.py
# 或在 .env 中设置
# BUILD_EXE=1
编辑 .env:
BACKEND_HOST=0.0.0.0
BACKEND_PORT=9000
重启 exe 即可。
| 变量名 | 默认值 | 说明 |
|---|---|---|
LLM_MODEL_ID |
deepseek-chat |
LLM 模型名称 |
LLM_API_KEY |
— | 必需 LLM API 密钥 |
LLM_BASE_URL |
https://api.deepseek.com |
LLM 服务地址 |
LLM_TIMEOUT |
60 |
LLM HTTP 超时(秒);后端会与更长下限合并,避免多轮 Agent 过早断开 |
BUFFETT_MAX_REFLECTIONS |
0 |
巴菲特评估初稿后的反思轮数(可选,见 .env.example) |
MX_APIKEY |
— | 必需 东方财富妙想 API 密钥 |
MX_API_URL |
https://mkapi2.dfcfs.com/finskillshub |
妙想 API 地址 |
MX_CACHE_TTL_SECONDS |
600 |
妙想查询进程内缓存 TTL(秒) |
MX_REPLAY_FIXTURES |
关闭 | 为 true 时优先回放 MX_FIXTURE_DIR 下 fixture,不调妙想 HTTP |
MX_FIXTURE_DIR |
backend/fixtures/mx_raw |
回放目录 |
BACKEND_HOST |
0.0.0.0 |
后端监听地址 |
BACKEND_PORT |
开发 8000 / exe 默认 5174 |
未设置环境变量时由 config.py 按是否冻结自动选择 |
FRONTEND_PORT |
5173 |
前端开发端口 |
FRONTEND_DIR |
— | 可选:显式指定已构建的前端 dist 目录 |
DATA_DIR |
— | 可选:数据目录;默认 exe 旁或项目根下 data |
DATABASE_URL |
sqlite:///./data/stock_analyzer.db |
数据库连接 |
BUILD_EXE |
— | 打包脚本使用:1/true/rebuild 时强制重建前端 |
REDIS_* |
见 .env.example |
预留,当前版本未使用(requirements.txt 中 redis 已注释) |
JWT_SECRET_KEY |
dev-secret-key |
预留,当前版本无登录鉴权,可不配置 |
JWT_EXPIRE_MINUTES |
1440 |
预留,接入用户认证后生效 |
接口路径补充(与 Swagger 一致):
POST /api/v1/sentiment/analyze/stream(兼容:POST /api/v1/agent/sentiment/stream)POST /api/v1/data-analysis/analyze/stream(兼容:POST /api/v1/agent/data-analysis/stream)POST /api/v1/system/open-external-url 在本机默认浏览器打开允许的 http(s) 链接当前版本 不要求 JWT;对外暴露 API 时建议:
.env 中的 LLM_API_KEY、MX_APIKEY 提交到版本库用户认证(JWT)实现后,可用以下命令预生成密钥:
python -c "import secrets; print(secrets.token_urlsafe(32))"
# 写入 .env: JWT_SECRET_KEY=<生成的密钥>
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
proxy_pass http://frontend:80;
}
# 后端 API
location /api {
proxy_pass http://backend:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300s;
}
}
curl http://localhost:8000/api/v1/system/health
正常响应:
{
"code": 0,
"message": "success",
"data": {
"status": "ok",
"version": "0.1.0",
"agent_ready": true,
"skills_ready": true
}
}
agent_ready: false → LLM_API_KEY 未配置skills_ready: false → MX_APIKEY 未配置Docker Compose 自动监控后端 /api/v1/system/health 端点,30秒间隔检查。
# 查看健康状态
docker compose ps
# 输出中 (healthy) 表示通过
检查 .env 中的 MX_APIKEY 是否有效,运行健康检查确认 skills_ready: true。
项目已配置 .dockerignore 排除不必要的文件。首次构建需下载基础镜像,后续使用缓存。
修改 DATABASE_URL:
DATABASE_URL=postgresql://user:password@host:5432/stock_analyzer
并在 requirements.txt 中替换 aiosqlite 为 asyncpg。
后端无状态设计支持多副本(SQLite 需切换为 PostgreSQL/MySQL):
# docker-compose.yml
services:
backend:
deploy:
replicas: 3
frontend:
deploy:
replicas: 2
注意:多副本时需将数据存储切换为数据库服务器(PostgreSQL)并添加 Redis 缓存。
浏览器(8080)
│
▼
Nginx(前端容器:80)
│ / → dist/ (SPA静态文件)
│ /api/* → proxy_pass
│
▼
FastAPI(后端容器:8000)
│
├── SQLite (/app/data)
├── HelloAgents (智能体推理)
└── 东方财富妙想API (外部金融数据)
| 项目 | 开发 | 生产 |
|---|---|---|
| 后端启动 | uvicorn --reload |
uvicorn (无热重载) |
| 前端启动 | vite dev (5173) |
Nginx (80) |
| API 代理 | Vite proxy | Nginx reverse proxy |
| 数据库 | 本地文件 | Docker Volume |
| CORS | 允许所有来源 | 仅允许前端域名 |