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文档
|
||||
|
||||
启动后访问:
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
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的访问日志也会输出到同一个文件
|
||||
# 生产模式:代码修改后需要手动重启服务
|
||||
# 开发模式:使用 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
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