Files
stock_cursor_v0/backend/UPGRADE_GUIDE.md
2026-06-15 01:26:39 +08:00

288 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 三大核心功能升级指南
本次升级新增了三个核心功能Redis 缓存层、统一鉴权机制、统一异常处理中间件。
## 1. 安装新依赖
```bash
cd backend
source .venv/bin/activate # 激活虚拟环境
pip install -r requirements.txt
```
新增的依赖包:
- `redis>=5.0.0` - Redis 客户端
- `python-jose[cryptography]>=3.3.0` - JWT Token 生成和验证
- `passlib[bcrypt]>=1.7.4` - 密码哈希
- `python-multipart>=0.0.9` - 表单数据解析
## 2. 安装和启动 RedisWSL
```bash
# 安装 Redis
sudo apt update
sudo apt install -y redis-server
# 启动 Redis
sudo service redis-server start
# 验证 Redis 是否运行
redis-cli ping
# 应返回 PONG
```
## 3. 配置环境变量
编辑 `backend/.env` 文件,添加以下配置:
```bash
# ============ Redis 缓存配置 ============
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD= # 可选,如果设置了密码则填写
# ============ 认证系统配置 ============
# JWT 密钥(务必修改为强随机字符串)
SECRET_KEY=your-secret-key-change-in-production
# Token 过期时间分钟默认7天
ACCESS_TOKEN_EXPIRE_MINUTES=10080
# API Key可选用于外部调用逗号分隔
API_KEYS=
# 默认管理员账号
DEFAULT_ADMIN_USERNAME=admin
DEFAULT_ADMIN_PASSWORD=admin123
```
### 生成安全的 SECRET_KEY
```bash
python -c "import secrets; print(secrets.token_urlsafe(32))"
```
将输出的字符串替换 `SECRET_KEY` 的值。
## 4. 初始化数据库(创建用户表和默认管理员)
```bash
cd backend
source .venv/bin/activate
python cli.py init
```
你会看到类似输出:
```
✓ 创建默认管理员: admin
init done
```
## 5. 启动服务
```bash
# 确保 PostgreSQL 和 Redis 都在运行
sudo service postgresql start
sudo service redis-server start
# 启动 FastAPI 服务
cd backend
source .venv/bin/activate
python main.py
```
启动日志应包含:
```
✓ Redis 已连接: localhost:6379
✓ 管理员账号已存在: admin
[startup] db + scheduler + auth ready
```
## 6. 测试功能
### 测试健康检查(查看 Redis 和鉴权状态)
```bash
curl http://localhost:8000/api/health
```
应返回:
```json
{
"ok": true,
"akshare": true,
"redis": true,
"auth": true
}
```
### 测试登录
```bash
curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'
```
应返回 Token
```json
{
"ok": true,
"access_token": "eyJ0eXAiOiJKV1QiLCJhb...",
"token_type": "bearer",
"username": "admin",
"is_admin": true
}
```
### 测试受保护的接口
```bash
# 使用上一步获取的 Token
curl -X GET http://localhost:8000/api/admin/status \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
```
### 测试 Redis 缓存
```bash
# 第一次请求(缓存未命中,较慢)
time curl http://localhost:8000/api/indices
# 第二次请求(缓存命中,应该快很多)
time curl http://localhost:8000/api/indices
```
## 7. 修改默认密码(重要!)
首次登录后,立即修改默认密码:
```bash
curl -X POST http://localhost:8000/api/auth/change-password \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"old_password":"admin123","new_password":"your-new-strong-password"}'
```
## 8. 常见问题
### Redis 连接失败
如果看到以下日志:
```
✗ Redis 连接失败,缓存已禁用: ...
```
**解决方法**
```bash
# 检查 Redis 是否运行
sudo service redis-server status
# 如果未运行,启动它
sudo service redis-server start
```
**注意**Redis 连接失败不会影响系统运行,会自动降级到内存缓存。
### 401 Unauthorized 错误
如果访问管理接口返回 401
```json
{"detail":"未认证,请先登录"}
```
**原因**:该接口需要认证
**解决方法**
1. 先调用 `/api/auth/login` 获取 Token
2. 在请求头中加入 `Authorization: Bearer YOUR_TOKEN`
### WSL 重启后服务启动失败
WSL 每次重启后需要手动启动服务:
```bash
# 一键启动所有服务
sudo service postgresql start && \
sudo service redis-server start && \
cd /mnt/e/project/stock_cs_v1/backend && \
source .venv/bin/activate && \
python main.py
```
## 9. 功能详细说明
### Redis 缓存优势
- **持久化**:服务重启后缓存不丢失
- **跨进程**:多个进程可共享缓存
- **性能提升**:大幅减少 AkShare API 调用,响应速度提升 10-100 倍
- **自动降级**Redis 不可用时自动使用内存缓存
### 鉴权机制
**支持两种认证方式**
1. **JWT Token**(推荐用于前端)
- 登录后获取 Token
- Token 有效期 7 天(可配置)
- 在 HTTP Header 中传递:`Authorization: Bearer TOKEN`
2. **API Key**(推荐用于外部系统)
-`.env` 中配置 `API_KEYS`
- 在 HTTP Header 中传递:`X-API-Key: YOUR_API_KEY`
**受保护的接口**
- `/api/admin/*` - 需要管理员权限
- 其他接口暂不需要认证(可根据需要扩展)
### 异常处理
系统现在会返回友好的错误信息:
```json
{
"success": false,
"error": "数据源异常,请稍后重试",
"code": 503
}
```
错误类型:
- **400** - 业务逻辑错误
- **401** - 未认证
- **403** - 权限不足
- **422** - 请求参数错误
- **500** - 服务器内部错误
- **503** - 数据源不可用
## 10. 升级检查清单
- [ ] 安装新依赖包
- [ ] 安装并启动 Redis
- [ ] 配置 `.env` 文件Redis + 鉴权配置)
- [ ] 生成安全的 `SECRET_KEY`
- [ ] 运行 `python cli.py init` 创建用户表
- [ ] 启动服务并验证功能
- [ ] 测试登录和受保护接口
- [ ] 修改默认管理员密码
- [ ] 检查 Redis 缓存是否生效
## 11. 回退方案
如果升级后遇到问题,可以临时禁用新功能:
1. **禁用 Redis 缓存**:停止 Redis 服务,系统会自动降级到内存缓存
```bash
sudo service redis-server stop
```
2. **禁用鉴权**:暂时注释掉 `main.py` 中受保护接口的 `Depends(require_auth)` 参数
3. **完整回退**:切换到升级前的 git 分支
---
升级完成后,系统将具备更强的性能、安全性和稳定性!