diff --git a/backend/ENV_SETUP.md b/backend/ENV_SETUP.md new file mode 100644 index 0000000..3f40294 --- /dev/null +++ b/backend/ENV_SETUP.md @@ -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`) diff --git a/backend/README.md b/backend/README.md index 2bdfbf7..e38d898 100644 --- a/backend/README.md +++ b/backend/README.md @@ -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 +# 3. 启动服务: ./start.sh +``` + +**注意**: +- 开发模式使用 `--reload` 参数,代码修改后自动重启 +- 生产模式不使用 `--reload`,需要手动重启才能生效 +- 重启脚本 `restart.sh` 会自动查找并重启服务 + ## API文档 启动后访问: diff --git a/backend/api/routes/trades.py b/backend/api/routes/trades.py index 434c5c5..8ce8156 100644 --- a/backend/api/routes/trades.py +++ b/backend/api/routes/trades.py @@ -61,17 +61,15 @@ async def get_trades( 如果同时提供了 period 和 start_date/end_date,period 优先级更高 """ - - ##记录日志 - 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)) diff --git a/backend/restart.sh b/backend/restart.sh new file mode 100755 index 0000000..b27f164 --- /dev/null +++ b/backend/restart.sh @@ -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 diff --git a/backend/start.sh b/backend/start.sh index 7d4032b..359c8e9 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -30,9 +30,17 @@ export LOG_LEVEL=${LOG_LEVEL:-INFO} # 启动服务(后台运行) # 注意:Python日志会输出到 logs/api.log,uvicorn的访问日志也会输出到同一个文件 +# 生产模式:代码修改后需要手动重启服务 +# 开发模式:使用 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 (自动重载)" \ No newline at end of file diff --git a/backend/start_dev.sh b/backend/start_dev.sh new file mode 100755 index 0000000..dcb0f82 --- /dev/null +++ b/backend/start_dev.sh @@ -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