diff --git a/PM2_USAGE.md b/PM2_USAGE.md index de87772..57aa42f 100644 --- a/PM2_USAGE.md +++ b/PM2_USAGE.md @@ -19,6 +19,9 @@ pm2 --version ### 2. 启动应用 ```bash +# 确保在项目根目录 +cd ~/app/stock-ai-agent + # 开发模式启动 pm2 start ecosystem.config.js --env development @@ -77,45 +80,84 @@ pm2 monit pm2 list ``` -### 6. 日志管理 +## 📊 系统功能说明 -```bash -# 清空所有日志 -pm2 flush +启动 PM2 后,系统会自动运行以下功能: -# 查看日志文件位置 -pm2 show stock-agent | grep log +### 核心服务 +- ✅ **FastAPI Web 服务** (端口 8000) + - API 接口服务 + - 前端页面服务 + - 模拟交易界面 -# 日志轮转(安装模块) -pm2 install pm2-logrotate -``` +### 后台任务 +- ✅ **SmartAgent** - AI 对话分析 + - 通过 API 调用触发 + - 支持多种分析技能 + +- ✅ **CryptoAgent** - 加密货币分析 + - BTC/ETH 实时监控 + - LLM 技术分析 + - 交易信号生成 + +- ✅ **StockAgent** - 美股分析 + - 20 只优质股票池 + - 美股交易时间内每小时分析 + - 自动发送通知 + +- ✅ **价格监控** - 止盈止损检查 + - 每 3 秒检查活跃订单 + - 自动触发平仓 + - 实时通知 + +- ✅ **定时报告** - 交易统计 + - 每 4 小时生成报告 + - 发送到 Telegram ## 🔧 配置说明 -### ecosystem.config.js 配置文件 +### ecosystem.config.js 配置详解 ```javascript module.exports = { apps: [{ name: 'stock-agent', // 应用名称 script: 'backend/app/main.py', // 启动脚本 - interpreter: 'python3', // 解释器 - cwd: './', // 工作目录 - instances: 1, // 实例数量 - autorestart: true, // 自动重启 - watch: false, // 文件监控(生产环境建议关闭) - max_memory_restart: '1G', // 内存超限重启 - error_file: './logs/pm2-error.log', // 错误日志 - out_file: './logs/pm2-out.log', // 输出日志 - log_file: './logs/pm2-combined.log',// 合并日志 - time: true, // 日志时间戳 - kill_timeout: 5000, // 停止超时 - min_uptime: '10s', // 最小运行时间 + interpreter: 'python3', // Python 解释器 + interpreter_args: '-u', // 无缓冲输出 + + cwd: process.cwd(), // 工作目录(自动获取) + + instances: 1, // 单实例 + exec_mode: 'fork', // Fork 模式 + + autorestart: true, // 崩溃自动重启 + watch: false, // 关闭文件监控 max_restarts: 10, // 最大重启次数 + min_uptime: '10s', // 最小运行时间 + + max_memory_restart: '2G', // 内存超限重启(2GB) + + error_file: './logs/pm2-error.log', // 错误日志 + out_file: './logs/pm2-out.log', // 输出日志 + log_file: './logs/pm2-combined.log', // 合并日志 + time: true, // 日志时间戳 + + kill_timeout: 8000, // 优雅关闭超时 + wait_ready: true, // 等待应用就绪 }] }; ``` +### 关键配置说明 + +| 配置项 | 值 | 说明 | +|--------|-----|------| +| `instances` | 1 | 单实例(FastAPI + asyncio 不支持多实例) | +| `max_memory_restart` | 2G | 内存超过 2GB 自动重启 | +| `kill_timeout` | 8000 | 优雅关闭超时 8 秒 | +| `watch` | false | 关闭文件监控(生产环境必须关闭) | + ## 🛠️ 常用命令 ### 开发环境 @@ -129,6 +171,9 @@ pm2 logs stock-agent # 重启 pm2 restart stock-agent + +# 停止 +pm2 stop stock-agent ``` ### 生产环境 @@ -167,9 +212,23 @@ pm2 flush ### 日志文件位置 ``` -./logs/pm2-error.log # 错误日志 -./logs/pm2-out.log # 输出日志 -./logs/pm2-combined.log # 合并日志 +./logs/pm2-error.log # 错误日志 +./logs/pm2-out.log # 输出日志 +./logs/pm2-combined.log # 合并日志 +./logs/pm2.pid # 进程 ID 文件 +``` + +### 日志轮转 + +```bash +# 安装日志轮转模块 +pm2 install pm2-logrotate + +# 配置日志轮转 +pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大 10MB +pm2 set pm2-logrotate:retain 7 # 保留 7 个日志文件 +pm2 set pm2-logrotate:compress true # 压缩旧日志 +pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 每天午夜轮转 ``` ## 🔍 故障排除 @@ -181,10 +240,16 @@ pm2 flush pm2 list # 查看错误日志 -pm2 logs stock-agent --err +pm2 logs stock-agent --err --lines 50 # 检查配置 pm2 show stock-agent + +# 可能原因: +# 1. 端口被占用 -> lsof -i :8000 +# 2. 依赖缺失 -> 检查 requirements.txt +# 3. 配置错误 -> 检查 .env 文件 +# 4. 内存不足 -> 调整 max_memory_restart ``` ### 问题 2: 内存占用过高 @@ -193,20 +258,39 @@ pm2 show stock-agent # 查看内存使用 pm2 monit -# 如果内存超过 max_memory_restart,会自动重启 +# 查看详细信息 +pm2 show stock-agent + +# 如果内存超过 2G,会自动重启 +# 可以调整配置:max_memory_restart: '3G' ``` -### 问题 3: 端口被占用 +### 问题 3: 日志不输出 + +```bash +# 检查 interpreter_args 配置 +# 确保: interpreter_args: '-u' # unbuffered output + +# 检查环境变量 +pm2 env 0 # 0 是进程 ID + +# 查看实时日志 +pm2 logs stock-agent --lines 0 +``` + +### 问题 4: 端口被占用 ```bash # 查看端口占用 lsof -i :8000 +# 或 +netstat -tlnp | grep 8000 -# 停止应用 +# 停止占用端口的进程 pm2 stop stock-agent -# 修改 .env 中的端口后重启 -pm2 restart stock-agent +# 或修改 .env 中的端口 +API_PORT=8001 ``` ## 🚀 开机自启 @@ -220,17 +304,26 @@ pm2 save # 2. 生成启动脚本 pm2 startup -# 3. 按照提示执行命令 +# 3. 按照提示执行命令(可能需要 sudo) +# 示例输出: +# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu # 4. 验证 pm2 list + +# 5. 测试重启后是否自动启动 +sudo reboot ``` -### 重启后恢复 +### 重启后验证 ```bash -# 恢复保存的进程列表 -pm2 resurrect +# 连接服务器后检查 +pm2 list +pm2 status + +# 查看日志 +pm2 logs stock-agent --lines 20 ``` ## 📝 最佳实践 @@ -241,8 +334,10 @@ pm2 resurrect # 使用开发模式 pm2 start ecosystem.config.js --env development -# 开启文件监控(可选) -pm2 start ecosystem.config.js --watch +# 特点: +# - DEBUG=True,详细日志 +# - 热重载(可选) +# - 更容易调试 ``` ### 2. 生产环境 @@ -251,20 +346,19 @@ pm2 start ecosystem.config.js --watch # 使用生产模式 pm2 start ecosystem.config.js --env production -# 保存进程列表 -pm2 save - -# 设置开机自启 -pm2 startup +# 特点: +# - DEBUG=False,减少日志 +# - 性能优化 +# - 更稳定 ``` ### 3. 日志管理 ```bash -# 安装日志轮转模块 +# 安装日志轮转 pm2 install pm2-logrotate -# 配置日志轮转 +# 配置自动清理 pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 7 pm2 set pm2-logrotate:compress true @@ -273,11 +367,16 @@ pm2 set pm2-logrotate:compress true ### 4. 监控告警 ```bash -# 安装监控模块 +# 安装监控模块(可选) pm2 install pm2-server-monit # 查看监控 pm2 monit + +# 或使用系统监控工具 +# - htop +# - glances +# - netdata ``` ## 🎯 完整工作流程 @@ -292,22 +391,32 @@ cd .. # 2. 配置 .env 文件 cp .env.example .env -# 编辑 .env 文件 +# 编辑 .env 文件,填入 API 密钥等配置 # 3. 创建日志目录 mkdir -p logs -# 4. 启动应用 -pm2 start ecosystem.config.js +# 4. 测试启动(不使用 PM2) +cd backend +python3 -m app.main +# 确认服务正常启动后 Ctrl+C 停止 -# 5. 保存进程列表 -pm2 save +# 5. 使用 PM2 启动 +cd .. +pm2 start ecosystem.config.js # 6. 查看状态 pm2 status -# 7. 查看日志 -pm2 logs stock-agent +# 7. 查看日志确认 +pm2 logs stock-agent --lines 50 + +# 8. 保存进程列表 +pm2 save + +# 9. 设置开机自启(可选) +pm2 startup +pm2 save ``` ### 日常维护 @@ -317,44 +426,107 @@ pm2 logs stock-agent pm2 status # 查看日志 -pm2 logs stock-agent --lines 50 +pm2 logs stock-agent --lines 100 # 重启应用 pm2 restart stock-agent -# 清空日志 +# 清空日志(磁盘空间不足时) pm2 flush + +# 更新代码后 +git pull +pm2 restart stock-agent ``` -### 更新代码后 +### 更新部署 ```bash # 1. 拉取最新代码 -git pull +git pull origin main -# 2. 重启应用 +# 2. 更新依赖(如有需要) +cd backend +pip install -r requirements.txt +cd .. + +# 3. 重启应用 pm2 restart stock-agent -# 3. 查看日志确认 -pm2 logs stock-agent --lines 20 +# 4. 查看日志确认 +pm2 logs stock-agent --lines 50 + +# 5. 查看状态 +pm2 status +``` + +## 📚 API 访问 + +启动成功后,可以访问: + +- **主页**: http://your-server:8000/ +- **模拟交易**: http://your-server:8000/paper-trading +- **API 文档**: http://your-server:8000/docs +- **健康检查**: http://your-server:8000/health + +### 测试 API + +```bash +# 测试健康检查 +curl http://localhost:8000/health + +# 测试美股 API +curl http://localhost:8000/api/stocks/status + +# 测试对话 API(需要认证) +curl -X POST http://localhost:8000/api/chat/completions \ + -H "Content-Type: application/json" \ + -d '{"message": "分析一下 BTC"}' ``` ## 📚 参考链接 - PM2 官方文档: https://pm2.keymetrics.io/ - PM2 GitHub: https://github.com/Unitech/pm2 +- FastAPI 文档: https://fastapi.tiangolo.com/ ## ⚠️ 注意事项 -1. **生产环境**:关闭 `watch` 选项,避免性能问题 -2. **日志管理**:定期清理或配置日志轮转,避免磁盘占满 -3. **内存监控**:设置合理的 `max_memory_restart` -4. **开机自启**:生产环境建议设置开机自启 -5. **环境变量**:确保 `.env` 文件配置正确 +### 重要提醒 + +1. **生产环境** + - 关闭 `watch` 选项,避免性能问题 + - 使用 `--env production` 启动 + - 设置合理的 `max_memory_restart` + +2. **日志管理** + - 定期清理或配置日志轮转 + - 避免磁盘占满 + - 监控日志文件大小 + +3. **内存监控** + - 默认 2GB 自动重启 + - 可根据实际情况调整 + - 监控内存使用情况 + +4. **开机自启** + - 生产环境建议设置 + - 确保 `pm2 save` 保存了配置 + - 重启后验证服务是否启动 + +5. **环境变量** + - 确保 `.env` 文件配置正确 + - 检查 API 密钥是否有效 + - 生产环境使用独立的配置 + +6. **端口配置** + - 默认端口 8000 + - 确保防火墙允许访问 + - 可在 `.env` 中修改端口 ## 🎉 完成 -配置完成后,你的应用将: +配置完成后,你的系统将: - ✅ 在后台持续运行 - ✅ 崩溃后自动重启 @@ -362,4 +534,12 @@ pm2 logs stock-agent --lines 20 - ✅ 自动管理日志 - ✅ 实时监控状态 -所有系统(SmartAgent、CryptoAgent、StockAgent、模拟交易)都会自动启动并运行! +### 系统会自动运行: + +- **SmartAgent** - AI 对话分析 +- **CryptoAgent** - 加密货币分析 +- **StockAgent** - 美股分析(20 只股票) +- **价格监控** - 止盈止损检查 +- **定时报告** - 交易统计 + +祝使用愉快!🚀 diff --git a/ecosystem.config.js b/ecosystem.config.js index fd04ce0..f48bd6f 100644 --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -1,33 +1,98 @@ module.exports = { apps: [{ + // ============================================ + // 应用基本配置 + // ============================================ name: 'stock-agent', script: 'backend/app/main.py', interpreter: 'python3', - interpreter_args: '--u', - // 自动获取当前目录 + + // ============================================ + // 工作目录配置 + // ============================================ + // PM2 启动时的工作目录,自动获取当前目录 + // 确保从项目根目录启动: pm2 start ecosystem.config.js cwd: process.cwd(), - instances: 1, - autorestart: true, - watch: false, - max_memory_restart: '1G', + + // ============================================ + // 实例配置 + // ============================================ + instances: 1, // 单实例(FastAPI + asyncio 不支持多实例) + exec_mode: 'fork', // fork 模式 + + // ============================================ + // 自动重启配置 + // ============================================ + autorestart: true, // 崩溃后自动重启 + watch: false, // 关闭文件监控(生产环境必须关闭) + max_restarts: 10, // 最大重启次数 + min_uptime: '10s', // 最小运行时间,10秒内崩溃不计入重启次数 + + // ============================================ + // 内存管理 + // ============================================ + max_memory_restart: '2G', // 内存超过 2G 自动重启 + // Python 应用 + FastAPI + asyncio + LLM 分析需要较多内存 + // 20 只美股分析 + 加密货币监控 + 模拟交易 + + // ============================================ + // 日志配置 + // ============================================ error_file: './logs/pm2-error.log', out_file: './logs/pm2-out.log', log_file: './logs/pm2-combined.log', - time: true, + time: true, // 日志带时间戳 + log_date_format: 'YYYY-MM-DD HH:mm:ss Z', + merge_logs: true, // 合并实例日志 + + // ============================================ // 进程管理 - kill_timeout: 5000, - wait_ready: true, - // 健康检查 - min_uptime: '10s', - max_restarts: 10, - // 环境变量 - env_production: { - NODE_ENV: 'production', - DEBUG: 'False' + // ============================================ + kill_timeout: 8000, // 优雅关闭超时时间(8秒) + wait_ready: true, // 等待应用就绪 + listen_timeout: 10000, // 监听超时(10秒) + + // ============================================ + // 环境变量配置 + // ============================================ + env: { + // 默认环境(开发) + PYTHONUNBUFFERED: '1', // Python 无缓冲输出(等同于 -u 参数) + LANG: 'en_US.UTF-8', // 字符编码 + LC_ALL: 'en_US.UTF-8', }, + + env_production: { + // 生产环境 + NODE_ENV: 'production', + DEBUG: 'False', + PYTHONUNBUFFERED: '1', + }, + env_development: { + // 开发环境 NODE_ENV: 'development', - DEBUG: 'True' - } + DEBUG: 'True', + PYTHONUNBUFFERED: '1', + }, + + // ============================================ + // 健康检查 + // ============================================ + // PM2 会定期检查应用是否存活 + // 如果应用在指定时间内没有响应,会重启 + kill_retry_time: 100, // 杀死进程前的等待时间 + restart_delay: 4000, // 重启延迟(4秒) + + // ============================================ + // 进程 ID 文件 + // ============================================ + pid_file: './logs/pm2.pid', // PID 文件位置 + + // ============================================ + // 其他配置 + // ============================================ + source_map_support: false, // Python 不需要 source map + disable_trace: false, // 启用堆栈跟踪 }] };