This commit is contained in:
薇薇安 2026-01-14 10:57:14 +08:00
parent 86c0a8150a
commit 4140370c2d
6 changed files with 172 additions and 12 deletions

57
backend/ENV_SETUP.md Normal file
View File

@ -0,0 +1,57 @@
# 环境变量配置说明
## .env 文件配置
后端服务支持从 `.env` 文件读取配置,优先顺序:
1. `backend/.env` (优先)
2. 项目根目录 `.env`
3. 系统环境变量
## 创建 .env 文件
`backend/` 目录下创建 `.env` 文件:
```bash
cd backend
cp .env.example .env # 如果存在示例文件
# 或直接创建
touch .env
```
## 配置示例
编辑 `.env` 文件:
```bash
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=auto_trade_sys
# CORS配置多个用逗号分隔
CORS_ORIGINS=http://localhost:3000,http://localhost:5173
# 日志级别(可选)
LOG_LEVEL=INFO
```
## 验证配置
启动后端服务后,检查日志中是否有:
```
已加载环境变量文件: /path/to/backend/.env
```
如果没有看到这条日志,可能是:
1. `.env` 文件不存在
2. `python-dotenv` 未安装(运行 `pip install -r requirements.txt`
## 注意事项
1. **不要提交 .env 文件到 Git**(已在 .gitignore 中)
2. **生产环境**:建议使用系统环境变量或密钥管理服务
3. **密码安全**:确保 `.env` 文件权限正确(`chmod 600 .env`

View File

@ -56,14 +56,40 @@ mysql -u root -p < database/init.sql
## 运行
```bash
# 开发模式
uvicorn api.main:app --reload --host 0.0.0.0 --port 8000
### 开发模式(自动重载)
# 生产模式
uvicorn api.main:app --host 0.0.0.0 --port 8000 --workers 4
代码修改后会自动重启,无需手动重启:
```bash
# 方式1使用开发启动脚本
./start_dev.sh
# 方式2直接运行
uvicorn api.main:app --reload --host 0.0.0.0 --port 8001
```
### 生产模式
代码修改后需要手动重启:
```bash
# 方式1使用生产启动脚本
./start.sh
# 方式2使用重启脚本
./restart.sh
# 方式3手动重启
# 1. 查找进程: ps aux | grep uvicorn
# 2. 停止服务: kill <PID>
# 3. 启动服务: ./start.sh
```
**注意**
- 开发模式使用 `--reload` 参数,代码修改后自动重启
- 生产模式不使用 `--reload`,需要手动重启才能生效
- 重启脚本 `restart.sh` 会自动查找并重启服务
## API文档
启动后访问:

View File

@ -61,17 +61,15 @@ async def get_trades(
如果同时提供了 period start_date/end_dateperiod 优先级更高
"""
##记录日志
logger.info(f"get_trades: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}, status={status}, limit={limit}")
try:
logger.info(f"获取交易记录请求: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}, status={status}, limit={limit}")
# 如果提供了 period使用快速时间段筛选
if period:
period_start, period_end = get_date_range(period)
if period_start and period_end:
start_date = period_start
end_date = period_end
logger.info(f"使用快速时间段筛选: {period} -> {start_date}{end_date}")
# 格式化日期(如果只提供了日期,添加时间部分)
if start_date and len(start_date) == 10: # YYYY-MM-DD
@ -80,8 +78,9 @@ async def get_trades(
end_date = f"{end_date} 23:59:59"
trades = Trade.get_all(start_date, end_date, symbol, status)
logger.info(f"get_trades: trades={trades}")
return {
logger.info(f"查询到 {len(trades)} 条交易记录")
result = {
"total": len(trades),
"trades": trades[:limit],
"filters": {
@ -92,7 +91,11 @@ async def get_trades(
"status": status
}
}
logger.debug(f"返回交易记录: {len(result['trades'])} 条 (限制: {limit})")
return result
except Exception as e:
logger.error(f"获取交易记录失败: {e}", exc_info=True)
raise HTTPException(status_code=500, detail=str(e))
@ -105,6 +108,7 @@ async def get_trade_stats(
):
"""获取交易统计"""
try:
logger.info(f"获取交易统计请求: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}")
# 如果提供了 period使用快速时间段筛选
if period:
period_start, period_end = get_date_range(period)
@ -139,6 +143,9 @@ async def get_trade_stats(
}
}
logger.info(f"交易统计: 总交易数={stats['total_trades']}, 已平仓={stats['closed_trades']}, 胜率={stats['win_rate']:.2f}%, 总盈亏={stats['total_pnl']:.2f} USDT")
return stats
except Exception as e:
logger.error(f"获取交易统计失败: {e}", exc_info=True)
raise HTTPException(status_code=500, detail=str(e))

28
backend/restart.sh Executable file
View File

@ -0,0 +1,28 @@
#!/bin/bash
# 重启后端服务脚本
cd "$(dirname "$0")"
# 查找运行中的uvicorn进程
PID=$(ps aux | grep "uvicorn api.main:app" | grep -v grep | awk '{print $2}')
if [ -z "$PID" ]; then
echo "未找到运行中的后端服务"
echo "启动新服务..."
./start.sh
else
echo "找到运行中的后端服务PID: $PID"
echo "正在停止服务..."
kill $PID
sleep 2
# 检查是否成功停止
if ps -p $PID > /dev/null 2>&1; then
echo "强制停止服务..."
kill -9 $PID
sleep 1
fi
echo "服务已停止,正在启动新服务..."
./start.sh
fi

View File

@ -30,9 +30,17 @@ export LOG_LEVEL=${LOG_LEVEL:-INFO}
# 启动服务(后台运行)
# 注意Python日志会输出到 logs/api.loguvicorn的访问日志也会输出到同一个文件
# 生产模式:代码修改后需要手动重启服务
# 开发模式:使用 start_dev.sh带 --reload 参数,代码修改后自动重启)
nohup uvicorn api.main:app --host 0.0.0.0 --port 8001 --log-level info > logs/uvicorn.log 2>&1 &
echo "后端服务已启动PID: $!"
PID=$!
echo "后端服务已启动PID: $PID"
echo "Python日志文件: logs/api.log"
echo "Uvicorn日志文件: logs/uvicorn.log"
echo "查看日志: tail -f logs/api.log"
echo ""
echo "提示:"
echo " - 代码修改后需要重启服务才能生效"
echo " - 重启服务: kill $PID && ./start.sh"
echo " - 或使用开发模式: ./start_dev.sh (自动重载)"

34
backend/start_dev.sh Executable file
View File

@ -0,0 +1,34 @@
#!/bin/bash
# 开发环境启动脚本(带自动重载)
cd "$(dirname "$0")"
# 激活虚拟环境
if [ -d "../.venv" ]; then
source ../.venv/bin/activate
elif [ -d ".venv" ]; then
source .venv/bin/activate
else
echo "错误: 找不到虚拟环境"
exit 1
fi
# 设置环境变量
export DB_HOST=${DB_HOST:-deepx2025.cb6swsyucgro.ap-east-1.rds.amazonaws.com}
export DB_PORT=${DB_PORT:-3306}
export DB_USER=${DB_USER:-autosys}
export DB_PASSWORD=${DB_PASSWORD:-as2025}
export DB_NAME=${DB_NAME:-auto_trade_sys}
export CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:3000,http://localhost:5173,http://as.deepx1.com,http://asapi.deepx1.com}
# 创建日志目录
mkdir -p logs
# 设置日志级别(如果未设置)
export LOG_LEVEL=${LOG_LEVEL:-INFO}
# 启动服务(开发模式,带自动重载)
# --reload: 代码修改后自动重启
# --reload-dir: 指定监控的目录
echo "启动开发模式(自动重载)..."
uvicorn api.main:app --reload --host 0.0.0.0 --port 8001 --log-level info