This commit is contained in:
aaron 2026-02-19 21:29:26 +08:00
parent a771bbad31
commit b6cca20f58
2 changed files with 329 additions and 84 deletions

View File

@ -19,6 +19,9 @@ pm2 --version
### 2. 启动应用 ### 2. 启动应用
```bash ```bash
# 确保在项目根目录
cd ~/app/stock-ai-agent
# 开发模式启动 # 开发模式启动
pm2 start ecosystem.config.js --env development pm2 start ecosystem.config.js --env development
@ -77,45 +80,84 @@ pm2 monit
pm2 list pm2 list
``` ```
### 6. 日志管理 ## 📊 系统功能说明
```bash 启动 PM2 后,系统会自动运行以下功能:
# 清空所有日志
pm2 flush
# 查看日志文件位置 ### 核心服务
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 ```javascript
module.exports = { module.exports = {
apps: [{ apps: [{
name: 'stock-agent', // 应用名称 name: 'stock-agent', // 应用名称
script: 'backend/app/main.py', // 启动脚本 script: 'backend/app/main.py', // 启动脚本
interpreter: 'python3', // 解释器 interpreter: 'python3', // Python 解释器
cwd: './', // 工作目录 interpreter_args: '-u', // 无缓冲输出
instances: 1, // 实例数量
autorestart: true, // 自动重启 cwd: process.cwd(), // 工作目录(自动获取)
watch: false, // 文件监控(生产环境建议关闭)
max_memory_restart: '1G', // 内存超限重启 instances: 1, // 单实例
error_file: './logs/pm2-error.log', // 错误日志 exec_mode: 'fork', // Fork 模式
out_file: './logs/pm2-out.log', // 输出日志
log_file: './logs/pm2-combined.log',// 合并日志 autorestart: true, // 崩溃自动重启
time: true, // 日志时间戳 watch: false, // 关闭文件监控
kill_timeout: 5000, // 停止超时
min_uptime: '10s', // 最小运行时间
max_restarts: 10, // 最大重启次数 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 restart stock-agent
# 停止
pm2 stop stock-agent
``` ```
### 生产环境 ### 生产环境
@ -167,9 +212,23 @@ pm2 flush
### 日志文件位置 ### 日志文件位置
``` ```
./logs/pm2-error.log # 错误日志 ./logs/pm2-error.log # 错误日志
./logs/pm2-out.log # 输出日志 ./logs/pm2-out.log # 输出日志
./logs/pm2-combined.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 list
# 查看错误日志 # 查看错误日志
pm2 logs stock-agent --err pm2 logs stock-agent --err --lines 50
# 检查配置 # 检查配置
pm2 show stock-agent pm2 show stock-agent
# 可能原因:
# 1. 端口被占用 -> lsof -i :8000
# 2. 依赖缺失 -> 检查 requirements.txt
# 3. 配置错误 -> 检查 .env 文件
# 4. 内存不足 -> 调整 max_memory_restart
``` ```
### 问题 2: 内存占用过高 ### 问题 2: 内存占用过高
@ -193,20 +258,39 @@ pm2 show stock-agent
# 查看内存使用 # 查看内存使用
pm2 monit 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 ```bash
# 查看端口占用 # 查看端口占用
lsof -i :8000 lsof -i :8000
# 或
netstat -tlnp | grep 8000
# 停止应用 # 停止占用端口的进程
pm2 stop stock-agent pm2 stop stock-agent
# 修改 .env 中的端口后重启 # 修改 .env 中的端口
pm2 restart stock-agent API_PORT=8001
``` ```
## 🚀 开机自启 ## 🚀 开机自启
@ -220,17 +304,26 @@ pm2 save
# 2. 生成启动脚本 # 2. 生成启动脚本
pm2 startup pm2 startup
# 3. 按照提示执行命令 # 3. 按照提示执行命令(可能需要 sudo
# 示例输出:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu
# 4. 验证 # 4. 验证
pm2 list pm2 list
# 5. 测试重启后是否自动启动
sudo reboot
``` ```
### 重启后恢复 ### 重启后验证
```bash ```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 --env development
# 开启文件监控(可选) # 特点:
pm2 start ecosystem.config.js --watch # - DEBUG=True详细日志
# - 热重载(可选)
# - 更容易调试
``` ```
### 2. 生产环境 ### 2. 生产环境
@ -251,20 +346,19 @@ pm2 start ecosystem.config.js --watch
# 使用生产模式 # 使用生产模式
pm2 start ecosystem.config.js --env production pm2 start ecosystem.config.js --env production
# 保存进程列表 # 特点:
pm2 save # - DEBUG=False减少日志
# - 性能优化
# 设置开机自启 # - 更稳定
pm2 startup
``` ```
### 3. 日志管理 ### 3. 日志管理
```bash ```bash
# 安装日志轮转模块 # 安装日志轮转
pm2 install pm2-logrotate pm2 install pm2-logrotate
# 配置日志轮转 # 配置自动清理
pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7 pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true pm2 set pm2-logrotate:compress true
@ -273,11 +367,16 @@ pm2 set pm2-logrotate:compress true
### 4. 监控告警 ### 4. 监控告警
```bash ```bash
# 安装监控模块 # 安装监控模块(可选)
pm2 install pm2-server-monit pm2 install pm2-server-monit
# 查看监控 # 查看监控
pm2 monit pm2 monit
# 或使用系统监控工具
# - htop
# - glances
# - netdata
``` ```
## 🎯 完整工作流程 ## 🎯 完整工作流程
@ -292,22 +391,32 @@ cd ..
# 2. 配置 .env 文件 # 2. 配置 .env 文件
cp .env.example .env cp .env.example .env
# 编辑 .env 文件 # 编辑 .env 文件,填入 API 密钥等配置
# 3. 创建日志目录 # 3. 创建日志目录
mkdir -p logs mkdir -p logs
# 4. 启动应用 # 4. 测试启动(不使用 PM2
pm2 start ecosystem.config.js cd backend
python3 -m app.main
# 确认服务正常启动后 Ctrl+C 停止
# 5. 保存进程列表 # 5. 使用 PM2 启动
pm2 save cd ..
pm2 start ecosystem.config.js
# 6. 查看状态 # 6. 查看状态
pm2 status pm2 status
# 7. 查看日志 # 7. 查看日志确认
pm2 logs stock-agent 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 status
# 查看日志 # 查看日志
pm2 logs stock-agent --lines 50 pm2 logs stock-agent --lines 100
# 重启应用 # 重启应用
pm2 restart stock-agent pm2 restart stock-agent
# 清空日志 # 清空日志(磁盘空间不足时)
pm2 flush pm2 flush
# 更新代码后
git pull
pm2 restart stock-agent
``` ```
### 更新代码后 ### 更新部署
```bash ```bash
# 1. 拉取最新代码 # 1. 拉取最新代码
git pull git pull origin main
# 2. 重启应用 # 2. 更新依赖(如有需要)
cd backend
pip install -r requirements.txt
cd ..
# 3. 重启应用
pm2 restart stock-agent pm2 restart stock-agent
# 3. 查看日志确认 # 4. 查看日志确认
pm2 logs stock-agent --lines 20 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 官方文档: https://pm2.keymetrics.io/
- PM2 GitHub: https://github.com/Unitech/pm2 - PM2 GitHub: https://github.com/Unitech/pm2
- FastAPI 文档: https://fastapi.tiangolo.com/
## ⚠️ 注意事项 ## ⚠️ 注意事项
1. **生产环境**:关闭 `watch` 选项,避免性能问题 ### 重要提醒
2. **日志管理**:定期清理或配置日志轮转,避免磁盘占满
3. **内存监控**:设置合理的 `max_memory_restart` 1. **生产环境**
4. **开机自启**:生产环境建议设置开机自启 - 关闭 `watch` 选项,避免性能问题
5. **环境变量**:确保 `.env` 文件配置正确 - 使用 `--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 只股票)
- **价格监控** - 止盈止损检查
- **定时报告** - 交易统计
祝使用愉快!🚀

View File

@ -1,33 +1,98 @@
module.exports = { module.exports = {
apps: [{ apps: [{
// ============================================
// 应用基本配置
// ============================================
name: 'stock-agent', name: 'stock-agent',
script: 'backend/app/main.py', script: 'backend/app/main.py',
interpreter: 'python3', interpreter: 'python3',
interpreter_args: '--u',
// 自动获取当前目录 // ============================================
// 工作目录配置
// ============================================
// PM2 启动时的工作目录,自动获取当前目录
// 确保从项目根目录启动: pm2 start ecosystem.config.js
cwd: process.cwd(), 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', error_file: './logs/pm2-error.log',
out_file: './logs/pm2-out.log', out_file: './logs/pm2-out.log',
log_file: './logs/pm2-combined.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, kill_timeout: 8000, // 优雅关闭超时时间8秒
// 健康检查 wait_ready: true, // 等待应用就绪
min_uptime: '10s', listen_timeout: 10000, // 监听超时10秒
max_restarts: 10,
// 环境变量 // ============================================
env_production: { // 环境变量配置
NODE_ENV: 'production', // ============================================
DEBUG: 'False' 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: { env_development: {
// 开发环境
NODE_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, // 启用堆栈跟踪
}] }]
}; };