docs: 添加生产环境API连接配置指南
- 创建 frontend/.env.production.example 示例文件 - 新增 API_CONNECTION_FIX.md 详细配置文档 - 说明 CORS 配置和生产模式 API 连接方法 - 提供故障排查和常见问题解决方案 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,296 @@
|
||||
# API 连接配置指南
|
||||
|
||||
**更新时间**: 2025-12-25
|
||||
**状态**: ✅ 已修复
|
||||
|
||||
---
|
||||
|
||||
## 问题描述
|
||||
|
||||
生产构建模式下,前端无法访问后端API:
|
||||
- "今日推荐" 加载失败
|
||||
- "获取策略失败: Failed to fetch"
|
||||
- 浏览器控制台显示 CORS 错误
|
||||
|
||||
## 根本原因
|
||||
|
||||
### 1. 代理配置失效
|
||||
|
||||
使用 `serve` 静态服务器后,Vite dev server 的代理配置不生效:
|
||||
|
||||
```javascript
|
||||
// vite.config.js 中的代理配置(仅在开发模式有效)
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:8028', // ❌ 生产模式下不工作
|
||||
changeOrigin: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**原因**: `serve` 是纯静态文件服务器,不支持反向代理功能。
|
||||
|
||||
### 2. CORS 配置不完整
|
||||
|
||||
后端默认 CORS 配置:
|
||||
```env
|
||||
# backend/.env (默认值)
|
||||
CORS_ORIGINS=http://localhost:8080,http://localhost:5173
|
||||
```
|
||||
|
||||
**问题**: 不包含生产环境前端 URL (`http://192.168.1.83:8448`),浏览器阻止跨域请求。
|
||||
|
||||
---
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 步骤 1: 配置前端生产环境变量
|
||||
|
||||
创建 `frontend/.env.production` 文件:
|
||||
|
||||
```bash
|
||||
cp frontend/.env.production.example frontend/.env.production
|
||||
```
|
||||
|
||||
编辑内容(根据实际IP地址修改):
|
||||
|
||||
```env
|
||||
# 生产环境配置 - 前端直接连接后端API
|
||||
# 使用本机IP地址,支持局域网访问
|
||||
|
||||
# 后端API地址(使用局域网IP,支持远程访问)
|
||||
VITE_API_URL=http://192.168.1.83:8028/api
|
||||
|
||||
# WebSocket地址
|
||||
VITE_WS_URL=ws://192.168.1.83:8028/ws/recommendations
|
||||
```
|
||||
|
||||
**重要**:
|
||||
- 将 `192.168.1.83` 替换为您的实际局域网 IP
|
||||
- 如果仅本地访问,可以使用 `http://localhost:8028/api`
|
||||
|
||||
### 步骤 2: 配置后端 CORS
|
||||
|
||||
编辑 `backend/.env`,添加或更新 CORS 配置:
|
||||
|
||||
```env
|
||||
# CORS配置 - 允许前端访问
|
||||
CORS_ORIGINS=http://localhost:8448,http://192.168.1.83:8448,http://localhost:5173,http://localhost:8080
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- `http://localhost:8448`: 本地前端访问
|
||||
- `http://192.168.1.83:8448`: 局域网前端访问
|
||||
- `http://localhost:5173`: Vite 开发服务器
|
||||
- `http://localhost:8080`: 其他可能的开发端口
|
||||
|
||||
### 步骤 3: 重新构建和部署
|
||||
|
||||
```bash
|
||||
# 1. 重新构建前端(使用 .env.production 配置)
|
||||
cd frontend
|
||||
npm run build
|
||||
|
||||
# 2. 重启服务
|
||||
pm2 restart ljwx-stock-frontend ljwx-stock-backend
|
||||
|
||||
# 3. 保存 PM2 配置
|
||||
pm2 save
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 验证步骤
|
||||
|
||||
### 1. 检查服务状态
|
||||
|
||||
```bash
|
||||
pm2 list
|
||||
# 确保两个服务都是 online 状态
|
||||
```
|
||||
|
||||
### 2. 测试后端 API
|
||||
|
||||
```bash
|
||||
# 健康检查
|
||||
curl http://192.168.1.83:8028/health
|
||||
# 预期输出: {"status":"healthy"}
|
||||
|
||||
# 策略列表 API
|
||||
curl http://192.168.1.83:8028/api/strategies/list
|
||||
# 预期输出: JSON 策略列表
|
||||
|
||||
# 推荐 API
|
||||
curl http://192.168.1.83:8028/api/recommendations?limit=3
|
||||
# 预期输出: JSON 推荐列表
|
||||
```
|
||||
|
||||
### 3. 浏览器测试
|
||||
|
||||
打开浏览器访问:
|
||||
- 本地: http://localhost:8448
|
||||
- 远程: http://192.168.1.83:8448
|
||||
|
||||
打开浏览器开发者工具(F12),检查:
|
||||
- **Network** 标签: API 请求应该返回 200 状态码
|
||||
- **Console** 标签: 不应该有 CORS 错误
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: 页面显示 "获取策略失败: Failed to fetch"
|
||||
|
||||
**原因**: 前端无法连接到后端 API
|
||||
|
||||
**解决步骤**:
|
||||
1. 确认后端服务运行正常: `pm2 list | grep backend`
|
||||
2. 测试后端 API: `curl http://192.168.1.83:8028/health`
|
||||
3. 检查防火墙是否允许 8028 端口访问
|
||||
4. 确认 `frontend/.env.production` 中的 URL 正确
|
||||
|
||||
### Q2: 浏览器控制台显示 CORS 错误
|
||||
|
||||
**错误示例**:
|
||||
```
|
||||
Access to fetch at 'http://192.168.1.83:8028/api/...' from origin 'http://192.168.1.83:8448'
|
||||
has been blocked by CORS policy
|
||||
```
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查 `backend/.env` 中的 `CORS_ORIGINS` 是否包含前端 URL
|
||||
2. 重启后端: `pm2 restart ljwx-stock-backend`
|
||||
3. 清除浏览器缓存并刷新
|
||||
|
||||
### Q3: 更改IP地址后API不工作
|
||||
|
||||
**场景**: 路由器重新分配了IP地址(例如从 192.168.1.83 变为 192.168.1.100)
|
||||
|
||||
**解决步骤**:
|
||||
1. 查看新IP地址: `ifconfig | grep "inet "`
|
||||
2. 更新 `frontend/.env.production`:
|
||||
```env
|
||||
VITE_API_URL=http://192.168.1.100:8028/api
|
||||
VITE_WS_URL=ws://192.168.1.100:8028/ws/recommendations
|
||||
```
|
||||
3. 更新 `backend/.env`:
|
||||
```env
|
||||
CORS_ORIGINS=http://localhost:8448,http://192.168.1.100:8448,http://localhost:5173,http://localhost:8080
|
||||
```
|
||||
4. 重新构建和重启:
|
||||
```bash
|
||||
cd frontend
|
||||
npm run build
|
||||
pm2 restart all
|
||||
```
|
||||
|
||||
### Q4: 推荐API响应很慢(10秒以上)
|
||||
|
||||
**原因**: AI 推荐需要:
|
||||
- 获取实时股票数据(TuShare/yfinance)
|
||||
- 计算技术指标
|
||||
- 运行 ML 模型
|
||||
- 调用本地 Ollama(lingjingwanxiang:32b)
|
||||
|
||||
**正常响应时间**:
|
||||
- 首次请求(冷启动): 10-30 秒
|
||||
- 缓存命中: 2-5 秒
|
||||
|
||||
**优化建议**:
|
||||
- 等待缓存预热(60秒 TTL)
|
||||
- 减少请求的股票数量: `?limit=5`
|
||||
|
||||
---
|
||||
|
||||
## 架构说明
|
||||
|
||||
### 开发模式 (Vite dev server)
|
||||
|
||||
```
|
||||
浏览器 → Vite (localhost:8448) → [内置代理] → Backend (localhost:8028)
|
||||
↑
|
||||
vite.config.js
|
||||
```
|
||||
|
||||
### 生产模式 (serve + 直连)
|
||||
|
||||
```
|
||||
浏览器 → Serve (192.168.1.83:8448) → Backend (192.168.1.83:8028)
|
||||
↑
|
||||
需要 CORS 配置
|
||||
```
|
||||
|
||||
**关键区别**:
|
||||
- 开发模式: Vite 代理所有 `/api` 请求,无跨域问题
|
||||
- 生产模式: 浏览器直接请求后端,需要正确的 CORS 配置
|
||||
|
||||
---
|
||||
|
||||
## 替代方案(可选)
|
||||
|
||||
### 方案 A: 使用 Caddy(推荐,自动反向代理)
|
||||
|
||||
安装 Caddy:
|
||||
```bash
|
||||
brew install caddy # macOS
|
||||
# 或
|
||||
sudo apt install caddy # Linux
|
||||
```
|
||||
|
||||
创建 `Caddyfile`:
|
||||
```caddyfile
|
||||
:8448 {
|
||||
root * frontend/dist
|
||||
encode gzip
|
||||
file_server
|
||||
|
||||
# API代理
|
||||
reverse_proxy /api/* localhost:8028
|
||||
reverse_proxy /ws/* localhost:8028
|
||||
|
||||
# SPA路由
|
||||
try_files {path} /index.html
|
||||
}
|
||||
```
|
||||
|
||||
启动:
|
||||
```bash
|
||||
caddy run
|
||||
```
|
||||
|
||||
**优点**:
|
||||
- 自动处理反向代理,无需配置 CORS
|
||||
- HTTPS 自动化
|
||||
- 性能优秀
|
||||
|
||||
### 方案 B: 使用 Nginx
|
||||
|
||||
参考 `FRONTEND_CRASH_ANALYSIS.md` 中的 Nginx 配置。
|
||||
|
||||
---
|
||||
|
||||
## 文件清单
|
||||
|
||||
生产环境需要配置的文件:
|
||||
|
||||
- ✅ `frontend/.env.production` - 前端生产环境变量(未纳入 Git)
|
||||
- ✅ `frontend/.env.production.example` - 示例配置(已纳入 Git)
|
||||
- ✅ `backend/.env` - 后端环境变量,添加 CORS_ORIGINS(未纳入 Git)
|
||||
- ✅ `ecosystem.config.js` - PM2 配置(已纳入 Git)
|
||||
|
||||
**安全提示**: `.env` 文件包含敏感信息,已通过 `.gitignore` 排除,不会提交到 Git。
|
||||
|
||||
---
|
||||
|
||||
## 相关文档
|
||||
|
||||
- `FRONTEND_CRASH_ANALYSIS.md` - 前端崩溃问题分析和生产构建方案
|
||||
- `CURRENT_STATUS.md` - 系统当前状态和配置说明
|
||||
- `.env.example` - 后端环境变量示例
|
||||
- `frontend/.env.production.example` - 前端生产环境变量示例
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025-12-25
|
||||
**维护者**: Claude Code
|
||||
**状态**: ✅ 问题已彻底解决
|
||||
@@ -0,0 +1,8 @@
|
||||
# 生产环境配置 - 前端直接连接后端API
|
||||
# 使用本机IP地址,支持局域网访问
|
||||
|
||||
# 后端API地址(使用局域网IP,支持远程访问)
|
||||
VITE_API_URL=http://192.168.1.83:8028/api
|
||||
|
||||
# WebSocket地址
|
||||
VITE_WS_URL=ws://192.168.1.83:8028/ws/recommendations
|
||||
Reference in New Issue
Block a user