You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

441 lines
10 KiB

# 🚀 部署指南
本文档介绍如何将 A股自选股智能分析系统部署到服务器。
## 📋 部署方案对比
| 方案 | 优点 | 缺点 | 推荐场景 |
|------|------|------|----------|
| **Docker Compose** ⭐ | 一键部署、环境隔离、易迁移、易升级 | 需要安装 Docker | **推荐**:大多数场景 |
| **直接部署** | 简单直接、无额外依赖 | 环境依赖、迁移麻烦 | 临时测试 |
| **Systemd 服务** | 系统级管理、开机自启 | 配置繁琐 | 长期稳定运行 |
| **Supervisor** | 进程管理、自动重启 | 需要额外安装 | 多进程管理 |
**结论:推荐使用 Docker Compose迁移最快最方便**
---
## 🐳 方案一Docker Compose 部署(推荐)
### 1. 安装 Docker
```bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# CentOS
sudo yum install -y docker docker-compose
sudo systemctl start docker
sudo systemctl enable docker
```
### 2. 准备配置文件
```bash
# 克隆代码(或上传代码到服务器)
git clone <your-repo-url> /opt/stock-analyzer
cd /opt/stock-analyzer
# 复制并编辑配置文件
cp .env.example .env
vim .env # 填入真实的 API Key 等配置
```
### 3. 一键启动
```bash
# 构建并启动
docker-compose -f ./docker/docker-compose.yml up -d
# 查看日志
docker-compose -f ./docker/docker-compose.yml logs -f
# 查看运行状态
docker-compose -f ./docker/docker-compose.yml ps
```
### 4. 常用管理命令
```bash
# 停止服务
docker-compose -f ./docker/docker-compose.yml down
# 重启服务
docker-compose -f ./docker/docker-compose.yml restart
# 更新代码后重新部署
git pull
docker-compose -f ./docker/docker-compose.yml build --no-cache
docker-compose -f ./docker/docker-compose.yml up -d
# 进入容器调试
docker-compose -f ./docker/docker-compose.yml exec stock-analyzer bash
# 手动执行一次分析
docker-compose -f ./docker/docker-compose.yml exec stock-analyzer python main.py --no-notify
```
### 5. 数据持久化
数据自动保存在宿主机目录:
- `./data/` - 数据库文件
- `./logs/` - 日志文件
- `./reports/` - 分析报告
---
## 🖥️ 方案二:直接部署
### 1. 安装 Python 环境
```bash
# 安装 Python 3.10+
sudo apt update
sudo apt install -y python3.10 python3.10-venv python3-pip
# 创建虚拟环境
python3.10 -m venv /opt/stock-analyzer/venv
source /opt/stock-analyzer/venv/bin/activate
```
### 2. 安装依赖
```bash
cd /opt/stock-analyzer
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
### 3. 配置环境变量
```bash
cp .env.example .env
vim .env # 填入配置
```
### 4. 运行
```bash
# 单次运行
python main.py
# 定时任务模式(前台运行)
python main.py --schedule
# 后台运行(使用 nohup
nohup python main.py --schedule > /dev/null 2>&1 &
```
---
## 🔧 方案三Systemd 服务
创建 systemd 服务文件实现开机自启和自动重启:
### 1. 创建服务文件
```bash
sudo vim /etc/systemd/system/stock-analyzer.service
```
内容:
```ini
[Unit]
Description=A股自选股智能分析系统
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/stock-analyzer
Environment="PATH=/opt/stock-analyzer/venv/bin"
ExecStart=/opt/stock-analyzer/venv/bin/python main.py --schedule
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
```
### 2. 启动服务
```bash
# 重载配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start stock-analyzer
# 开机自启
sudo systemctl enable stock-analyzer
# 查看状态
sudo systemctl status stock-analyzer
# 查看日志
journalctl -u stock-analyzer -f
```
---
## ⚙️ 配置说明
### 必须配置项
| 配置项 | 说明 | 获取方式 |
|--------|------|----------|
| `GEMINI_API_KEY` | AI 分析必需 | [Google AI Studio](https://aistudio.google.com/) |
| `STOCK_LIST` | 自选股列表 | 逗号分隔的股票代码 |
| `WECHAT_WEBHOOK_URL` | 微信推送 | 企业微信群机器人 |
### 可选配置项
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `SCHEDULE_ENABLED` | `false` | 是否启用定时任务 |
| `SCHEDULE_TIME` | `18:00` | 每日执行时间 |
| `MARKET_REVIEW_ENABLED` | `true` | 是否启用大盘复盘 |
| `TAVILY_API_KEYS` | - | 新闻搜索(可选) |
---
## 🌐 代理配置
如果服务器在国内,访问 Gemini API 需要代理:
### Docker 方式
编辑 `docker-compose.yml`
```yaml
environment:
- http_proxy=http://your-proxy:port
- https_proxy=http://your-proxy:port
```
### 直接部署方式
编辑 `main.py` 顶部:
```python
os.environ["http_proxy"] = "http://your-proxy:port"
os.environ["https_proxy"] = "http://your-proxy:port"
```
---
## 📊 监控与维护
### 日志查看
```bash
# Docker 方式
docker-compose -f ./docker/docker-compose.yml logs -f --tail=100
# 直接部署
tail -f /opt/stock-analyzer/logs/stock_analysis_*.log
```
### 健康检查
```bash
# 检查进程
ps aux | grep main.py
# 检查最近的报告
ls -la /opt/stock-analyzer/reports/
```
### 定期维护
```bash
# 清理旧日志保留7天
find /opt/stock-analyzer/logs -mtime +7 -delete
# 清理旧报告保留30天
find /opt/stock-analyzer/reports -mtime +30 -delete
```
---
## ❓ 常见问题
### 1. Docker 构建失败
```bash
# 清理缓存重新构建
docker-compose -f ./docker/docker-compose.yml build --no-cache
```
### 2. API 访问超时
检查代理配置,确保服务器能访问 Gemini API。
### 3. 数据库锁定
```bash
# 停止服务后删除 lock 文件
rm /opt/stock-analyzer/data/*.lock
```
### 4. 内存不足
调整 `docker-compose.yml` 中的内存限制:
```yaml
deploy:
resources:
limits:
memory: 1G
```
---
## 🔄 快速迁移
从一台服务器迁移到另一台:
```bash
# 源服务器:打包
cd /opt/stock-analyzer
tar -czvf stock-analyzer-backup.tar.gz .env data/ logs/ reports/
# 目标服务器:部署
mkdir -p /opt/stock-analyzer
cd /opt/stock-analyzer
git clone <your-repo-url> .
tar -xzvf stock-analyzer-backup.tar.gz
docker-compose -f ./docker/docker-compose.yml up -d
```
---
## ☁️ 方案四GitHub Actions 部署(免服务器)
**最简单的方案!** 无需服务器,利用 GitHub 免费计算资源。
### 优势
-**完全免费**(每月 2000 分钟)
-**无需服务器**
-**自动定时执行**
-**零维护成本**
### 限制
- ⚠️ 无状态(每次运行是新环境)
- ⚠️ 定时可能有几分钟延迟
- ⚠️ 无法提供 HTTP API
### 部署步骤
#### 1. 创建 GitHub 仓库
```bash
# 初始化 git如果还没有
cd /path/to/daily_stock_analysis
git init
git add .
git commit -m "Initial commit"
# 创建 GitHub 仓库并推送
# 在 GitHub 网页上创建新仓库后:
git remote add origin https://github.com/你的用户名/daily_stock_analysis.git
git branch -M main
git push -u origin main
```
#### 2. 配置 Secrets重要
打开仓库页面 → **Settings****Secrets and variables****Actions****New repository secret**
添加以下 Secrets
| Secret 名称 | 说明 | 必填 |
|------------|------|------|
| `GEMINI_API_KEY` | Gemini AI API Key | ✅ |
| `WECHAT_WEBHOOK_URL` | 企业微信机器人 Webhook | 可选* |
| `FEISHU_WEBHOOK_URL` | 飞书机器人 Webhook | 可选* |
| `TELEGRAM_BOT_TOKEN` | Telegram Bot Token | 可选* |
| `TELEGRAM_CHAT_ID` | Telegram Chat ID | 可选* |
| `TELEGRAM_MESSAGE_THREAD_ID` | Telegram Topic ID | 可选* |
| `EMAIL_SENDER` | 发件人邮箱 | 可选* |
| `EMAIL_PASSWORD` | 邮箱授权码 | 可选* |
| `SERVERCHAN3_SENDKEY` | Server酱³ Sendkey | 可选* |
| `CUSTOM_WEBHOOK_URLS` | 自定义 Webhook多个逗号分隔 | 可选* |
| `STOCK_LIST` | 自选股列表,如 `600519,300750` | ✅ |
| `TAVILY_API_KEYS` | Tavily 搜索 API Key | 推荐 |
| `SERPAPI_API_KEYS` | SerpAPI Key | 可选 |
| `TUSHARE_TOKEN` | Tushare Token | 可选 |
| `GEMINI_MODEL` | 模型名称(默认 gemini-2.0-flash | 可选 |
> *注:通知渠道至少配置一个,支持多渠道同时推送
#### 3. 验证 Workflow 文件
确保 `.github/workflows/daily_analysis.yml` 文件存在且已提交:
```bash
git add .github/workflows/daily_analysis.yml
git commit -m "Add GitHub Actions workflow"
git push
```
#### 4. 手动测试运行
1. 打开仓库页面 → **Actions** 标签
2. 选择 **"每日股票分析"** workflow
3. 点击 **"Run workflow"** 按钮
4. 选择运行模式:
- `full` - 完整分析(股票+大盘)
- `market-only` - 仅大盘复盘
- `stocks-only` - 仅股票分析
5. 点击绿色 **"Run workflow"** 按钮
#### 5. 查看执行日志
- Actions 页面可以看到运行历史
- 点击具体的运行记录查看详细日志
- 分析报告会作为 Artifact 保存 30 天
### 定时说明
默认配置:**周一到周五,北京时间 18:00** 自动执行
修改时间:编辑 `.github/workflows/daily_analysis.yml` 中的 cron 表达式:
```yaml
schedule:
- cron: '0 10 * * 1-5' # UTC 时间,+8 = 北京时间
```
常用 cron 示例:
| 表达式 | 说明 |
|--------|------|
| `'0 10 * * 1-5'` | 周一到周五 18:00北京时间 |
| `'30 7 * * 1-5'` | 周一到周五 15:30北京时间 |
| `'0 10 * * *'` | 每天 18:00北京时间 |
| `'0 2 * * 1-5'` | 周一到周五 10:00北京时间 |
### 修改自选股
方法一:修改仓库 Secret `STOCK_LIST`
方法二:直接修改代码后推送:
```bash
# 修改 .env.example 或在代码中设置默认值
git commit -am "Update stock list"
git push
```
### 常见问题
**Q: 为什么定时任务没有执行?**
A: GitHub Actions 定时任务可能有 5-15 分钟延迟,且仅在仓库有活动时才触发。长时间无 commit 可能导致 workflow 被禁用。
**Q: 如何查看历史报告?**
A: Actions → 选择运行记录 → Artifacts → 下载 `analysis-reports-xxx`
**Q: 免费额度够用吗?**
A: 每次运行约 2-5 分钟,一个月 22 个工作日 = 44-110 分钟,远低于 2000 分钟限制。
---
**祝部署顺利!🎉**