docs/DEPLOY.md
本文档介绍如何将 A股自选股智能分析系统部署到服务器。
| 方案 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| Docker Compose ⭐ | 一键部署、环境隔离、易迁移、易升级 | 需要安装 Docker | 推荐:大多数场景 |
| 直接部署 | 简单直接、无额外依赖 | 环境依赖、迁移麻烦 | 临时测试 |
| Systemd 服务 | 系统级管理、开机自启 | 配置繁琐 | 长期稳定运行 |
| Supervisor | 进程管理、自动重启 | 需要额外安装 | 多进程管理 |
结论:推荐使用 Docker Compose,迁移最快最方便!
# 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
# 克隆代码(或上传代码到服务器)
git clone <your-repo-url> /opt/stock-analyzer
cd /opt/stock-analyzer
# 复制并编辑配置文件
cp .env.example .env
vim .env # 填入真实的 API Key 等配置
# 构建并启动(同时包含定时分析和 Web 界面服务)
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
启动成功后,在浏览器输入 http://服务器公网IP:8000 即可打开 Web 管理界面。如果打不开,记得先在云服务器控制台的「安全组」里放行 8000 端口。
不知道怎么访问?→ 云服务器 Web 界面访问指南
# 停止服务
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
数据自动保存在宿主机目录:
./data/ - 数据库文件./logs/ - 日志文件./reports/ - 分析报告# 安装 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
cd /opt/stock-analyzer
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
cp .env.example .env
vim .env # 填入配置
# 单次运行
python main.py
# 定时任务模式(前台运行)
python main.py --schedule
# 后台运行(使用 nohup)
nohup python main.py --schedule > /dev/null 2>&1 &
# 启动 Web 管理界面(云服务器需先在 .env 中设置 WEBUI_HOST=0.0.0.0)
python main.py --webui-only
# 启动 Web 界面(启动时执行一次分析;需每日定时请加 --schedule 或设 SCHEDULE_ENABLED=true)
python main.py --webui
不知道怎么访问?→ 云服务器 Web 界面访问指南
创建 systemd 服务文件实现开机自启和自动重启:
sudo vim /etc/systemd/system/stock-analyzer.service
内容:
[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
# 重载配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start stock-analyzer
# 开机自启
sudo systemctl enable stock-analyzer
# 查看状态
sudo systemctl status stock-analyzer
# 查看日志
journalctl -u stock-analyzer -f
| 配置项 | 说明 | 获取方式 |
|---|---|---|
ANSPIRE_API_KEYS / AIHUBMIX_KEY / GEMINI_API_KEY / ANTHROPIC_API_KEY / OPENAI_API_KEY | AI 模型至少配置一个;推荐优先 Anspire 或 AIHubMix | 对应服务商控制台 |
STOCK_LIST | 自选股列表 | 逗号分隔的股票代码 |
| 通知渠道 | 至少配置一个,如企业微信、飞书、Telegram 或邮件 | 对应通知平台 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
SCHEDULE_ENABLED | false | 是否启用定时任务 |
SCHEDULE_TIME | 18:00 | 每日执行时间 |
MARKET_REVIEW_ENABLED | true | 是否启用大盘复盘 |
ANSPIRE_API_KEYS | - | Anspire 大模型与新闻搜索(推荐) |
AIHUBMIX_KEY | - | AIHubMix 一 Key 多模型(推荐) |
SERPAPI_API_KEYS | - | SerpAPI 实时金融新闻搜索(推荐) |
TAVILY_API_KEYS | - | Tavily 新闻搜索(可选) |
MINIMAX_API_KEYS | - | MiniMax 搜索(可选) |
如果服务器在国内,访问 Gemini API 需要代理:
编辑 docker-compose.yml:
environment:
- http_proxy=http://your-proxy:port
- https_proxy=http://your-proxy:port
编辑 main.py 顶部:
os.environ["http_proxy"] = "http://your-proxy:port"
os.environ["https_proxy"] = "http://your-proxy:port"
# Docker 方式
docker-compose -f ./docker/docker-compose.yml logs -f --tail=100
# 直接部署
tail -f /opt/stock-analyzer/logs/stock_analysis_*.log
# 检查进程
ps aux | grep main.py
# 检查最近的报告
ls -la /opt/stock-analyzer/reports/
# 清理旧日志(保留7天)
find /opt/stock-analyzer/logs -mtime +7 -delete
# 清理旧报告(保留30天)
find /opt/stock-analyzer/reports -mtime +30 -delete
# 清理缓存重新构建
docker-compose -f ./docker/docker-compose.yml build --no-cache
检查代理配置,确保服务器能访问 Gemini API。
# 停止服务后删除 lock 文件
rm /opt/stock-analyzer/data/*.lock
调整 docker-compose.yml 中的内存限制:
deploy:
resources:
limits:
memory: 1G
症状:能访问 8000 端口,但页面上的文字、按钮、卡片异常放大,没有正常布局。
根因:static/index.html 存在,但 CSS/JS 资源文件缺失(static/assets/ 为空或不存在),浏览器无法加载样式与脚本,导致裸 HTML 渲染。
解决方法:
Docker 部署:执行以下命令重新构建镜像(确保前端已正确打包进镜像):
docker-compose -f ./docker/docker-compose.yml down
docker-compose -f ./docker/docker-compose.yml build --no-cache
docker-compose -f ./docker/docker-compose.yml up -d
构建完成后刷新浏览器缓存(Ctrl+Shift+R)再访问。
直接部署(pip + python):先构建前端,再启动服务:
# 安装 Node.js 18+(推荐 20+,如尚未安装)
# 构建前端
cd apps/dsa-web
npm ci
npm run build
cd ../..
# 启动服务
python main.py --webui-only
验证:用浏览器开发者工具(F12 → Network)检查是否有 /assets/index-*.js 和 /assets/index-*.css 的 404 错误;如有,说明资源缺失,按上述步骤重新构建即可。
从一台服务器迁移到另一台:
# 源服务器:打包
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 免费计算资源。
# 初始化 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
打开仓库页面 → Settings → Secrets and variables → Actions → New repository secret
添加以下 Secrets:
| Secret 名称 | 说明 | 必填 |
|---|---|---|
ANSPIRE_API_KEYS | Anspire Open API Key(一 Key 启用大模型与搜索) | 推荐 |
AIHUBMIX_KEY | AIHubMix API Key(一 Key 多模型) | 推荐 |
ANTHROPIC_API_KEY | Anthropic API Key | 可选 |
GEMINI_API_KEY | Gemini AI API Key | 可选 |
OPENAI_API_KEY | OpenAI 兼容 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 | ✅ |
SERPAPI_API_KEYS | SerpAPI Key | 推荐 |
TAVILY_API_KEYS | Tavily 搜索 API Key | 可选 |
BOCHA_API_KEYS | 博查搜索 API Key | 可选 |
BRAVE_API_KEYS | Brave Search API Key | 可选 |
MINIMAX_API_KEYS | MiniMax Coding Plan Web Search | 可选 |
SEARXNG_BASE_URLS | SearXNG 自建实例(无配额兜底,需在 settings.yml 启用 format: json);留空时默认自动发现公共实例 | 可选 |
SEARXNG_PUBLIC_INSTANCES_ENABLED | 是否在 SEARXNG_BASE_URLS 为空时自动从 searx.space 获取公共实例(默认 true) | 可选 |
TUSHARE_TOKEN | Tushare Token | 可选 |
GEMINI_MODEL | 模型名称(默认 gemini-2.0-flash) | 可选 |
*注:通知渠道至少配置一个,支持多渠道同时推送
确保 .github/workflows/daily_analysis.yml 文件存在且已提交:
git add .github/workflows/daily_analysis.yml
git commit -m "Add GitHub Actions workflow"
git push
full - 完整分析(股票+大盘)market-only - 仅大盘复盘stocks-only - 仅股票分析默认配置:周一到周五,北京时间 18:00 自动执行
修改时间:编辑 .github/workflows/daily_analysis.yml 中的 cron 表达式:
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
方法二:直接修改代码后推送:
# 修改 .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 分钟限制。
详见 → 云服务器 Web 界面访问指南
涵盖:直接部署和 Docker 两种方式的启动与访问、安全组/防火墙配置、常见问题排查、Nginx 反向代理(可选)。
祝部署顺利!🎉