a
This commit is contained in:
parent
86c0a8150a
commit
4140370c2d
57
backend/ENV_SETUP.md
Normal file
57
backend/ENV_SETUP.md
Normal 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`)
|
||||||
|
|
@ -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文档
|
## API文档
|
||||||
|
|
||||||
启动后访问:
|
启动后访问:
|
||||||
|
|
|
||||||
|
|
@ -61,17 +61,15 @@ async def get_trades(
|
||||||
|
|
||||||
如果同时提供了 period 和 start_date/end_date,period 优先级更高
|
如果同时提供了 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:
|
try:
|
||||||
|
logger.info(f"获取交易记录请求: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}, status={status}, limit={limit}")
|
||||||
# 如果提供了 period,使用快速时间段筛选
|
# 如果提供了 period,使用快速时间段筛选
|
||||||
if period:
|
if period:
|
||||||
period_start, period_end = get_date_range(period)
|
period_start, period_end = get_date_range(period)
|
||||||
if period_start and period_end:
|
if period_start and period_end:
|
||||||
start_date = period_start
|
start_date = period_start
|
||||||
end_date = period_end
|
end_date = period_end
|
||||||
|
logger.info(f"使用快速时间段筛选: {period} -> {start_date} 至 {end_date}")
|
||||||
|
|
||||||
# 格式化日期(如果只提供了日期,添加时间部分)
|
# 格式化日期(如果只提供了日期,添加时间部分)
|
||||||
if start_date and len(start_date) == 10: # YYYY-MM-DD
|
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"
|
end_date = f"{end_date} 23:59:59"
|
||||||
|
|
||||||
trades = Trade.get_all(start_date, end_date, symbol, status)
|
trades = Trade.get_all(start_date, end_date, symbol, status)
|
||||||
logger.info(f"get_trades: trades={trades}")
|
logger.info(f"查询到 {len(trades)} 条交易记录")
|
||||||
return {
|
|
||||||
|
result = {
|
||||||
"total": len(trades),
|
"total": len(trades),
|
||||||
"trades": trades[:limit],
|
"trades": trades[:limit],
|
||||||
"filters": {
|
"filters": {
|
||||||
|
|
@ -92,7 +91,11 @@ async def get_trades(
|
||||||
"status": status
|
"status": status
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.debug(f"返回交易记录: {len(result['trades'])} 条 (限制: {limit})")
|
||||||
|
return result
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
logger.error(f"获取交易记录失败: {e}", exc_info=True)
|
||||||
raise HTTPException(status_code=500, detail=str(e))
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -105,6 +108,7 @@ async def get_trade_stats(
|
||||||
):
|
):
|
||||||
"""获取交易统计"""
|
"""获取交易统计"""
|
||||||
try:
|
try:
|
||||||
|
logger.info(f"获取交易统计请求: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}")
|
||||||
# 如果提供了 period,使用快速时间段筛选
|
# 如果提供了 period,使用快速时间段筛选
|
||||||
if period:
|
if period:
|
||||||
period_start, period_end = get_date_range(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
|
return stats
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
logger.error(f"获取交易统计失败: {e}", exc_info=True)
|
||||||
raise HTTPException(status_code=500, detail=str(e))
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
|
||||||
28
backend/restart.sh
Executable file
28
backend/restart.sh
Executable 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
|
||||||
|
|
@ -30,9 +30,17 @@ export LOG_LEVEL=${LOG_LEVEL:-INFO}
|
||||||
|
|
||||||
# 启动服务(后台运行)
|
# 启动服务(后台运行)
|
||||||
# 注意:Python日志会输出到 logs/api.log,uvicorn的访问日志也会输出到同一个文件
|
# 注意: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 &
|
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 "Python日志文件: logs/api.log"
|
||||||
echo "Uvicorn日志文件: logs/uvicorn.log"
|
echo "Uvicorn日志文件: logs/uvicorn.log"
|
||||||
echo "查看日志: tail -f logs/api.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
34
backend/start_dev.sh
Executable 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
|
||||||
Loading…
Reference in New Issue
Block a user